Re: SQlite et champs BLOB
Publié : lun. 04/mars/2019 17:06
Et voila la version complète, avec la version de ShowMedia() modifiée pour lire les blobs
(d'après les explication du PB survival guide, chapitre 13.6 http://www.ninelizards.com/purebasic/purebasic%2013.htm)
On se sert de DatabaseColumnSize() pour définir la quantité de mémoire à allouer lors de la lecture.
Je ne suis pas assez doué pour avoir imaginé toutes ces modifications
Désolé d'avoir un peu abîmé le code initial
J'ai surement mal fait des trucs car je manipule encore mal les pointeurs (seulement 10 ans que je pratique PB)
(d'après les explication du PB survival guide, chapitre 13.6 http://www.ninelizards.com/purebasic/purebasic%2013.htm)
On se sert de DatabaseColumnSize() pour définir la quantité de mémoire à allouer lors de la lecture.
Je ne suis pas assez doué pour avoir imaginé toutes ces modifications
Code : Tout sélectionner
; PureBasic 5.70 LTS (x64)
; By Falsam 2015
; Code rechapé by Marc56 2019
; Remplacement encodage64 par requêtes préparées pour déversement direct des données images en binaire dans le champs blob
; Nécessite PB >= 5.40 LTS
EnableExplicit
Enumeration
#DataBase
#ImageFile
#Buffer
EndEnumeration
Enumeration Window
#MainForm
EndEnumeration
Enumeration Gadget
#Selector
EndEnumeration
;Plan du code
Declare Start() ;Début
Declare ShowMedia(LastSequence = #False) ;Affichage d'une ou des images
Declare OnSelectMedia() ;Sélection d'une image
Declare OnDeleteMedia() ;Suppression d'une image
Declare OnClose() ;Fin
Start()
Procedure Start()
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseSQLiteDatabase()
OpenDatabase(#DataBase, "assets.sqlite", "","", #PB_Database_SQLite)
OpenWindow(#MainForm, 0, 0, 800, 600, "SQLite et les champs de type BLOB", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
ButtonGadget(#Selector, 10, 10, 180, 32, "Sélectionner une image")
ShowMedia() ;Affichage de toutes les images
;Evenements
BindEvent(#PB_Event_CloseWindow, @OnClose())
BindGadgetEvent(#Selector, @OnSelectMedia())
Repeat : WaitWindowEvent(10) : ForEver
EndProcedure
;Affichage de la derniere image ou toutes les images
Procedure ShowMedia(LastSequence = #False)
Protected Window, IdMedia, FileName.s, *Buffer, Result, Gadget
Protected PictureSize, i
If LastSequence = #True
;Selection de la derniere image
DatabaseQuery(#DataBase, "SELECT IdMedia, image, filename FROM Medias ORDER BY IdMedia DESC LIMIT 1")
Else
;Selection de toutes les images
DatabaseQuery(#DataBase, "SELECT IdMedia, image, filename FROM Medias")
EndIf
;Affichage du resultat : Chaque image est affichée dans une fenetre
While NextDatabaseRow(#Database)
i + 1
Debug "Image #" + i
IdMedia = GetDatabaseLong(#Database, 0)
PictureSize = DatabaseColumnSize(#Database, 1)
If PictureSize = 0 : Break : EndIf
*Buffer = AllocateMemory (PictureSize)
PictureSize = GetDatabaseBlob (#Database, 1, *Buffer, MemorySize(*Buffer))
FileName = GetDatabaseString (#DataBase, 2)
CatchImage(#Buffer, *Buffer)
Window = OpenWindow(#PB_Any, 0, 0, ImageWidth(#Buffer), ImageHeight(#Buffer) + 50, FileName, #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
ImageGadget(#PB_Any, 0, 0, 0, 0, ImageID(#Buffer))
;Ajout du bouton de suppression
;Mémorisatio de l'index d'enregistrement
;Initialisation du Callback de suppression
Gadget = ButtonGadget(#PB_Any, 10, ImageHeight(#Buffer) + 10, 80, 22, "Supprimer")
SetGadgetData(Gadget, IdMedia)
BindGadgetEvent(Gadget, @OnDeleteMedia())
StickyWindow(Window, #True)
Wend
EndProcedure
;Selection d'une image
Procedure OnSelectMedia()
Protected Pattern.s = "Image Files (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png"
Protected FileName.s = OpenFileRequester("Sélectionner une image", "", Pattern, 0)
Protected *Buffer
If FileName <> ""
;Lecture et encodage de l'image
If ReadFile(#ImageFile, FileName)
*Buffer = AllocateMemory(Lof(#ImageFile))
ReadData(#ImageFile, *Buffer, Lof(#ImageFile))
CloseFile(#ImageFile)
SetDatabaseBlob (#DataBase, 0, *Buffer, MemorySize(*Buffer))
SetDatabaseString (#DataBase, 1, GetFilePart(FileName))
EndIf
DatabaseUpdate(#DataBase, "INSERT INTO medias (Image, FileName) VALUES (?, ?)")
;Affichage de la DERNIERE image insérée
ShowMedia(#True)
EndIf
EndProcedure
;Suppression d'une image
Procedure OnDeleteMedia()
Protected IdMedia = GetGadgetData(EventGadget())
DatabaseUpdate(#DataBase, "DELETE FROM Medias WHERE IdMedia=" + IdMedia)
If DatabaseError() <> ""
MessageRequester("Information", "Erreur lors de la suppression" + #CRLF$ + DatabaseError())
Else
CloseWindow(EventWindow())
EndIf
EndProcedure
Procedure OnClose()
Protected Window = EventWindow()
Select Window
Case #MainForm
CloseDatabase(#DataBase)
End
Default
CloseWindow(Window)
EndSelect
EndProcedure
J'ai surement mal fait des trucs car je manipule encore mal les pointeurs (seulement 10 ans que je pratique PB)