Sauvegarde de données. Meilleure methode ???

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Sauvegarde de données. Meilleure methode ???

Message par ThoT »

Bonsoir les amis!

Quelle est selon vous la meilleure methode pour stocker des données dans la cadre d'un programme de gestion de bibliothéque?
J'en suis au tout debut du developpement et comme je ne veux pas me retrouver bloqué à cause d'un systeme de sauvegarde inadapté, je vous demande conseil maintenant :wink:

Je compte referencer un nombre inconnu de livres (10 000 grand max!) pour lesquels j'enregistrerai :
- Titre
- Auteur
- Genre
- Editeur
- Date de parution
- Un résumé
- L'image de couverture (mais c'est pas sur...)
- ...

Donnez moi vos idées SVP

Merci d'avance!!!
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message par venom »

bonjour,

pour ma part quand je doit sauvegarder du texte je me sert des fichiers Preference ( voir la lib :wink: ).

voila pour moi.

ps: voila c'est pas vraiment le meme mais bon j'avais fait sa pour ma liste de dvd :wink: .

http://venompb.free.fr/exe/DvdListe%20Cr%E9ator.exe
voila.



@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@ThoT

Est-ce que tu veux que tes données restent lisibles dans un fichier ou souhaites-tu les crypter?

Si elles restent visibles, la méthode de Venom est bien, sinon tu as le jeu traditionnel de commande de fichiers WriteTypeVariable.

Si elles doivent être cryptées, crée un bloc mémoire avec AllocateMemory(). Utilise le jeu de commande Peek et Poke pour écrire dans ce bloc, tu crypte les données, puis tu les enregistre sur disque avec WriteData. L'avantage de cette méthode c'est que tu peux, en plus compresser les données du bloc mémoire avant de les enregistrer.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Un petit exemple Olivier ??
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Sauvegarde de données. Meilleure methode ???

Message par gnozal »

ThoT a écrit :Bonsoir les amis!
Quelle est selon vous la meilleure methode pour stocker des données dans la cadre d'un programme de gestion de bibliothéque?
La seule alternative valable me semble être une base de données.
- Soit de type dBase comme Cheetah (freeware) : http://www.planetsquires.com/cheetah.htm (des wrappers pour PB sont sur le site)
- Soit relationelle de type SQLite (freeware) : il existe de multiples Include prêts à l'empoi pour PB, comme par exemple http://www.purebasic.fr/english/viewtopic.php?t=27036
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

La lib XML est aussi très adaptée pour stocker ce genre de données :)

EDIT : Oups, oui pour 10000 livres, ça va faire un gros fichier.... tourne-toi plutôt vers les bases de données en effet...
Dernière modification par ATHOW le dim. 12/août/2007 10:21, modifié 1 fois.
pastor
Messages : 54
Inscription : sam. 14/avr./2007 22:59

Message par pastor »

Bonjour Thot,

Moi qui suis en ce moment dans les bases de données avec Purebasic et vu le nombre de lignes : 10000 tout de même, c'est clair qu'il faut une base de données.

Je ne connais pas SQLite, mais par contre je connais bien MySQL et ca marche fantastiquement bien avec Purebasic et pourtant avec Purebasic je suis le roi des débutant.

Si tu veux faire un essai sans te prendre la tête :

1. Récupère sur Internet EasyPHP ou mieux XAMP
2. En 30 secondes c'est installé
3. Copie la librairie libmysql.dll qui se trouve dans le répertoire d'installation de Xampp, d'EasyPHP ou de la distrib que tu as choisi vers le répertoire ..\Purebasic\Compilers
4. Fait un essai de connexion avec ton navigateur sur le serveur MySQL avec l'appli PhpmyAdmin, généralement l'adresse est : http://127.0.0.1/phpmyadmin
5. Toujours dans PhpMyAdmin, crée une table bidon dans la base test pour faire tes tests justement.
6. Utilise ce code que j'ai pompé sur le forum :

Code : Tout sélectionner

#libmysql = 1

host.s    = "127.0.0.1"
user.s    = "root"
passwd.s  = ""
db.s      = "test"
port.l    = 3306

