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

DataBaseTable.cpp

Aller à la documentation de ce fichier.
00001 /*! \file DataBaseTable.cpp
00002     \brief Gestion base de données.
00003 
00004     Gestion d'une table dans la base de données \a DataBase.
00005 
00006     \author     aerith (www.aerith.fr)
00007     \version    1.0
00008     \date       26/07/2007
00009 */
00010 
00011 #include    "DataBaseTable.h"
00012 
00013 
00014 MUTEX   DataBaseTable::DBMutexTable;
00015 int     DataBaseTable::DBTableCount = 0;
00016 
00017 DataBaseTable::DataBaseTable(char *pRepertoire, int iId, int iNbData, char *pName)
00018 {
00019     strncpy(Repertoire, pRepertoire, DB_REPERTOIRE);
00020     Id      = iId;
00021     NbData  = iNbData;
00022     NbEntry = 0;
00023     IdMax   = 0;
00024 
00025     for(int i = 0; i < NbData; i++)
00026     {
00027         Labels.push_back(new char[5]);
00028         sprintf(Labels[i], "%i", i);
00029     }
00030 
00031     if(pName)
00032         strncpy(Name, pName, DB_NAME);
00033 
00034     if(!DBTableCount)
00035         MutexInit(&DBMutexTable);
00036 
00037     DBTableCount++;
00038 
00039     LoadEntrys();
00040 }
00041 
00042 DataBaseTable::~DataBaseTable()
00043 {
00044     int     i;
00045 
00046     for(i = 0; i < NbEntry; i++)
00047         delete Entrys[i];
00048     Entrys.clear();
00049 
00050     for(i = 0; i < NbData; i++)
00051         delete [] Labels[i];
00052     Labels.clear();
00053 
00054     DBTableCount--;
00055 
00056     if(!DBTableCount)
00057         MutexStop(&DBMutexTable);
00058 }
00059 
00060 int     DataBaseTable::LoadEntrys()
00061 {
00062     FILE    *Fichier;
00063     int     EntryId;
00064     int     Size;
00065     char    Name[DB_BUFFERSIZE];
00066     int     i, j;
00067     BEGIN
00068     LOC("DataBaseTable::LoadEntrys");
00069 
00070     sprintf(Name, "%s/%i.dbt", Repertoire, Id);
00071 
00072     MutexLock(&DBMutexTable);
00073 
00074     Fichier = fopen(Name, "r");
00075     if(Fichier)
00076     {
00077         for(i = 0; i < NbData; i++)
00078             delete [] Labels[i];
00079         Labels.clear();
00080 
00081         TRYIF(fread(&NbData, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00082 
00083         for(i = 0; (i < NbData) && !CERROR; i++)
00084         {
00085             TRYIF(fread(&Size, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00086 
00087             if(Size)
00088             {
00089                 TRYIF(fread(Name, sizeof(char), Size, Fichier), ERROR_C_DATA_FILE)
00090                 TRY Name[Size] = '\0';
00091 
00092                 TRY Labels.push_back(new char[Size + 1]);
00093                 TRY strcpy(Labels.back(), Name);
00094             }
00095         }
00096 
00097         for(i = 0; i < NbEntry; i++)
00098             delete Entrys[i];
00099         Entrys.clear();
00100 
00101         TRYIF(fread(&NbEntry, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00102 
00103         i = 0;
00104         while(!feof(Fichier) && !CERROR)
00105         {
00106             TRY if(fread(&EntryId, sizeof(int), 1, Fichier))
00107             {
00108                 Entrys.push_back(new DataBaseEntry(EntryId, NbData));
00109 
00110                 for(j = 0; (j < NbData) && !CERROR; j++)
00111                 {
00112                     TRYIF(fread(&Size, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00113 
00114                     if(Size)
00115                     {
00116                         char    Data[Size];
00117 
00118                         TRY if(fread(Data, sizeof(char), Size, Fichier))
00119                             Entrys.back()->GetData(j)->SetData(Data, Size);
00120                         ENDTRY(ERROR_C_DATA_FILE)
00121                     }
00122                 }
00123 
00124                 i++;
00125                 IdMax = EntryId;
00126             }
00127         }
00128 
00129         TRY if(i != NbEntry)
00130             CERROR = ERROR_C_UNKNOW;
00131 
00132         fclose(Fichier);
00133     }
00134     ENDTRY(ERROR_C_DATA_FILE)
00135 
00136     MutexUnLock(&DBMutexTable);
00137 
00138     PERROR
00139 
00140     ENDBEGIN
00141 }
00142 
00143 int     DataBaseTable::SaveEntrys()
00144 {
00145     FILE    *Fichier;
00146     char    Buffer[DB_BUFFERSIZE];
00147     int     i, j;
00148     int     Size;
00149     int     EntryId;
00150     BEGIN
00151 
00152     sprintf(Buffer, "%s/%i.dbt", Repertoire, Id);
00153 
00154     MutexLock(&DBMutexTable);
00155 
00156     Fichier = fopen(Buffer, "w");
00157     if(Fichier)
00158     {
00159         TRYIF(fwrite(&NbData, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00160 
00161         for(i = 0; (i < NbData) && !CERROR; i++)
00162         {
00163             Size = strlen(Labels[i]);
00164 
00165             TRYIF(fwrite(&Size, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00166 
00167             if(Size)
00168             {
00169                 TRYIF(fwrite(Labels[i], sizeof(char), Size, Fichier), ERROR_C_DATA_FILE)
00170             }
00171         }
00172 
00173         TRYIF(fwrite(&NbEntry, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00174 
00175         if(NbEntry)
00176         {
00177             for(i = 0; i < NbEntry; i++)
00178             {
00179                 EntryId = Entrys[i]->GetId();
00180 
00181                 TRYIF(fwrite(&EntryId, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00182 
00183                 for(j = 0; j < NbData; j++)
00184                 {
00185                     Size = Entrys[i]->GetData(j)->GetSize();
00186 
00187                     TRYIF(fwrite(&Size, sizeof(int), 1, Fichier), ERROR_C_DATA_FILE)
00188 
00189                     if(Size)
00190                     {
00191                         TRYIF(fwrite(Entrys[i]->GetData(j)->GetData(), sizeof(char), Size, Fichier), ERROR_C_DATA_FILE)
00192                     }
00193                 }
00194             }
00195         }
00196 
00197         fclose(Fichier);
00198     }
00199     ENDTRY(ERROR_C_DATA_FILE)
00200 
00201     MutexUnLock(&DBMutexTable);
00202 
00203     ENDBEGIN
00204 }
00205 
00206 int     DataBaseTable::AddEntry()
00207 {
00208     Entrys.push_back(new DataBaseEntry(++IdMax, NbData));
00209 
00210     if(!Entrys[NbEntry])
00211         return ERROR_C_MEMORY;
00212         
00213     NbEntry++;
00214     
00215     return ERROR_C_NOERROR;
00216 }
00217 
00218 int     DataBaseTable::DelEntry(int iId)
00219 {
00220     int     i;
00221 
00222     if(NbEntry > 0)
00223     {
00224         for(i = 0; i < NbEntry; i++)
00225         {
00226             if(Entrys[i]->GetId() == iId)
00227             {
00228                 Entrys.erase(Entrys.begin() + i);
00229 
00230                 NbEntry--;
00231 
00232                 return ERROR_C_NOERROR;
00233             }
00234         }
00235     }
00236     
00237     return ERROR_C_NOERROR;
00238 }
00239 
00240 int     DataBaseTable::AddLabel(char *pName)
00241 {
00242     int     i, f = 0;
00243     BEGIN
00244     
00245     for(i = 0; (i < NbData) && !f; i++)
00246         if(!strcmp(pName, Labels[i]))
00247             f = 1;
00248 
00249     if(!f)
00250     {
00251         i = strlen(pName);
00252         Labels.push_back(new char[i + 1]);
00253         
00254         if(!Labels[NbData])
00255             CERROR = ERROR_C_MEMORY;
00256         else
00257         {
00258             strncpy(Labels.back(), pName, i);
00259 
00260             for(i = 0; (i < NbEntry) && !CERROR; i++)
00261             {
00262                 TRY CERROR = Entrys[i]->AddData();
00263             }
00264 
00265             NbData++;
00266         }
00267     }
00268 
00269     ENDBEGIN;
00270 }
00271 
00272 
00273 int     DataBaseTable::DelLabel(char *pName)
00274 {
00275     int     i, j;
00276 
00277     for(i = 0; i < NbData; i++)
00278     {
00279         if(!strcmp(Labels[i], pName))
00280         {
00281             Labels.erase(Labels.begin() + i);
00282 
00283             for(j = 0; j < NbEntry; Entrys[j++]->DelData(i));
00284 
00285             NbData--;
00286         }
00287     }
00288 
00289     return ERROR_C_NOERROR;
00290 }
00291 
00292 char    *DataBaseTable::SetLabel(int iPos, char *pName)
00293 {
00294     int     i, f = 0;
00295 
00296     if(iPos < NbData)
00297     {
00298         for(i = 0; (i < NbData) && !f; i++)
00299             if((i != iPos) && !strcmp(pName, Labels[i]))
00300                 f = 1;
00301 
00302         if(!f)
00303         {
00304             delete [] Labels[iPos];
00305             Labels[iPos] = new char[strlen(pName) + 1];
00306             return strcpy(Labels[iPos], pName);
00307         }
00308     }
00309 
00310     return NULL;
00311 }

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