00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00029 #ifndef DATABASE_H_
00030 #define DATABASE_H_
00031
00032
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <string.h>
00036 #include <vector>
00037 #include <map>
00038
00039 #include "FlyLegacy.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 class CDatabaseField {
00050 public:
00051
00052 CDatabaseField (void);
00053
00054
00055 char GetType (void);
00056 unsigned long GetLength (void);
00057 void GetString (char *s);
00058 double GetDouble (void);
00059 long GetInt (void);
00060 void Format (char *s);
00061
00062 public:
00063 char type;
00064 unsigned long length;
00065 union {
00066 char charData[256];
00067 double doubleData;
00068 long intData;
00069 } data;
00070 };
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 class CDatabaseTemplateItem {
00083 public:
00084
00085 CDatabaseTemplateItem (void);
00086
00087
00088
00089 public:
00090 Tag id;
00091 unsigned long start;
00092 unsigned long length;
00093 char type;
00094 char name[256];
00095 };
00096
00097 class CDatabaseTemplate {
00098 public:
00099
00100 ~CDatabaseTemplate (void);
00101
00102
00103 void Load (const char* fileName);
00104 int GetNumItems (void);
00105 CDatabaseTemplateItem* GetItem (int i);
00106 void Dump (FILE *f);
00107
00108 protected:
00109
00110 void Load (PODFILE *f);
00111
00112 protected:
00113 std::vector<CDatabaseTemplateItem*> item;
00114 };
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 typedef std::multimap<std::string, unsigned long> StringIndex;
00130 typedef std::multimap<double, unsigned long> DoubleIndex;
00131 typedef std::multimap<long, unsigned long> IntIndex;
00132
00133 class CDatabaseIndex {
00134 public:
00135
00136 CDatabaseIndex (const char* dbiFilename);
00137 ~CDatabaseIndex (void);
00138
00139
00140 int GetNumItems (void);
00141 Tag GetKeyId (void);
00142 char GetKeyType (void);
00143 unsigned long GetKeyLength (void);
00144 unsigned long Search (const char* key);
00145 unsigned long Search (double key);
00146 unsigned long Search (long key);
00147 unsigned long SearchNext (void);
00148 void Dump (FILE *f);
00149
00150 protected:
00151 void Load (PODFILE *f);
00152 void Load (const char *dbiFilename);
00153
00154 protected:
00155 Tag keyId;
00156 unsigned char keyType;
00157 unsigned long keyLength;
00158
00159 std::multimap<std::string, unsigned long> *stringIndex;
00160 std::multimap<double, unsigned long> *doubleIndex;
00161 std::multimap<long, unsigned long> *intIndex;
00162
00163 std::pair<StringIndex::iterator,StringIndex::iterator> stringRange;
00164 std::pair<DoubleIndex::iterator,DoubleIndex::iterator> doubleRange;
00165 std::pair<IntIndex::iterator,IntIndex::iterator> intRange;
00166
00167 StringIndex::iterator stringIter;
00168 DoubleIndex::iterator doubleIter;
00169 IntIndex::iterator intIter;
00170 };
00171
00172
00173
00174
00175
00176
00177
00178 class CDatabaseRecord {
00179 public:
00180
00181 CDatabaseRecord (void);
00182
00183
00184 void SetSequence (unsigned long sequence);
00185 void AddField (CDatabaseField f);
00186 int GetNumFields (void);
00187 CDatabaseField* GetField (unsigned int i);
00188
00189 protected:
00190 unsigned long sequence;
00191 std::vector<CDatabaseField> field;
00192 };
00193
00194 typedef enum {
00195 DB_UNMOUNTED,
00196 DB_MOUNTED
00197 } EDatabaseState;
00198
00199 class CDatabase {
00200 public:
00201
00202 CDatabase (const char* dbtFilename);
00203 ~CDatabase (void);
00204
00205
00206 CDatabaseTemplate* GetTemplate (void);
00207
00208
00209 void AddIndex (const char *dbiFilename);
00210 unsigned int GetNumIndexes (void);
00211 CDatabaseIndex* GetIndex (Tag tag);
00212
00213
00214 void Mount (PODFILE *f);
00215 void Mount (const char *dbdFilename);
00216 void Unmount (void);
00217
00218
00219
00220
00221 void Dump (FILE *f);
00222
00223
00224 unsigned long GetRawRecordLength (void);
00225 unsigned long GetNumRecords (void);
00226 unsigned long GetNumFields (void);
00227 CDatabaseRecord* GetRecordByOffset (unsigned long offset);
00228 unsigned long RecordOffset (unsigned long index);
00229 CDatabaseRecord* GetRecordByIndex (unsigned long index);
00230 unsigned long Search (Tag index, const char* key);
00231 unsigned long Search (Tag index, double key);
00232 unsigned long Search (Tag index, long key);
00233 unsigned long SearchNext (void);
00234 void GetRawRecord (unsigned long offset, char* buffer);
00235
00236 protected:
00237 void LoadTemplate (const char* dbtFilename);
00238
00239 private:
00240
00241 EDatabaseState state;
00242 PODFILE* podfile;
00243 unsigned long signature;
00244 unsigned long nRecords;
00245 unsigned long recLength;
00246
00247 CDatabaseTemplate dbt;
00248 std::vector<CDatabaseIndex*> dbi;
00249
00250 char* recordBuffer;
00251
00252 unsigned long cacheOffset;
00253 CDatabaseRecord* cacheRecord;
00254
00255 CDatabaseIndex* search_index;
00256 };
00257
00258
00259
00260
00261
00262 void ReadLong (PODFILE *f, long *i);
00263 void ReadULong (PODFILE *f, unsigned long *i);
00264 void ReadUShort (PODFILE *f, unsigned short *i);
00265 void ReadUChar (PODFILE *f, unsigned char *i);
00266 void ReadDouble (PODFILE *f, double *i);
00267 void ReadFloat (PODFILE *f, double *i);
00268
00269 char * TabNextField (char *s, char *szField);
00270 char * TabSkipFields (char *s, int nFields);
00271
00272
00273
00274
00275
00276 extern CDatabase* dbAirport;
00277 extern CDatabase* dbAtsRoute;
00278 extern CDatabase* dbComm;
00279 extern CDatabase* dbCountry;
00280 extern CDatabase* dbState;
00281 extern CDatabase* dbIls;
00282 extern CDatabase* dbNavaid;
00283 extern CDatabase* dbObstruct;
00284 extern CDatabase* dbRunway;
00285 extern CDatabase* dbWaypoint;
00286
00287 #endif // DATABASE_H_