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