dbHnd.l
SQL.s
row.s
i.l
j.l
affRows.l
fieldNum.l
rowsNum.l

Procedure.s GetError(db_ID,requester)
  
  Protected Errormsg.s, i.l, Error.l
  
  If CallFunction(#libmysql,"mysql_errno",db_ID) > 0
    *Error =CallFunction(#libmysql,"mysql_error",db_ID)
    i=-1
    Repeat
      i=i+1
      Errormsg=Errormsg+PeekS(*Error+i,1)
    Until PeekB(*Error+i)=0
    If requester
      Result= MessageRequester("MySQL error",Errormsg,#PB_MessageRequester_Ok)
    EndIf
  EndIf
  
  ProcedureReturn Errormsg
  
EndProcedure



If OpenLibrary(#libmysql,"libmysql.dll")
  Result=CallFunction(#libmysql,"mysql_init",dbHnd)
  If Result
    dbHnd = Result
    If CallFunction(#libmysql,"mysql_real_connect",dbHnd, host, user, passwd, db, port, "", 0) = 0
      GetError(dbHnd,1)
    Else
      CallDebugger
      SQL = "SELECT * FROM bidon"
      If CallFunction(#libmysql,"mysql_real_query", dbHnd, SQL, Len(SQL))
        GetError(dbHnd,1)
      Else
        *mysqlResult=CallFunction(#libmysql,"mysql_store_result",dbHnd)
        
        ;no result returned
        If *mysqlResult=0
          ;no fields returned means error
          If CallFunction(#libmysql,"mysql_field_count",dbHnd)
            GetError(dbHnd,1)
            ;fields are returned, so no error but query didn't return data
          Else
            
          EndIf
          ;results are returned
        Else
          
          
          affRows   = CallFunction(#libmysql,"mysql_affected_rows",dbHnd)
          fieldNum  = CallFunction(#libmysql,"mysql_num_fields",*mysqlResult)
          rowsNum   = CallFunction(#libmysql,"mysql_num_rows",*mysqlResult)
          
          Debug affRows
          Debug fieldNum
          Debug rowsNum
          
          
          For i=1 To rowsNum
            *mysqlRow=CallFunction(#libmysql,"mysql_fetch_row",*mysqlResult)
            *mysqlLen=CallFunction(#libmysql,"mysql_fetch_lengths",*mysqlResult)
            
            row = ""
            
            ;length of given field
            For j=1 To fieldNum
              length=PeekL(*mysqlLen+4*(j-1))
              fieldptr=PeekL(*mysqlRow+4*(j-1))
              If fieldptr>0
                content.s=PeekS(fieldptr,length)
              Else
                ;zero pointer returend means empty field
                content="NULL"
              EndIf
              row = row + content + ";"
            Next j
            
            Debug row
            
          Next i
          Result.l=CallFunction(#libmysql,"mysql_free_result",*mysqlResult)
        EndIf
      EndIf
    EndIf
  EndIf
Else
  MessageRequester("Error!", "Couldn't open the libmysql.dll!")
EndIf
Le plus important c'est cette ligne : SQL = "SELECT * FROM bidon" c'est la que tu mets toutes les commandes que tu veux faire sur tes données.

Cerise sur le gateau, ta base est simultanément accessible depuis ton appli Purebasic et sur Internet avec le navigateur :D

Voila, si pour une fois je peux aider quelqu'un sur ce forum...

Laurent
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message par ThoT »

Merci pour ces reponses interessantes!

Les bases de données me plairaient bien si il ne fallait pas les installer avant.
C'est un programme portable que je veux faire : je copie l'executable sur le PC, je le lance et ca roule!

J'ai vu des logiciels qui enregistraient les données dans leur executable.
Est ce que c'est possible en PB ?

Parce que je ne veux pas un programme qui epartpille les données dans differents fichiers txt ou autres.
Jeff
Messages : 72
Inscription : sam. 13/mai/2006 18:09

Message par Jeff »

As-tu regarder SQLite, il y a un post de Gnozal sur le sujet qui pointe vers le forum anglais.

http://www.purebasic.fr/english/viewtop ... c&start=30

Avec SQlite pas de base à installer si ce n'est la dll. Ce qui reste malgré tout portable.

JF
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

même pour 10 000 enregistrements - en local - XML est viable.

ceci dit si tu as besoin de faire des recherches sur auteur, genre, année etc... SQLite sera plus adapté et plus économe en mémoire vive.

ou alors si tu veux les données DANS l'exécutable, mais en LECTURE SEULE tu peux utiliser les DataSection. mais attention la taille de l'exé va être importante, ainsi que la mémoire vive utilisée...

un exemple via les DataSection pour de petites listes en lecture seule en interne dans l'exécutable.

Code : Tout sélectionner

;=============================================================
;=============================================================
;=============================================================

Enumeration 0 
  #BIBLIOTHEQUE_FILM
  #BIBLIOTHEQUE_LIVRE
  #BIBLIOTHEQUE_FIN
EndEnumeration

;=============================================================
;=============================================================
;=============================================================

Structure BIBLIOTHEQUE_FILM
  titre_vo.s
  titre_vf.s
  auteur.s
  genre.s
  parution.s
  resume.s
EndStructure

Structure BIBLIOTHEQUE_LIVRE
  isbn.s
  titre_vo.s
  titre_vf.s
  auteur.s
  genre.s
  parution.s
  resume.s
EndStructure

;=============================================================
;=============================================================
;=============================================================

NewList film.BIBLIOTHEQUE_FILM()
NewList livre.BIBLIOTHEQUE_LIVRE()

;=============================================================
;=============================================================
;=============================================================

Restore MaBibliotheque

Repeat
  
  Read type
  
  Select type
    
    Case #BIBLIOTHEQUE_FILM
      
      If AddElement(film())
        With film()
          Read \titre_vo
          Read \titre_vf
          Read \auteur
          Read \genre
          Read \parution
          Read \resume
        EndWith
      EndIf
      
    Case #BIBLIOTHEQUE_LIVRE
      
      If AddElement(livre())
        With livre()
          Read \isbn
          Read \titre_vo
          Read \titre_vf
          Read \auteur
          Read \genre
          Read \parution
          Read \resume
        EndWith
      EndIf
      
    Case #BIBLIOTHEQUE_FIN
      
      Break
      
  EndSelect
  
ForEver

;=============================================================
;=============================================================
;=============================================================

Debug "Liste des films :"

ForEach film()
  Debug film()\titre_vf
  Debug film()\parution
Next

Debug "Liste des livres :"

ForEach livre()
  Debug livre()\titre_vf
  Debug livre()\parution
Next

;=============================================================
;=============================================================
;=============================================================

DataSection
  
  MaBibliotheque:
  
  Data.l #BIBLIOTHEQUE_LIVRE
  Data.s "2070541274"
  Data.s "Harry Potter and the Philosopher's Stone"
  Data.s "Harry Potter à l'école des sorciers"
  Data.s "J. K. Rowling"
  Data.s "Fantastique"
  Data.s "1997"
  Data.s ""
  
  Data.l #BIBLIOTHEQUE_LIVRE
  Data.s "2070541290"
  Data.s "Harry Potter and the Chamber of Secrets"
  Data.s "Harry Potter et la chambre des secrets"
  Data.s "J. K. Rowling"
  Data.s "Fantastique"
  Data.s "1998"
  Data.s ""
  
  Data.l #BIBLIOTHEQUE_LIVRE
  Data.s "2070541304"
  Data.s "Harry Potter and the Prisoner of Azkaban"
  Data.s "Harry Potter et le prisonnier d'Azkaban"
  Data.s "J. K. Rowling"
  Data.s "Fantastique"
  Data.s "1999"
  Data.s ""
  
  Data.l #BIBLIOTHEQUE_LIVRE
  Data.s "2070543587"
  Data.s "Harry Potter and the Goblet of Fire"
  Data.s "Harry Potter et la coupe de feu"
  Data.s "J. K. Rowling"
  Data.s "Fantastique"
  Data.s "2000"
  Data.s ""
  
  Data.l #BIBLIOTHEQUE_LIVRE
  Data.s "2070556859"
  Data.s "Harry Potter and the Order of the Phoenix"
  Data.s "Harry Potter et l'Ordre du phénix"
  Data.s "J. K. Rowling"
  Data.s "Fantastique"
  Data.s "2003"
  Data.s ""
  
  Data.l #BIBLIOTHEQUE_LIVRE
  Data.s "2070572676"
  Data.s "Harry Potter And the Half-Blood Prince"
  Data.s "Harry Potter et le Prince de sang-mêlé"
  Data.s "J. K. Rowling"
  Data.s "Fantastique"
  Data.s "2005"
  Data.s ""
  
  Data.l #BIBLIOTHEQUE_LIVRE
  Data.s "0747591059"
  Data.s "Harry Potter and the Deathly Hallows"
  Data.s "Harry Potter et les Reliques de la Mort"
  Data.s "J. K. Rowling"
  Data.s "Fantastique"
  Data.s "2007"
  Data.s ""

  Data.l #BIBLIOTHEQUE_FILM
  Data.s "Star Wars: a New Hope"
  Data.s "Épisode IV - Un nouvel espoir"
  Data.s "George Lucas"
  Data.s "Science Fiction"
  Data.s "1977"
  Data.s ""

  Data.l #BIBLIOTHEQUE_FILM
  Data.s "The Empire Strikes Back"
  Data.s "Épisode V - L'Empire contre-attaque"
  Data.s "Irvin Kershner"
  Data.s "Science Fiction"
  Data.s "1980"
  Data.s ""

  Data.l #BIBLIOTHEQUE_FILM
  Data.s "Return of the Jedi"
  Data.s "Épisode VI - Le Retour du Jedi"
  Data.s "Richard Marquand"
  Data.s "Science Fiction"
  Data.s "1983"
  Data.s ""

  Data.l #BIBLIOTHEQUE_FILM
  Data.s "The Phantom Menace"
  Data.s "Épisode I - La Menace fantôme"
  Data.s "George Lucas"
  Data.s "Science Fiction"
  Data.s "1999"
  Data.s ""

  Data.l #BIBLIOTHEQUE_FILM
  Data.s "Attack of the Clones"
  Data.s "Épisode II - L'Attaque des clones"
  Data.s "George Lucas"
  Data.s "Science Fiction"
  Data.s "2002"
  Data.s ""

  Data.l #BIBLIOTHEQUE_FILM
  Data.s "Revenge of the Sith"
  Data.s "Épisode III - La Revanche des Sith"
  Data.s "George Lucas"
  Data.s "Science Fiction"
  Data.s "2005"
  Data.s ""
  
  Data.l #BIBLIOTHEQUE_FIN
  
EndDataSection

;=============================================================
;=============================================================
;=============================================================
Image
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

10 000 réf de livre dans un exe, ça va être très lourd et très encombrant dans la mémoire.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@ThoT & Ar-S

Pour exemple, je vous renvoie sur mon joujou!

TreeGadget, c'est 'ludique'!

Pour la compatibilité à venir, ben là... il n'y a pas de mots... Vous avez été servi comme au resto **** 8)
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message par ThoT »

@ Flype :
Pourrai tu faire un exemple d'utilisation du xml pour sauvegarder des données s'il te plait? Une sorte de tuto sur le xml avec purebasic...
Vu comment tu a l'air de gérer la chose, ca ne devrait pas te poser de gros probléme :wink:
Merci par avance! :lol:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

je n'ai pas trop le temps de te faire un tuto d'autant que je ne me suis pas encore vraiment fait aux nouvelles fonctions xml de purebasic...
Image
ThoT
Messages : 33
Inscription : mar. 20/mars/2007 17:51

Message par ThoT »

J'ai le temps, ce n'est pas urgent... :lol:

Edit : Je viens de pas mal me documenter sur le xml en général (structure, parser,...) et je commence à y voir un peu plus clair (ca a l'air vachement pratique pour ranger des données proprement!!! :P ).
Maintenant le souci va etre de creer mon propre fichier xml avec mes propres elements (balises). J'ai regardé dans l'aide pour tout ca, je vois comment créer le fichier mais je ne vois pas comment definir le nom de mes elements...
@Flype : A l'aiiiiiiiiiiiide!!!! :(
Répondre