Page principale | Liste alphabétique | Liste des classes | Liste des fichiers | Membres de classe | Membres de fichier | Pages associées

DataBase.cpp

Aller à la documentation de ce fichier.
00001 /*! \file DataBase.cpp
00002     \brief Gestion base de données.
00003 
00004     Gestionnaire de base de données avec notion de table et entrée indexé et libélé.
00005 
00006     \author     aerith (www.aerith.fr)
00007     \version    1.0
00008     \date       26/07/2007
00009 */
00010 
00011 #include    "DataBase.h"
00012 
00013 
00014 MUTEX   DataBase::DBMutex;
00015 int     DataBase::DBInstance = 0;
00016 
00017 DataBase::DataBase(char *pRepertoire)
00018 {
00019     if(!DBInstance)
00020         MutexInit(&DBMutex);
00021 
00022     DBInstance++;
00023 
00024     strncpy(Repertoire, pRepertoire, DB_REPERTOIRE);
00025     NbTable     = 0;
00026     IdMax       = 0;
00027 
00028     LoadTables();
00029 }
00030 
00031 DataBase::~DataBase()
00032 {
00033     for(int i = 0; i < NbTable; i++)
00034         delete Tables[i];
00035     Tables.clear();
00036 
00037     DBInstance--;
00038 
00039     if(!DBInstance)
00040         MutexStop(&DBMutex);
00041 }
00042 
00043 int     DataBase::LoadTables()
00044 {
00045     FILE    *Fichier;
00046     int     Id;
00047     int     Size;
00048     char    Name[DB_NAME];
00049     BEGIN
00050     LOC("DataBase::LoadTables");
00051 
00052     MutexLock(&DBMutex);
00053 
00054     sprintf(Name, "%s/DB.sys", Repertoire);
00055     Fichier = fopen(Name, "r");
00056     if(Fichier)
00057     {
00058         for(int i = 0; i < NbTable; i++)
00059             delete Tables[i];
00060         Tables.clear();
00061         NbTable = 0;
00062 
00063         while(!feof(Fichier) && !CERROR)
00064         {
00065             TRY if(fread(&Id, sizeof(int), 1, Fichier))
00066             {
00067                 TRYIF(fread(&Size, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00068                 if(Size > DB_NAME)
00069                     Size = DB_NAME;
00070 
00071                 TRY if(fread(Name, sizeof(char), Size, Fichier))
00072                 {
00073                     Name[Size] = '\0';
00074 
00075                     Tables.push_back(new DataBaseTable(Repertoire, Id, 0, Name));
00076 
00077                     NbTable++;
00078                     IdMax = Id;
00079                 }
00080                 ENDTRY(ERROR_C_DATA_FILE)
00081             }
00082         }
00083 
00084         fclose(Fichier);
00085     }
00086     ENDTRY(ERROR_C_DATA_FILE)
00087 
00088     MutexUnLock(&DBMutex);
00089 
00090     PERROR
00091 
00092     ENDBEGIN
00093 }
00094 
00095 int     DataBase::SaveTables()
00096 {
00097     FILE    *Fichier;
00098     int     i;
00099     int     Id;
00100     int     Size;
00101     char    Name[DB_BUFFERSIZE];
00102     BEGIN
00103 
00104     MutexLock(&DBMutex);
00105 
00106     sprintf(Name, "%s/DB.sys", Repertoire);
00107     Fichier = fopen(Name, "w");
00108     if(Fichier)
00109     {
00110         for(i = 0; i < NbTable; i++)
00111         {
00112             Id = Tables[i]->GetId();
00113             TRYIF(fwrite(&Id, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00114 
00115             strcpy(Name, Tables[i]->GetName());
00116             Size = strlen(Name);
00117             TRYIF(fwrite(&Size, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00118             TRYIF(fwrite(Name, sizeof(char), Size, Fichier), ERROR_C_DATA_FILE)
00119         }
00120 
00121         fclose(Fichier);
00122     }
00123     ENDTRY(ERROR_C_DATA_FILE)
00124 
00125     MutexUnLock(&DBMutex);
00126 
00127     ENDBEGIN
00128 }
00129 
00130 int     DataBase::AddTable(char *pName, int iNbData)
00131 {
00132     Tables.push_back(new DataBaseTable(Repertoire, IdMax + 1, iNbData, pName));
00133     if(!Tables[NbTable])
00134         return ERROR_C_MEMORY;
00135         
00136     IdMax++;
00137     NbTable++;
00138     
00139     return ERROR_C_NOERROR;
00140 }
00141 
00142 int     DataBase::DelTable(int iId)
00143 {
00144     int     i;
00145 
00146     if(NbTable > 0)
00147     {
00148         for(i = 0; i < NbTable; i++)
00149         {
00150             if(Tables[i]->GetId() == iId)
00151             {
00152                 Tables.erase(Tables.begin() + i);
00153 
00154                 NbTable--;
00155 
00156                 return ERROR_C_NOERROR;
00157             }
00158         }
00159     }
00160     
00161     return ERROR_C_NOERROR;
00162 }
00163 
00164 int     DataBase::SaveBase()
00165 {
00166     int     i;
00167     int     j = 0;
00168     char    Name[DB_BUFFERSIZE];
00169     BEGIN
00170 
00171     MutexLock(&DBMutex);
00172 
00173     for(i = 1; (i <= IdMax) && !CERROR; i++)
00174     {
00175         if(Tables[j]->GetId() == i)
00176         {
00177             TRY CERROR = Tables[j]->SaveEntrys();
00178 
00179             j++;
00180         }
00181         else
00182         {
00183             sprintf(Name, "%s/%i.dbt", Repertoire, i);
00184 
00185             FileDelete(Name);
00186         }
00187     }
00188 
00189     MutexUnLock(&DBMutex);
00190 
00191     TRY CERROR = SaveTables();
00192 
00193     ENDBEGIN
00194 }

Généré le Thu Jun 12 09:12:29 2008 pour A.I.F. par  doxygen 1.3.9.1