00001 /*! \file DataBaseTable.h 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 01/11/2007 00009 */ 00010 00011 #ifndef INCLUDE_RSRC_DB_TABLE 00012 #define INCLUDE_RSRC_DB_TABLE 00013 00014 #include "../Tools/Tools.h" 00015 #include "../Surcouche/SurcoucheMultitache.h" 00016 #include "DataBaseEntry.h" 00017 #include <stdio.h> 00018 #include <stdlib.h> 00019 00020 #define DB_BUFFERSIZE 10240 /*!< Taille buffer de travaille. */ 00021 #define DB_REPERTOIRE 256 /*!< Taille max du nom du repertoire de la base. */ 00022 #define DB_NAME 32 /*!< Taille max du nom de la table. */ 00023 00024 //! Gestion d'une table. 00025 /*! Gestion d'une table dans la base de données \a DataBase. 00026 */ 00027 class DataBaseTable 00028 { 00029 private : 00030 char Repertoire[DB_REPERTOIRE]; /*!< Repertoire où ce trouve la base. */ 00031 int Id; /*!< Id de la table. */ 00032 char Name[DB_NAME]; /*!< Nom de la table. */ 00033 int NbData; /*!< Nombre de data dans une entrée. */ 00034 std::vector<char *> Labels; /*!< Chaque ligne est un label. */ 00035 int NbEntry; /*!< Nombre d'entrée dans la table. */ 00036 std::vector<DataBaseEntry *> Entrys; /*!< Chaque ligne est une entrée. */ 00037 int IdMax; /*!< Id maximum des entrée de la table. */ 00038 int AllocSize; /*!< Nombre d'entrée allouée. */ 00039 static int DBTableCount; /*!< Compte les instance de la class. */ 00040 static MUTEX DBMutexTable; /*!< Utiliser des que l'on accede à un fichier "DB.sys". */ 00041 00042 //! Charge le fichier des entrées. 00043 /*! Charge le fichier "x.dbt", d'info sur les entrées et la table. 00044 \return code d'erreur 00045 */ 00046 int LoadEntrys(); 00047 00048 public : 00049 /*! Charge la table en mémoire avec des paramétres par defauts. 00050 \param pRepertoire repertoire de la base. 00051 \param iId Id de la table. 00052 \param iNbData nombre de champs. 00053 \param pName nom de la table. 00054 */ 00055 DataBaseTable(char *pRepertoire, int iId, int iNbData = 0, char *pName = NULL); 00056 00057 /*! Sauve la table dans un fichier. 00058 */ 00059 ~DataBaseTable(); 00060 00061 //! Ajoute une entrée. 00062 /*! Ajoute une entrée avec un nouvelle Id. 00063 \return Code d'erreur. 00064 \sa DelEntry(), GetEntry() et GetNbEntry(). 00065 */ 00066 int AddEntry(); 00067 00068 //! Supprime une entrée. 00069 /*! Supprime l'entrée ayant l'id \a iId. 00070 \param iId Id de l'entrée. 00071 \return Code d'erreur. 00072 \sa AddEntry() et GetNbEntry(). 00073 */ 00074 int DelEntry(int iId); 00075 00076 //! Retourne une entrée. 00077 /*! Permet l'acces à l'entrée ayant l'id \a iId. 00078 \param iId Id de l'entrée. 00079 \return pointeur sur la classe \a DataBaseEntry de l'entrée. 00080 \sa GetEntryNo(). 00081 */ 00082 inline DataBaseEntry *GetEntry(int iId) 00083 { 00084 for(int i = 0; i < NbEntry; i++) 00085 { 00086 if(Entrys[i]->GetId() == iId) 00087 return Entrys[i]; 00088 } 00089 00090 return NULL; 00091 }; 00092 00093 //! Retourne une entrée. 00094 /*! Permet l'acces à l'entrée étant a la position \a iPos. 00095 \param iPos position de l'entrée. 00096 \return pointeur sur la classe \a DataBaseEntry de l'entrée. 00097 \sa GetEntry(). 00098 */ 00099 inline DataBaseEntry *GetEntryNo(int iPos) 00100 { 00101 if(iPos < NbEntry) 00102 return Entrys[iPos]; 00103 00104 return NULL; 00105 }; 00106 00107 //! Retourne l'id d'une entrée. 00108 /*! Retourne l'id de l'entrée étant a la position \a iPos. 00109 \param iPos position de l'entrée. 00110 \return Id de l'entrée. 00111 */ 00112 inline int GetEntryId(int iPos) 00113 { 00114 if(iPos < NbEntry) 00115 return Entrys[iPos]->GetId(); 00116 00117 return 0; 00118 }; 00119 00120 //! Retourne une data d'une entrée. 00121 /*! Permet l'acces à la data à la position \a iPos de l'entrée ayant l'id \a iId. 00122 \param iId Id de l'entrée. 00123 \param iPos position du label. 00124 \return pointeur sur la classe \a DataBaseData de la data. 00125 \sa GetDataNo(). 00126 */ 00127 inline DataBaseData *GetData(int iId, int iPos) 00128 { 00129 if(iPos < NbData) 00130 { 00131 for(int i = 0; i < NbEntry; i++) 00132 { 00133 if(Entrys[i]->GetId() == iId) 00134 return Entrys[i]->GetData(iPos); 00135 } 00136 } 00137 00138 return NULL; 00139 }; 00140 00141 //! Retourne une data d'une entrée. 00142 /*! Permet l'acces à la data de label \a pName de l'entrée ayant l'id \a iId. 00143 \param iId Id de l'entrée. 00144 \param pName nom du label. 00145 \return pointeur sur la classe \a DataBaseData de la data. 00146 \sa GetDataNo(). 00147 */ 00148 inline DataBaseData *GetData(int iId, char *pName) 00149 { 00150 for(int i = 0; i < NbEntry; i++) 00151 { 00152 if(Entrys[i]->GetId() == iId) 00153 { 00154 for(int j = 0; j < NbData; j++) 00155 { 00156 if(!strcmp(Labels[j], pName)) 00157 return Entrys[i]->GetData(j); 00158 } 00159 } 00160 } 00161 00162 return NULL; 00163 }; 00164 00165 //! Retourne une data d'une entrée. 00166 /*! Permet l'acces à la data à la position \a iPos de l'entrée étant à la position \a iPos. 00167 \param iPos position de l'entrée. 00168 \param iPos2 position du label. 00169 \return pointeur sur la classe \a DataBaseData de la data. 00170 \sa GetData(). 00171 */ 00172 inline DataBaseData *GetDataNo(int iPos, int iPos2) 00173 { 00174 if((iPos < NbEntry) && (iPos2 < NbData)) 00175 return Entrys[iPos]->GetData(iPos2); 00176 00177 return NULL; 00178 }; 00179 00180 //! Retourne une data d'une entrée. 00181 /*! Permet l'acces à la data de label \a pName de l'entrée étant à la position \a iPos. 00182 \param iPos position de l'entrée. 00183 \param pName nom du label. 00184 \return pointeur sur la classe \a DataBaseData de la data. 00185 \sa GetData(). 00186 */ 00187 inline DataBaseData *GetDataNo(int iPos, char *pName) 00188 { 00189 if(iPos < NbEntry) 00190 { 00191 for(int i = 0; i < NbData; i++) 00192 { 00193 if(!strcmp(Labels[i], pName)) 00194 return Entrys[iPos]->GetData(i); 00195 } 00196 } 00197 00198 return NULL; 00199 }; 00200 00201 //! Retourne le nombre d'entrée. 00202 /*! Retourne le nombre d'entrée contenu dans la table. 00203 \return nombre d'entrée dans la table. 00204 \sa AddEntry(), DelEntry(), GetEntryNo() et GetEntry(). 00205 */ 00206 inline int GetNbEntry() 00207 { 00208 return NbEntry; 00209 }; 00210 00211 //! Retourne l'id de la table. 00212 /*! Retourne l'id \a Id de la table. 00213 \return l'id \a Id de la table. 00214 \sa GetNbEntry(). 00215 */ 00216 inline int GetId() 00217 { 00218 return Id; 00219 }; 00220 00221 //! Retourne le nom de la table. 00222 /*! Retourne le nom \a Name de la table. 00223 \return un pointeur sur le nom \a Name de la table. 00224 \sa SetName(). 00225 */ 00226 inline char *GetName() 00227 { 00228 return Name; 00229 }; 00230 00231 //! Définie le nom de la table. 00232 /*! Définie le nom \a Name de la table. 00233 \param pName nom de la table. 00234 \return un pointeur sur le nom \a Name de la table. 00235 \sa GetName(). 00236 */ 00237 inline char *SetName(char *pName) 00238 { 00239 return strncpy(Name, pName, DB_NAME); 00240 }; 00241 00242 //! Retourne le nombre de data d'une entrée. 00243 /*! Retourne le nombre de data \a NbData d'une entrée de la table. 00244 \return le nombre de data d'une entrée de la table. 00245 */ 00246 inline int GetNbData() 00247 { 00248 return NbData; 00249 }; 00250 00251 //! Ajoute un label. 00252 /*! Ajoute le label \a pName à la table. 00253 \param pName nom du label. 00254 \return Code d'erreur. 00255 \sa DelLabel(). 00256 */ 00257 int AddLabel(char *pName); 00258 00259 //! Supprimse un label. 00260 /*! Supprime le label \a pName de la table. 00261 \param pName nom du label. 00262 \return Code d'erreur. 00263 \sa AddLabel(). 00264 */ 00265 int DelLabel(char *pName); 00266 00267 //! Retourne le nom d'un champ. 00268 /*! Retourne le nom du champ à la position \a iPos. 00269 \param iPos position du champ. 00270 \return un pointeur sur le nom du champ. 00271 \sa SetLabel(). 00272 */ 00273 inline char *GetLabel(int iPos) 00274 { 00275 if(iPos < NbData) 00276 return Labels[iPos]; 00277 00278 return NULL; 00279 }; 00280 00281 //! Définie le nom d'un champ. 00282 /*! Définie le nom du champ à la position \a iPos. 00283 \param iPos position du champ. 00284 \param pName nom du champ. 00285 \return un pointeur sur le nom du champ. 00286 \sa GetLabel(). 00287 */ 00288 char *SetLabel(int iPos, char *pName); 00289 00290 //! Sauve le fichier des entrées. 00291 /*! Sauve le fichier "x.dbt", d'info sur les entrées et la table. 00292 \return code d'erreur 00293 */ 00294 int SaveEntrys(); 00295 }; 00296 00297 #endif 00298