Object.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_OBJECT_H
00026 #define _EYEDB_OBJECT_H
00027 
00028 namespace eyedb {
00029 
00035   //
00036   // forward declarations
00037   //
00038 
00039   class Database;
00040   class TypeModifier;
00041   class RecMode;
00042   class Attribute;
00043   class ObjectPeer;
00044   class Method;
00045   class ArgArray;
00046   class Argument;
00047   class Protection;
00048   class Instance;
00049   class Basic;
00050   class Int16;
00051   class Int32;
00052   class Int64;
00053   class Byte;
00054   class Char;
00055   class Float;
00056   class OidP;
00057   class Agregat;
00058   class Struct;
00059   class Union;
00060   class Enum;
00061   class Collection;
00062   class CollSet;
00063   class CollArray;
00064   class CollBag;
00065   class CollList;
00066   class Class;
00067   class AgregatClass;
00068   class StructClass;
00069   class UnionClass;
00070   class BasicClass;
00071   class BasicClass;
00072   class Int16Class;
00073   class Int32Class;
00074   class Int64Class;
00075   class ByteClass;
00076   class CharClass;
00077   class FloatClass;
00078   class OidClass;
00079   class CollectionClass;
00080   class CollSetClass;
00081   class CollBagClass;
00082   class CollArrayClass;
00083   class CollListClass;
00084   class EnumClass;
00085   class Schema;
00086   class AttrIdxContext;
00087   class Datafile;
00088   class Dataspace;
00089   class UserDataHT;
00090 
00094   class Object : public gbxObject {
00095   
00096     // ----------------------------------------------------------------------
00097     // Object Interface
00098     // ----------------------------------------------------------------------
00099   public:
00105     Object(Database *db = 0, const Dataspace *dataspace = 0);
00106 
00111     Object(const Object &o);
00112 
00118     Object(const Object *o, Bool share = False);
00119 
00125     Object& operator=(const Object &o);
00126 
00131     virtual Object *clone() const = 0;
00132 
00137     Class *getClass() const {return cls;}
00138 
00144     Data getIDR(Size& size) {
00145       size = idr->getSize();
00146       return idr->getIDR();
00147     }
00148 
00153     Data getIDR() {
00154       return idr->getIDR();
00155     }
00156 
00162     const Data getIDR(Size& size) const {
00163       size = idr->getSize();
00164       return idr->getIDR();
00165     }
00166 
00171     const Data getIDR() const {
00172       return idr->getIDR();
00173     }
00174 
00179     Size getIDRSize() const {return idr->getSize();}
00180 
00185     const Type get_Type() const {return type;}
00186 
00191     const Oid& getOid() const {return oid;}
00192 
00197     eyedblib::int64 getCTime() const {return c_time;}
00198 
00203     eyedblib::int64 getMTime() const {return m_time;}
00204 
00209     const char *getStringCTime() const;
00210 
00215     const char *getStringMTime() const;
00216 
00222     Status setLock(LockMode lockmode);
00223 
00230     Status setLock(LockMode lockmode, LockMode &alockmode);
00231 
00237     Status getLock(LockMode &lockmode);
00238 
00244     void *setUserData(void *data);
00245 
00250     void *getUserData() {return user_data;}
00251 
00256     const void *getUserData() const {return user_data;}
00257 
00264     void *setUserData(const char *key, void *data);
00265 
00271     void *getUserData(const char *key);
00272 
00278     const void *getUserData(const char *data) const;
00279 
00286     void getAllUserData(LinkedList *&key_list,
00287                         LinkedList *&data_list) const;
00288 
00293     Bool isModify() const {return modify;}
00294 
00300     virtual Status setDatabase(Database *mdb);
00301 
00306     Database *getDatabase() const {return db;}
00307 
00312     virtual Status create() = 0;
00317     virtual Status update() = 0;
00318 
00324     virtual Status realize(const RecMode *recmode = RecMode::NoRecurs);
00325 
00331     virtual Status remove(const RecMode *recmode = RecMode::NoRecurs);
00332 
00338     Status store(const RecMode *recmode = RecMode::NoRecurs) {
00339       return realize(recmode);
00340     }
00341 
00351     Status apply(Database *db, Method *mth, ArgArray &argarray,
00352                  Argument &retarg, Bool checkArgs);
00353 
00361     virtual Status trace(FILE *fd = stdout, unsigned int flags = 0,
00362                          const RecMode *recmode = RecMode::FullRecurs) const = 0;
00363 
00371     std::string toString(unsigned int flags = 0,
00372                          const RecMode *recmode = RecMode::FullRecurs,
00373                          Status *pstatus = 0) const;
00374 
00381     Status getDataspace(const Dataspace *&dataspace, Bool refetch = False) const;
00382 
00388     Status getLocation(ObjectLocation &loc) const;
00389 
00395     Status setDataspace(const Dataspace *dataspace);
00396 
00402     Status move(const Dataspace *dataspace);
00403 
00409     Status setProtection(const Oid &prot_oid);
00410 
00416     Status setProtection(Protection *prot);
00417 
00423     Status getProtection(Oid &prot_oid) const;
00424 
00430     Status getProtection(Protection *&prot) const;
00431 
00437     virtual Status setValue(Data data) = 0;
00438 
00444     virtual Status getValue(Data *data) const = 0;
00445   
00450     Bool isUnrealizable() const {return unrealizable;}
00451 
00456     Bool isRemoved() const {return removed;}
00457 
00462     const void *getPtr() const {return (const void *)this;};
00463 
00464     virtual ~Object();
00465 
00466     // ----------------------------------------------------------------------
00467     // Down Casting Methods
00468     // ----------------------------------------------------------------------
00469 
00470     // Const Versions
00475     virtual const Instance        *asInstance() const {return 0;}
00476 
00481     virtual const Basic           *asBasic() const {return 0;}
00482 
00487     virtual const Int16           *asInt16() const {return 0;}
00488 
00493     virtual const Int64           *asInt64() const {return 0;}
00494 
00499     virtual const Int32           *asInt32() const {return 0;}
00500 
00505     virtual const Byte            *asByte() const {return 0;}
00506 
00511     virtual const Char            *asChar() const {return 0;}
00512 
00517     virtual const Float           *asFloat() const {return 0;}
00518 
00523     virtual const OidP            *asOidP() const {return 0;}
00524 
00529     virtual const Agregat         *asAgregat() const {return 0;}
00530 
00535     virtual const Struct          *asStruct() const {return 0;}
00536 
00541     virtual const Union           *asUnion() const {return 0;}
00542 
00547     virtual const Enum            *asEnum() const {return 0;}
00548 
00549 
00554     virtual const Collection      *asCollection() const {return 0;}
00555 
00560     virtual const CollSet         *asCollSet() const {return 0;}
00561 
00566     virtual const CollArray       *asCollArray() const {return 0;}
00567 
00572     virtual const CollBag         *asCollBag() const {return 0;}
00573 
00578     virtual const CollList        *asCollList() const {return 0;}
00579 
00580 
00585     virtual const Class           *asClass() const {return 0;}
00586 
00591     virtual const AgregatClass    *asAgregatClass() const {return 0;}
00592 
00597     virtual const StructClass     *asStructClass() const {return 0;}
00598 
00603     virtual const UnionClass      *asUnionClass() const {return 0;}
00604 
00609     virtual const BasicClass      *asBasicClass() const {return 0;}
00610 
00615     virtual const Int16Class      *asInt16Class() const {return 0;}
00616 
00621     virtual const Int32Class      *asInt32Class() const {return 0;}
00622 
00627     virtual const Int64Class      *asInt64Class() const {return 0;}
00628 
00633     virtual const ByteClass       *asByteClass() const {return 0;}
00634 
00639     virtual const CharClass       *asCharClass() const {return 0;}
00640 
00645     virtual const FloatClass      *asFloatClass() const {return 0;}
00646 
00651     virtual const OidClass        *asOidClass() const {return 0;}
00652 
00657     virtual const CollectionClass *asCollectionClass() const {return 0;}
00658 
00663     virtual const CollSetClass    *asCollSetClass() const {return 0;}
00664 
00669     virtual const CollBagClass    *asCollBagClass() const {return 0;}
00670 
00675     virtual const CollArrayClass  *asCollArrayClass() const {return 0;}
00676 
00681     virtual const CollListClass   *asCollListClass() const {return 0;}
00682 
00687     virtual const EnumClass       *asEnumClass() const {return 0;}
00688 
00689 
00694     virtual const Schema          *asSchema() const {return 0;}
00695 
00700     virtual const Database        *asDatabase() const {return 0;}
00701 
00702 
00703     // Non Const Versions
00708     virtual Instance        *asInstance() {return 0;}
00709 
00710 
00715     virtual Basic           *asBasic() {return 0;}
00716 
00721     virtual Int16           *asInt16() {return 0;}
00722 
00727     virtual Int32           *asInt32() {return 0;}
00728 
00733     virtual Int64           *asInt64() {return 0;}
00734 
00739     virtual Byte            *asByte() {return 0;}
00740 
00745     virtual Char            *asChar() {return 0;}
00746 
00751     virtual Float           *asFloat() {return 0;}
00752 
00757     virtual OidP            *asOidP() {return 0;}
00758 
00759 
00764     virtual Agregat         *asAgregat() {return 0;}
00765 
00770     virtual Struct          *asStruct() {return 0;}
00771 
00776     virtual Union           *asUnion() {return 0;}
00777 
00782     virtual Enum            *asEnum() {return 0;}
00783 
00784 
00789     virtual Collection      *asCollection() {return 0;}
00790 
00795     virtual CollSet         *asCollSet() {return 0;}
00796 
00801     virtual CollArray       *asCollArray() {return 0;}
00802 
00807     virtual CollBag         *asCollBag() {return 0;}
00808 
00813     virtual CollList        *asCollList() {return 0;}
00814 
00815 
00820     virtual Class           *asClass() {return 0;}
00821 
00826     virtual AgregatClass    *asAgregatClass() {return 0;}
00827 
00832     virtual StructClass     *asStructClass() {return 0;}
00833 
00838     virtual UnionClass      *asUnionClass() {return 0;}
00839 
00844     virtual BasicClass      *asBasicClass() {return 0;}
00845 
00850     virtual Int16Class      *asInt16Class() {return 0;}
00851 
00856     virtual Int32Class      *asInt32Class() {return 0;}
00857 
00862     virtual Int64Class      *asInt64Class() {return 0;}
00863 
00868     virtual ByteClass       *asByteClass() {return 0;}
00869 
00874     virtual CharClass       *asCharClass() {return 0;}
00875 
00880     virtual FloatClass      *asFloatClass() {return 0;}
00881 
00886     virtual OidClass        *asOidClass() {return 0;}
00887 
00892     virtual CollectionClass *asCollectionClass() {return 0;}
00893 
00898     virtual CollSetClass    *asCollSetClass() {return 0;}
00899 
00904     virtual CollBagClass    *asCollBagClass() {return 0;}
00905 
00910     virtual CollArrayClass  *asCollArrayClass() {return 0;}
00911 
00916     virtual CollListClass   *asCollListClass() {return 0;}
00917 
00922     virtual EnumClass       *asEnumClass() {return 0;}
00923 
00924 
00929     virtual Schema          *asSchema() {return 0;}
00930 
00935     virtual Database        *asDatabase() {return 0;}
00936 
00937 
00938     static Bool setReleaseCycleDetection(Bool);
00939 
00944     static Bool getReleaseCycleDetection() {return release_cycle_detection;}
00945 
00946 
00947     // ----------------------------------------------------------------------
00948     //  Object Protected Part
00949     // ----------------------------------------------------------------------
00950   protected:
00951     Bool removed;
00952     Oid oid;
00953     Oid oid_prot;
00954     Database *db;
00955     Bool unrealizable;
00956     const Attribute *damaged_attr;
00957     int xinfo;
00958 
00959     class IDR {
00960 
00961       int refcnt;
00962       Data idr;
00963       Size idr_sz;
00964 
00965     public:
00966       IDR(Size);
00967       IDR(Size, Data);
00968       ~IDR();
00969       Size getSize() const {return idr_sz;}
00970       const unsigned char *getIDR() const {return idr;}
00971       Data getIDR() {return idr;}
00972       int incrRefCount() {return refcnt++;}
00973       int decrRefCount() {return --refcnt;}
00974       int getRefCount() const {return refcnt;}
00975       void setIDR(Data);
00976       void setIDR(Size);
00977       void setIDR(Size, Data);
00978     } *idr;
00979 
00980     void setClass(Class *cls);
00981     void setClass(const Class *cls);
00982 
00983     Type type;
00984     unsigned short state;
00985 
00986     enum {Tracing = 0x1, Realizing = 0x2, Removing = 0x4};
00987     void *user_data;
00988     UserDataHT *user_data_ht;
00989     void *oql_info;
00990     Bool modify;
00991     Bool applyingTrigger;
00992     Bool dirty;
00993     void headerCode(eyedblib::int32, eyedblib::int32, eyedblib::int32 = 0);
00994     void classOidCode(void);
00995     virtual void garbage();
00996     virtual gbxBool grant_release();
00997     void trace_flags(FILE *fd, unsigned int) const;
00998     void initialize(Database *);
00999 
01000     virtual void userInitialize() {}
01001     virtual void userCopy(const Object &) {}
01002     virtual void userGarbage() {}
01003 
01004     Bool traceRemoved(FILE *, const char *) const;
01005 
01006     eyedblib::int64 c_time;
01007     eyedblib::int64 m_time;
01008 
01009     static void freeList(LinkedList *, Bool wipeOut);
01010     static LinkedList* copyList(const LinkedList *, Bool copy);
01011 
01012     // ----------------------------------------------------------------------
01013     //  Object Private Part
01014     // ----------------------------------------------------------------------
01015   private:
01016 
01017     Class *cls;
01018 
01019     static Bool release_cycle_detection;
01020     friend class ObjectPeer;
01021     Object *master_object;
01022 
01023     void copy(const Object *, Bool);
01024 
01025     void setUnrealizable(Bool);
01026     void setOid(const Oid&);
01027     virtual Status trace_realize(FILE*, int, unsigned int, const RecMode *) const = 0;
01028     void init(Bool);
01029     Bool grt_obj;
01030     short dspid;
01031     const Dataspace *dataspace;
01032 
01033     // ----------------------------------------------------------------------
01034     // Object Restricted Access (conceptually private)
01035     // ----------------------------------------------------------------------
01036   public:
01037     short getDataspaceID() const;
01038     virtual void touch();
01039     Bool isApplyingTrigger() const {return applyingTrigger;}
01040     void setApplyingTrigger(Bool _applying) {applyingTrigger = _applying;}
01041     Bool isDirty() const {return dirty;}
01042     void setDirty(Bool _dirty) {dirty = _dirty;}
01043     void *setOQLInfo(void *);
01044     void *getOQLInfo();
01045     void unlock_refcnt();
01046     void setDspid(short);
01047     void setDamaged(const Attribute *);
01048     const Attribute *getDamaged() const {return damaged_attr;}
01049 
01050     virtual Status remove_r(const RecMode *rcm = RecMode::NoRecurs,
01051                             unsigned int flags = 0);
01052 
01053     const Object *getMasterObject(bool recurs) const;
01054     Object *getMasterObject(bool recurs);
01055 
01056     virtual Status setMasterObject(Object *master_object);
01057 
01058     virtual Status releaseMasterObject();
01059 
01060     virtual Status realizePerform(const Oid& cloid,
01061                                   const Oid& objoid,
01062                                   AttrIdxContext &idx_ctx,
01063                                   const RecMode *);
01064     virtual Status loadPerform(const Oid&,
01065                                LockMode lockmode,
01066                                AttrIdxContext &idx_ctx,
01067                                const RecMode* = RecMode::NoRecurs);
01068     virtual Status removePerform(const Oid& cloid,
01069                                  const Oid& objoid,
01070                                  AttrIdxContext &idx_ctx,
01071                                  const RecMode *);
01072     virtual Status postRealizePerform(const Oid& cloid,
01073                                       const Oid& objoid,
01074                                       AttrIdxContext &idx_ctx,
01075                                       Bool &mustTouch,
01076                                       const RecMode *rcm) {
01077       mustTouch = True;
01078       return Success;
01079     }
01080 
01081     void setXInfo(int _xinfo) {xinfo = _xinfo;}
01082   };
01083 
01084   std::ostream& operator<<(std::ostream&, const Object &);
01085   std::ostream& operator<<(std::ostream&, const Object *);
01086 
01087   enum TraceFlag {
01088     MTimeTrace    = 0x001,
01089     CTimeTrace    = 0x002,
01090     CMTimeTrace   = MTimeTrace | CTimeTrace,
01091     PointerTrace  = 0x004,
01092     CompOidTrace  = 0x008,
01093     NativeTrace   = 0x010,
01094     ContentsFlag  = 0x020,
01095     InhAttrTrace  = 0x040,
01096     InhExecTrace  = 0x080,
01097     ExecBodyTrace = 0x100,
01098     SysExecTrace  = 0x200,
01099     AttrCompTrace = 0x400,
01100     AttrCompDetailTrace = 0x800,
01101     NoScope       = 0x1000
01102   };
01103 
01104   class ObjectList;
01105 
01106   class ObjectPtr : public gbxObjectPtr {
01107 
01108   public:
01109     ObjectPtr(Object *o = 0) : gbxObjectPtr(o) { }
01110 
01111     Object *getObject() {return dynamic_cast<Object *>(o);}
01112     const Object *getObject() const {return dynamic_cast<const Object *>(o);}
01113 
01114     Object *operator->() {return dynamic_cast<Object *>(o);}
01115     const Object *operator->() const {return dynamic_cast<const Object *>(o);}
01116   };
01117 
01118   typedef std::vector<ObjectPtr> ObjectPtrVector;
01119 
01120   std::ostream& operator<<(std::ostream&, const ObjectPtr &);
01121 
01125   class ObjectArray {
01126 
01127     // ----------------------------------------------------------------------
01128     // ObjectArray Interface
01129     // ----------------------------------------------------------------------
01130   public:
01131     ObjectArray(Object ** = 0, unsigned int count = 0);
01132     ObjectArray(bool auto_garb, Object ** = 0, unsigned int count = 0);
01133     ObjectArray(const Collection *, bool auto_garb = False);
01134     ObjectArray(const ObjectArray &);
01135     ObjectArray(const ObjectList &);
01136 
01137     ObjectArray& operator=(const ObjectArray &);
01138 
01139     void set(Object **, unsigned int count);
01140     Status setObjectAt(unsigned int ind, Object *o);
01141 
01142     unsigned int getCount() const {return count;}
01143 
01144     // voluntary not left value !
01145     Object *operator[](unsigned int ind) {
01146       return objs[ind];
01147     }
01148 
01149     const Object *operator[](unsigned int ind) const {
01150       return objs[ind];
01151     }
01152 
01153     void setAutoGarbage(bool _auto_garb) {auto_garb = _auto_garb;}
01154     bool isAutoGarbage() const {return auto_garb;}
01155 
01156     void setMustRelease(bool must_release);
01157 
01158     ObjectList *toList() const;
01159     void makeObjectPtrVector(ObjectPtrVector &);
01160 
01161     void garbage();
01162 
01163     ~ObjectArray();
01164 
01165     // ----------------------------------------------------------------------
01166     // ObjectArray Private Part
01167     // ----------------------------------------------------------------------
01168   private:
01169     unsigned int count;
01170     Object **objs;
01171     bool auto_garb;
01172   };
01173 
01174   class ObjectListCursor;
01175 
01176   class ObjectList {
01177 
01178   public:
01179     ObjectList();
01180     ObjectList(const ObjectArray &);
01181     int getCount(void) const;
01182 
01183     void insertObject(Object *);
01184     void insertObjectLast(Object *);
01185     void insertObjectFirst(Object *);
01186     Bool suppressObject(Object *);
01187     Bool exists(const Object *) const;
01188     void empty(void);
01189 
01190     ObjectArray *toArray() const;
01191 
01192     ~ObjectList();
01193 
01194   private:
01195     LinkedList *list;
01196     friend class ObjectListCursor;
01197   };
01198 
01199   class ObjectListCursor {
01200 
01201   public:
01202     ObjectListCursor(const ObjectList &);
01203     ObjectListCursor(const ObjectList *);
01204 
01205     Bool getNext(Object *&);
01206 
01207     ~ObjectListCursor();
01208 
01209   private:
01210     LinkedListCursor *c;
01211   };
01212 
01213   class ObjectReleaser {
01214 
01215   public:
01216     ObjectReleaser(Object *);
01217 
01218     Object *dontRelease();
01219     operator Object *() {return o;}
01220 
01221     ~ObjectReleaser();
01222 
01223   private:
01224     Object *o;
01225     Bool dont_release;
01226   };
01227 
01228   class ObjectListReleaser {
01229 
01230   public:
01231     ObjectListReleaser();
01232     void add(Object *);
01233     void dontRelease();
01234     ~ObjectListReleaser();
01235 
01236   private:
01237     Bool dont_release;
01238     LinkedList list;
01239   };
01240 
01241   class ObjectObserver : public gbxObserver {
01242 
01243   public:
01244     typedef std::vector<Object *> ObjectVector;
01245     typedef ObjectVector::iterator ObjectVectorIterator;
01246     typedef ObjectVector::const_iterator ObjectVectorConstIterator;
01247 
01248     ObjectObserver(const std::string &tag = "");
01249 
01250     virtual void getObjects(ObjectVector &) const;
01251     virtual bool isObjectRegistered(Object *) const;
01252 
01253     virtual void addObj(gbxObject *o);
01254     virtual void rmvObj(gbxObject *o);
01255 
01256     ~ObjectObserver();
01257   };
01258 
01263 }
01264 
01265 #endif

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