00001
00002
00003
00004
00005
00006
00007
00008
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 }