00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _EYEDB_DATABASE_H
00026 #define _EYEDB_DATABASE_H
00027
00028 #include <eyedb/ObjCache.h>
00029 #include <vector>
00030 #include <map>
00031
00032 namespace eyedb {
00033
00039 class BEQueue;
00040 class ObjCache;
00041 class ExecutableCache;
00042 class Protection;
00043 class SchemaInfo;
00044 class DBProperty;
00045 class Transaction;
00046 class GenHashTable;
00047
00051 class Database : public Struct {
00052
00053
00054
00055
00056 public:
00057
00058 enum OpenFlag {
00059 DBRead = _DBRead,
00060 DBRW = _DBRW,
00061 DBReadLocal = DBRead | _DBOpenLocal,
00062 DBRWLocal = DBRW | _DBOpenLocal,
00063 DBReadAdmin = DBRead | _DBAdmin,
00064 DBRWAdmin = DBRW | _DBAdmin,
00065 DBReadAdminLocal = DBReadAdmin | _DBOpenLocal,
00066 DBRWAdminLocal = DBRWAdmin | _DBOpenLocal,
00067 DBSRead = _DBSRead,
00068 DBSReadLocal = DBSRead | _DBOpenLocal,
00069 DBSReadAdmin = DBSRead | _DBAdmin
00070 };
00071
00077 Database(const char *dbname, const char *dbmdb_str = 0);
00078
00087 Database(Connection *conn,
00088 const char *dbname,
00089 Database::OpenFlag flag = Database::DBRead,
00090 const char *user = 0,
00091 const char *passwd = 0);
00092
00102 Database(Connection *conn,
00103 const char *dbname,
00104 const char *dbmdb_str,
00105 Database::OpenFlag flag = Database::DBRead,
00106 const char *user = 0,
00107 const char *passwd = 0);
00108
00115 Database(const char *dbname, int dbid, const char *dbmdb_str = 0);
00116
00122 Database(int dbid, const char *dbmdb_str = 0);
00123
00128 Database(const Database &db);
00129
00134 virtual Object *clone() const {return new Database(*this);}
00135
00144 Status create(Connection *conn, const char *user = 0,
00145 const char *passwd = 0,
00146 DbCreateDescription *pdbdesc = 0);
00147
00154 Status create(Connection *conn, DbCreateDescription *pdbdesc);
00155
00163 Status remove(Connection *conn, const char *user = 0, const char *passwd = 0);
00164
00171 Status remove(const char *user = 0, const char *passwd = 0);
00172
00181 Status setDefaultDBAccess(Connection *conn, int mode,
00182 const char *user = 0, const char *passwd = 0);
00183
00193 Status setUserDBAccess(Connection *conn, const char *username,
00194 int mode,
00195 const char *user = 0, const char *passwd = 0);
00196
00205 Status getInfo(Connection *conn,
00206 const char *user, const char *passwd, DbInfoDescription *pdbdesc) const;
00207
00215 Status getInfo(const char *user, const char *passwd, DbInfoDescription *pdbdesc) const;
00216
00225 virtual Status open(Connection *conn,
00226 Database::OpenFlag flag = Database::DBRead,
00227 const char *user = 0,
00228 const char *passwd = 0);
00229
00239 virtual Status open(Connection *conn,
00240 Database::OpenFlag flag,
00241 const OpenHints *hints,
00242 const char *user = 0,
00243 const char *passwd = 0);
00244
00249 Status close();
00250
00258 Status rename(const char *newdbname, const char *user = 0, const char *passwd = 0);
00259
00267 Status move(DbCreateDescription *dbdesc, const char *user = 0, const char *passwd = 0);
00268
00278 Status copy(const char *newdbname, Bool newdbid, DbCreateDescription *dbdesc,
00279 const char *user = 0, const char *passwd = 0);
00280
00289 Status rename(Connection *conn, const char *newdbname,
00290 const char *user = 0, const char *passwd = 0);
00291
00300 Status move(Connection *conn, DbCreateDescription *dbdesc,
00301 const char *user = 0, const char *passwd = 0);
00302
00313 Status copy(Connection *conn, const char *newdbname, Bool newdbid,
00314 DbCreateDescription *dbdesc,
00315 const char *user = 0, const char *passwd = 0);
00316
00323 Status containsObject(const Oid &oid, Bool &found);
00324
00331 Status getObjectClass(const Oid &oid, Class *&cl);
00332
00339 Status getObjectClass(const Oid &oid, Oid &cls_oid);
00340
00341
00348 Status setObjectLock(const Oid &oid, LockMode lockmode);
00349
00357 Status setObjectLock(const Oid &oid, LockMode lockmode,
00358 LockMode &alockmode);
00359
00366 Status getObjectLock(const Oid &oid, LockMode &alockmode);
00367
00368
00376 Status loadObject(const Oid &oid, ObjectPtr &o,
00377 const RecMode *recmode = RecMode::NoRecurs);
00378
00379
00387 Status loadObject(const Oid &oid, Object *&o,
00388 const RecMode *recmode = RecMode::NoRecurs);
00389
00398 Status loadObject(const Oid &xoid, ObjectPtr &o,
00399 LockMode lockmode,
00400 const RecMode *recmode = RecMode::NoRecurs);
00401
00410 Status loadObject(const Oid &xoid, Object *&o,
00411 LockMode lockmode,
00412 const RecMode *recmode = RecMode::NoRecurs);
00413
00421 Status reloadObject(const Oid &oid, ObjectPtr &o,
00422 const RecMode *recmode = RecMode::NoRecurs);
00423
00424
00432 Status reloadObject(const Oid &oid, Object *&o,
00433 const RecMode *recmode = RecMode::NoRecurs);
00434
00435
00444 Status reloadObject(const Oid &oid, ObjectPtr &o,
00445 LockMode lockmode,
00446 const RecMode *recmode = RecMode::NoRecurs);
00447
00456 Status reloadObject(const Oid &oid, Object *&o,
00457 LockMode lockmode,
00458 const RecMode *recmode = RecMode::NoRecurs);
00459
00467 Status loadObjects(const OidArray &oid_array, ObjectPtrVector &obj_vect,
00468 const RecMode *recmode = RecMode::NoRecurs);
00469
00477 Status loadObjects(const OidArray &oid_array, ObjectArray &obj_array,
00478 const RecMode *recmode = RecMode::NoRecurs);
00479
00488 Status loadObjects(const OidArray &oid_array, ObjectPtrVector &obj_vect,
00489 LockMode lockmode,
00490 const RecMode *recmode = RecMode::NoRecurs);
00491
00500 Status loadObjects(const OidArray &oid_array, ObjectArray &obj_array,
00501 LockMode lockmode,
00502 const RecMode *recmode = RecMode::NoRecurs);
00503
00510 Status removeObject(const Oid &poid, const RecMode *recmode = RecMode::NoRecurs);
00511
00518 Status isRemoved(const Oid &poid, Bool &isremoved) const;
00519
00529 Status makeObject(const Oid *poid, const ObjectHeader *hdr,
00530 Data idr, Object **o, Bool useCache = False);
00531
00532 Status makeObject_realize(const Oid *, const ObjectHeader *,
00533 Data, Object **,
00534 Bool useCache = False);
00535
00542 Status setObjectProtection(const Oid &obj_oid, const Oid &prot_oid);
00543
00550 Status setObjectProtection(const Oid &obj_oid, Protection *prot);
00551
00558 Status getObjectProtection(const Oid &obj_oid, Oid &prot_oid);
00559
00566 Status getObjectProtection(const Oid &obj_oid, Protection *&prot);
00567
00568
00575 Status getObjectLocations(const OidArray &oid_arr, ObjectLocationArray &locarr);
00576
00583 Status getObjectLocations(const ObjectArray &obj_arr, ObjectLocationArray &locarr);
00584
00591 Status moveObjects(const OidArray &oid_arr, const Dataspace *dataspace);
00592
00599 Status moveObjects(const ObjectArray &obj_arr, const Dataspace *dataspace);
00600
00601
00602
00607 Status transactionBegin();
00608
00614 Status transactionBegin(const TransactionParams ¶ms);
00615
00620 Status transactionBeginExclusive();
00621
00626 Status transactionCommit();
00627
00632 Status transactionAbort();
00633
00638 Transaction *getCurrentTransaction();
00639
00644 Transaction *getRootTransaction();
00645
00650 Bool isInTransaction() const;
00651
00657 Status setDefaultTransactionParams(const TransactionParams ¶ms);
00658
00663 TransactionParams getDefaultTransactionParams();
00664
00669 void setCommitOnClose(Bool commit_on_close);
00670
00675 Bool getCommitOnClose() const {return commit_on_close;}
00676
00681 static void setDefaultCommitOnClose(Bool _def_commit_on_close) {
00682 def_commit_on_close = _def_commit_on_close;
00683 }
00684
00689 static Bool getDefaultCommitOnClose() {return def_commit_on_close;}
00690
00695 const char *getName() const;
00696
00701 int getDbid() const;
00702
00707 int getVersionNumber() const {return version;}
00708
00713 const char *getVersion() const;
00714
00719 Bool isOpened() const;
00720
00725 Database::OpenFlag getOpenFlag() const;
00726
00731 DbHandle *getDbHandle();
00732
00737 const Schema *getSchema() const;
00738
00743 Schema *getSchema();
00744
00749 Connection *getConnection();
00750
00755 static void setDefaultDBMDB(const char *dbmdb_str);
00756
00761 static const char *getDefaultDBMDB();
00762
00767 static const char *getDefaultServerDBMDB();
00768
00773 static const std::vector<std::string> &getGrantedDBMDB();
00774
00779 const char *getDBMDB() const;
00780
00785 Bool isBackEnd() const;
00786
00791 Bool isLocal() const;
00792
00797 const char *getUser() const {return _user;}
00798
00803 const char *getPassword() const {return _passwd;}
00804
00809 int getUid() const {return uid;}
00810
00811
00820 Status getDatabasefile(const char *&database_file,
00821 Bool fetch = False,
00822 const char *user = 0,
00823 const char *passwd = 0);
00824
00834 Status getDatafiles(const Datafile **&datafiles, unsigned int &cnt,
00835 Bool fetch = False,
00836 const char *user = 0,
00837 const char *passwd = 0);
00838
00848 Status getDatafile(unsigned short id, const Datafile *&datafile,
00849 Bool fetch = False,
00850 const char *user = 0,
00851 const char *passwd = 0);
00852
00862 Status getDatafile(const char *name_or_file, const Datafile *&datafile,
00863 Bool fetch = False,
00864 const char *user = 0,
00865 const char *passwd = 0);
00866
00877 Status createDatafile(const char *filedir, const char *filename,
00878 const char *name, unsigned int maxsize,
00879 unsigned int slotsize, DatType dtype);
00880
00881
00891 Status getDataspaces(const Dataspace **&dataspace, unsigned int &cnt,
00892 Bool fetch = False,
00893 const char *user = 0,
00894 const char *passwd = 0);
00895
00905 Status getDataspace(unsigned short id, const Dataspace *&dataspace,
00906 Bool fetch = False,
00907 const char *user = 0,
00908 const char *passwd = 0);
00909
00919 Status getDataspace(const char *name, const Dataspace *&dataspace,
00920 Bool fetch = False,
00921 const char *user = 0,
00922 const char *passwd = 0);
00923
00929 Status getDefaultDataspace(const Dataspace *&dataspace);
00930
00936 Status setDefaultDataspace(const Dataspace *dataspace);
00937
00945 Status createDataspace(const char *dspname, const Datafile **datafiles,
00946 unsigned int datafile_cnt);
00947
00948 const DBProperty *getProperty(const char *) const;
00949 DBProperty *getProperty(const char *);
00950 const DBProperty **getProperties(int &prop_cnt) const;
00951 DBProperty **getProperties(int &prop_cnt);
00952
00958 static const char *getStringFlag(Database::OpenFlag open_flag);
00959
00964 virtual Database *asDatabase() {return this;}
00965
00970 virtual const Database *asDatabase() const {return this;}
00971
00975 virtual ~Database();
00976
00982 Object *getCacheObject(const Oid &xoid);
00983
00984
00989 void autoRegisterObjects(Bool on);
00990
00995 Bool areObjectsAutoRegistered() const {return auto_register_on;}
00996
01002 void addToRegister(const Object *o, Bool force = False);
01003
01008 void rmvFromRegister(const Object *o);
01009
01014 ObjectList *getRegisteredObjects();
01015
01020 Status storeRegisteredObjects();
01021
01025 void clearRegister();
01026
01031 void storeOnCommit(Bool on);
01032
01037 Bool isStoreOnCommit() const {return store_on_commit;}
01038
01043 Status setMaxObjectCount(unsigned int max_obj_cnt);
01044
01049 Status getMaxObjectCount(unsigned int& max_obj_cnt);
01050
01055 Status setLogSize(unsigned int logsize);
01056
01061 Status getLogSize(unsigned int& logsize);
01062
01063
01064 Status loadObject(const Oid *, Object **,
01065 const RecMode * = RecMode::NoRecurs);
01066
01067 Status loadObject(const Oid *, Object **,
01068 LockMode lockmode,
01069 const RecMode * = RecMode::NoRecurs);
01070
01071 Status reloadObject(const Oid *, Object **,
01072 const RecMode * = RecMode::NoRecurs);
01073
01074 Status reloadObject(const Oid *, Object **,
01075 LockMode lockmode,
01076 const RecMode * = RecMode::NoRecurs);
01077
01078 Status removeObject(const Oid *,
01079 const RecMode * = RecMode::NoRecurs);
01080
01081 Status updateSchema(const char *odlfile, const char *package,
01082 const char *schname = 0, const char *db_prefix = 0,
01083 FILE *fd = stdout, const char *cpp_cmd = 0,
01084 const char *cpp_flags = 0);
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100 static void operator delete(void *);
01101
01102
01103
01104
01105 protected:
01106 char *name;
01107 int dbid;
01108 unsigned int version;
01109 Connection *conn;
01110 OpenFlag open_flag;
01111 DbHandle *dbh;
01112 Schema *sch;
01113 ObjCache *temp_cache;
01114 ObjCache *obj_register;
01115 Bool auto_register_on;
01116 Bool store_on_commit;
01117 Bool open_state;
01118 int open_refcnt;
01119 BEQueue *bequeue;
01120 Bool is_back_end;
01121 static char *defaultDBMDB;
01122 static LinkedList *dbopen_list;
01123 char *_user, *_passwd;
01124 int uid;
01125 Transaction *curtrs, *roottrs;
01126 Bool commit_on_close_set;
01127 Bool commit_on_close;
01128 static Bool def_commit_on_close;
01129 Oid m_protoid;
01130 Bool oqlInit;
01131
01132 public:
01133 typedef Object *(*consapp_t)(const Class *, Data);
01134
01135 protected:
01136 int consapp_cnt;
01137 GenHashTable *hashapp[4];
01138 consapp_t *consapp[4];
01139
01140 Status init_db(Connection *);
01141 Bool initialized;
01142 Status create_prologue(DbCreateDescription &,
01143 DbCreateDescription **);
01144 Status transactionBegin_realize(const TransactionParams *params);
01145 Status transactionCommit_realize();
01146 Status transactionAbort_realize();
01147 void init(const char *);
01148 static Status open_realize(Connection *,
01149 Bool (*)(const Database *, const void *),
01150 const void *, const char *, OpenFlag,
01151 const OpenHints *,
01152 Database *(*)(const void *, const char *),
01153 const char *, const char *,
01154 Database **);
01155 const char *getTName() const;
01156
01157 TransactionParams def_params;
01158
01159 char *dbmdb_str;
01160 Status invalidDbmdb(Error) const;
01161
01162
01163
01164
01165 private:
01166 void init_open(Connection *conn,
01167 const char *dbname,
01168 const char *dbmdb_str,
01169 Database::OpenFlag flag,
01170 const char *user,
01171 const char *passwd);
01172
01173 Status create();
01174 Status update();
01175 Status realize(const RecMode * = RecMode::NoRecurs);
01176 Status remove(const RecMode * = RecMode::NoRecurs);
01177 int trs_cnt;
01178 LinkedList mark_deleted;
01179 LinkedList purge_action_list;
01180 std::map<Oid, bool> mark_created;
01181 void purgeOnAbort();
01182 void purgeRelease();
01183 static ObjCache *makeRegister();
01184 ObjCache conv_cache;
01185
01186 char *database_file;
01187 unsigned int datafile_cnt;
01188 Datafile **datafiles;
01189 unsigned int dataspace_cnt;
01190 Dataspace **dataspaces;
01191 std::map<Object *, bool> realizedMap;
01192 bool useMap;
01193 void make_dat_dsp(const DbCreateDescription &dbdesc);
01194 void garbage_dat_dsp();
01195 const Datafile **get_datafiles(const eyedbsm::Dataspace *dsp);
01196 Status getDatDspPrologue(Bool fetch,
01197 const char *user, const char *passwd);
01198
01199
01200
01201
01202 public:
01203 static void init();
01204 static void _release();
01205 Status set(ConnHandle *, int, int, DbHandle *,
01206 rpcDB_LocalDBContext *, const Oid *, unsigned int);
01207
01208 void beginRealize();
01209 bool isRealized(Object *o) const {
01210 return useMap && realizedMap.find(o) != realizedMap.end();
01211 }
01212 void setRealized(Object *o) {if (useMap) {realizedMap[o] = true;}}
01213 void endRealize();
01214
01215 void cacheObject(Object *);
01216 void uncacheObject(Object *);
01217 void uncacheObject(const Oid &_oid);
01218
01219 void insertTempCache(const Oid&, void *);
01220 Bool isOpeningState();
01221 BEQueue *getBEQueue();
01222 virtual void garbage();
01223
01224 void setSchema(Schema *);
01225
01226 static Status getOpenedDB(int dbid, Database *, Database *&);
01227
01228 static Status open(Connection *, int,
01229 const char *, const char *, const char *,
01230 OpenFlag, const OpenHints *, Database **);
01231
01232 static Status open(Connection *, const char *,
01233 const char *, const char *, const char *,
01234 OpenFlag, const OpenHints *, Database **);
01235
01236 virtual Status loadObject_realize(const Oid *, Object **,
01237 LockMode lockmode,
01238 const RecMode * =
01239 RecMode::NoRecurs,
01240 Bool reload = False);
01241 Bool writeBackConvertedObjects() const;
01242 void addPurgeActionOnAbort(void (*purge_action)(void *), void *);
01243 ExecutableCache *exec_cache;
01244 void *trig_dl;
01245 const Oid& getMprotOid() const {return m_protoid;}
01246 void updateSchema(const SchemaInfo &schinfo);
01247 LinkedList& getMarkDeleted() {return mark_deleted;}
01248 void addMarkCreated(const Oid &);
01249 bool isMarkCreated(const Oid &) const;
01250 void markCreatedEmpty();
01251 void setIncoherency();
01252 Bool isOQLInit() const {return oqlInit;}
01253 void setOQLInit() {oqlInit = True;}
01254 Bool isApp() const {return IDBBOOL(hashapp);}
01255 void add(GenHashTable *, consapp_t *);
01256 consapp_t getConsApp(const Class *);
01257 ObjCache &getConvCache() {return conv_cache;}
01258 };
01259
01264 }
01265
01266 #endif
01267
01268