Database.h

00001 /* 
00002    EyeDB Object Database Management System
00003    Copyright (C) 1994-2008 SYSRA
00004    
00005    EyeDB is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009    
00010    EyeDB is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014    
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with this library; if not, write to the Free Software
00017    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA 
00018 */
00019 
00020 /*
00021    Author: Eric Viara <viara@sysra.com>
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     // Database Interface
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     // object locking
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     // object loading
00376     Status loadObject(const Oid &oid, ObjectPtr &o,
00377                       const RecMode *recmode = RecMode::NoRecurs);
00378 
00379     // object loading
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     // location management
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     // transaction support
00602   
00607     Status transactionBegin();
00608 
00614     Status transactionBegin(const TransactionParams &params);
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 &params);
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     // datafile management
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     // dataspace management
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     // auto register
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 
01039     // deprecated
01040     Status loadObject(const Oid *, Object **,
01041                       const RecMode * = RecMode::NoRecurs);
01042 
01043     Status loadObject(const Oid *, Object **,
01044                       LockMode lockmode,
01045                       const RecMode * = RecMode::NoRecurs);
01046 
01047     Status reloadObject(const Oid *, Object **,
01048                         const RecMode * = RecMode::NoRecurs);
01049 
01050     Status reloadObject(const Oid *, Object **,
01051                         LockMode lockmode,
01052                         const RecMode * = RecMode::NoRecurs);
01053 
01054     Status removeObject(const Oid *,
01055                         const RecMode * = RecMode::NoRecurs);
01056 
01057     Status updateSchema(const char *odlfile, const char *package,
01058                         const char *schname = 0, const char *db_prefix = 0,
01059                         FILE *fd = stdout, const char *cpp_cmd = 0,
01060                         const char *cpp_flags = 0);
01061 
01062     // not implemented (yet ?)
01063     /*
01064     Status execOQL(Object *&, const char *fmt, ...);
01065     Status execOQL(Object *&, const RecMode *,
01066                    const char *fmt, ...);
01067     Status execOQL(ObjectArray &, const char *fmt, ...);
01068     Status execOQL(ObjectArray &, const RecMode *,
01069                    const char *fmt, ...);
01070     Status execOQL(Oid &, const char *fmt, ...);
01071     Status execOQL(OidArray &, const char *fmt, ...);
01072     Status execOQL(Value &, const char *fmt, ...);
01073     Status execOQL(ValueArray &, const char *fmt, ...);
01074     */
01075 
01076     // ----------------------------------------------------------------------
01077     // Database Protected Part
01078     // ----------------------------------------------------------------------
01079   protected:
01080     char *name;
01081     int dbid;
01082     unsigned int version;
01083     Connection *conn;
01084     OpenFlag open_flag;
01085     DbHandle *dbh;
01086     Schema *sch;
01087     ObjCache *temp_cache;
01088     ObjCache *obj_register;
01089     Bool auto_register_on;
01090     Bool store_on_commit;
01091     Bool open_state;
01092     int open_refcnt;
01093     BEQueue *bequeue;
01094     Bool is_back_end;
01095     static char *defaultDBMDB;
01096     static LinkedList *dbopen_list;
01097     char *_user, *_passwd;
01098     int uid;
01099     Transaction *curtrs, *roottrs;
01100     Bool commit_on_close_set;
01101     Bool commit_on_close;
01102     static Bool def_commit_on_close;
01103     Oid m_protoid;
01104     Bool oqlInit;
01105 
01106   public:
01107     typedef Object *(*consapp_t)(const Class *, Data);
01108 
01109   protected:
01110     int consapp_cnt;
01111     GenHashTable *hashapp[4];
01112     consapp_t *consapp[4];
01113 
01114     Status init_db(Connection *);
01115     Bool initialized;
01116     Status create_prologue(DbCreateDescription &,
01117                            DbCreateDescription **);
01118     Status transactionBegin_realize(const TransactionParams *params);
01119     Status transactionCommit_realize();
01120     Status transactionAbort_realize();
01121     void init(const char *);
01122     static Status open_realize(Connection *,
01123                                Bool (*)(const Database *, const void *),
01124                                const void *, const char *, OpenFlag,
01125                                const OpenHints *,
01126                                Database *(*)(const void *, const char *),
01127                                const char *, const char *,
01128                                Database **);
01129     const char *getTName() const;
01130 
01131     TransactionParams def_params;
01132 
01133     char *dbmdb_str;
01134     Status invalidDbmdb(Error) const;
01135 
01136     // ----------------------------------------------------------------------
01137     // Database Private Part
01138     // ----------------------------------------------------------------------
01139   private:
01140     void init_open(Connection *conn,
01141                    const char *dbname,
01142                    const char *dbmdb_str,
01143                    Database::OpenFlag flag,
01144                    const char *user,
01145                    const char *passwd);
01146 
01147     Status create();
01148     Status update();
01149     Status realize(const RecMode * = RecMode::NoRecurs);
01150     Status remove(const RecMode * = RecMode::NoRecurs);
01151     int trs_cnt;
01152     LinkedList mark_deleted;
01153     LinkedList purge_action_list;
01154     std::map<Oid, bool> mark_created;
01155     void purgeOnAbort();
01156     void purgeRelease();
01157     static ObjCache *makeRegister();
01158     ObjCache conv_cache;
01159 
01160     char *database_file;
01161     unsigned int datafile_cnt;
01162     Datafile **datafiles;
01163     unsigned int dataspace_cnt;
01164     Dataspace **dataspaces;
01165     void make_dat_dsp(const DbCreateDescription &dbdesc);
01166     void garbage_dat_dsp();
01167     const Datafile **get_datafiles(const eyedbsm::Dataspace *dsp);
01168     Status getDatDspPrologue(Bool fetch,
01169                              const char *user, const char *passwd);
01170 
01171     // ----------------------------------------------------------------------
01172     // Database Restricted Access (conceptually private)
01173     // ----------------------------------------------------------------------
01174   public:
01175     static void init();
01176     static void _release();
01177     Status set(ConnHandle *, int, int, DbHandle *,
01178                rpcDB_LocalDBContext *, const Oid *, unsigned int);
01179 
01180     void cacheObject(Object *);
01181     void uncacheObject(Object *);
01182     void uncacheObject(const Oid &_oid);
01183 
01184     void insertTempCache(const Oid&, void *);
01185     Bool isOpeningState();
01186     BEQueue *getBEQueue();
01187     virtual void garbage();
01188 
01189     void setSchema(Schema *);
01190 
01191     static Status getOpenedDB(int dbid, Database *, Database *&);
01192 
01193     static Status open(Connection *, int,
01194                        const char *, const char *, const char *,
01195                        OpenFlag, const OpenHints *, Database **);
01196 
01197     static Status open(Connection *, const char *,
01198                        const char *, const char *, const char *,
01199                        OpenFlag, const OpenHints *, Database **);
01200 
01201     virtual Status loadObject_realize(const Oid *, Object **,
01202                                       LockMode lockmode,
01203                                       const RecMode * =
01204                                       RecMode::NoRecurs,
01205                                       Bool reload = False);
01206     Bool writeBackConvertedObjects() const;
01207     void addPurgeActionOnAbort(void (*purge_action)(void *), void *);
01208     ExecutableCache *exec_cache;
01209     void *trig_dl;
01210     const Oid& getMprotOid() const {return m_protoid;}
01211     void updateSchema(const SchemaInfo &schinfo);
01212     LinkedList& getMarkDeleted() {return mark_deleted;}
01213     void addMarkCreated(const Oid &);
01214     bool isMarkCreated(const Oid &) const;
01215     void markCreatedEmpty();
01216     void setIncoherency();
01217     Bool isOQLInit() const {return oqlInit;}
01218     void setOQLInit() {oqlInit = True;}
01219     Bool isApp() const {return IDBBOOL(hashapp);}
01220     void add(GenHashTable *, consapp_t *);
01221     consapp_t getConsApp(const Class *);
01222     ObjCache &getConvCache() {return conv_cache;}
01223   };
01224 
01229 }
01230 
01231 #endif
01232 
01233   

Generated on Mon Dec 22 18:15:53 2008 for eyedb by  doxygen 1.5.3