SQlite et champs BLOB

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: SQlite et champs BLOB

Message par Marc56 »

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 :wink:

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
Désolé d'avoir un peu abîmé le code initial :oops:
J'ai surement mal fait des trucs car je manipule encore mal les pointeurs (seulement 10 ans que je pratique PB)

:wink:
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: SQlite et champs BLOB

Message par Ollivier »

@Marc56

Désolé de ne pas avoir répondu si tôt. Sans réseau DSL, je reporte indéfiniment. Pourtant tu y as passé du temps. Je t'indique juste que je n'oublie pas.

@falsam

Est-ce que le problème se résoud, ou bien es-tu toujours contraint de faire une mise à jour des tutoriels ?
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: SQlite et champs BLOB

Message par Marc56 »

Ollivier a écrit :@Marc56
Désolé de ne pas avoir répondu si tôt. Sans réseau DSL, je reporte indéfiniment. Pourtant tu y as passé du temps. Je t'indique juste que je n'oublie pas.
Tu as de la chance, moi qui depuis quelques jours ai l'age du numéro de mon pseudo, ai totalement oublié de quoi je parlais il y a un mois et demi :mrgreen:
Répondre