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_OBJECT_H
00026 #define _EYEDB_OBJECT_H
00027
00028 namespace eyedb {
00029
00035
00036
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
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
00313 virtual Status remove(const RecMode *recmode = RecMode::NoRecurs);
00314
00320 Status store(const RecMode *recmode = RecMode::NoRecurs);
00321
00331 Status apply(Database *db, Method *mth, ArgArray &argarray,
00332 Argument &retarg, Bool checkArgs);
00333
00341 virtual Status trace(FILE *fd = stdout, unsigned int flags = 0,
00342 const RecMode *recmode = RecMode::FullRecurs) const = 0;
00343
00351 std::string toString(unsigned int flags = 0,
00352 const RecMode *recmode = RecMode::FullRecurs,
00353 Status *pstatus = 0) const;
00354
00361 Status getDataspace(const Dataspace *&dataspace, Bool refetch = False) const;
00362
00368 Status getLocation(ObjectLocation &loc) const;
00369
00375 Status setDataspace(const Dataspace *dataspace);
00376
00382 Status move(const Dataspace *dataspace);
00383
00389 Status setProtection(const Oid &prot_oid);
00390
00396 Status setProtection(Protection *prot);
00397
00403 Status getProtection(Oid &prot_oid) const;
00404
00410 Status getProtection(Protection *&prot) const;
00411
00417 virtual Status setValue(Data data) = 0;
00418
00424 virtual Status getValue(Data *data) const = 0;
00425
00430 Bool isUnrealizable() const {return unrealizable;}
00431
00436 Bool isRemoved() const {return removed;}
00437
00442 const void *getPtr() const {return (const void *)this;};
00443
00444 virtual ~Object();
00445
00446
00447
00448
00449
00450
00455 virtual const Instance *asInstance() const {return 0;}
00456
00461 virtual const Basic *asBasic() const {return 0;}
00462
00467 virtual const Int16 *asInt16() const {return 0;}
00468
00473 virtual const Int64 *asInt64() const {return 0;}
00474
00479 virtual const Int32 *asInt32() const {return 0;}
00480
00485 virtual const Byte *asByte() const {return 0;}
00486
00491 virtual const Char *asChar() const {return 0;}
00492
00497 virtual const Float *asFloat() const {return 0;}
00498
00503 virtual const OidP *asOidP() const {return 0;}
00504
00509 virtual const Agregat *asAgregat() const {return 0;}
00510
00515 virtual const Struct *asStruct() const {return 0;}
00516
00521 virtual const Union *asUnion() const {return 0;}
00522
00527 virtual const Enum *asEnum() const {return 0;}
00528
00529
00534 virtual const Collection *asCollection() const {return 0;}
00535
00540 virtual const CollSet *asCollSet() const {return 0;}
00541
00546 virtual const CollArray *asCollArray() const {return 0;}
00547
00552 virtual const CollBag *asCollBag() const {return 0;}
00553
00558 virtual const CollList *asCollList() const {return 0;}
00559
00560
00565 virtual const Class *asClass() const {return 0;}
00566
00571 virtual const AgregatClass *asAgregatClass() const {return 0;}
00572
00577 virtual const StructClass *asStructClass() const {return 0;}
00578
00583 virtual const UnionClass *asUnionClass() const {return 0;}
00584
00589 virtual const BasicClass *asBasicClass() const {return 0;}
00590
00595 virtual const Int16Class *asInt16Class() const {return 0;}
00596
00601 virtual const Int32Class *asInt32Class() const {return 0;}
00602
00607 virtual const Int64Class *asInt64Class() const {return 0;}
00608
00613 virtual const ByteClass *asByteClass() const {return 0;}
00614
00619 virtual const CharClass *asCharClass() const {return 0;}
00620
00625 virtual const FloatClass *asFloatClass() const {return 0;}
00626
00631 virtual const OidClass *asOidClass() const {return 0;}
00632
00637 virtual const CollectionClass *asCollectionClass() const {return 0;}
00638
00643 virtual const CollSetClass *asCollSetClass() const {return 0;}
00644
00649 virtual const CollBagClass *asCollBagClass() const {return 0;}
00650
00655 virtual const CollArrayClass *asCollArrayClass() const {return 0;}
00656
00661 virtual const CollListClass *asCollListClass() const {return 0;}
00662
00667 virtual const EnumClass *asEnumClass() const {return 0;}
00668
00669
00674 virtual const Schema *asSchema() const {return 0;}
00675
00680 virtual const Database *asDatabase() const {return 0;}
00681
00682
00683
00688 virtual Instance *asInstance() {return 0;}
00689
00690
00695 virtual Basic *asBasic() {return 0;}
00696
00701 virtual Int16 *asInt16() {return 0;}
00702
00707 virtual Int32 *asInt32() {return 0;}
00708
00713 virtual Int64 *asInt64() {return 0;}
00714
00719 virtual Byte *asByte() {return 0;}
00720
00725 virtual Char *asChar() {return 0;}
00726
00731 virtual Float *asFloat() {return 0;}
00732
00737 virtual OidP *asOidP() {return 0;}
00738
00739
00744 virtual Agregat *asAgregat() {return 0;}
00745
00750 virtual Struct *asStruct() {return 0;}
00751
00756 virtual Union *asUnion() {return 0;}
00757
00762 virtual Enum *asEnum() {return 0;}
00763
00764
00769 virtual Collection *asCollection() {return 0;}
00770
00775 virtual CollSet *asCollSet() {return 0;}
00776
00781 virtual CollArray *asCollArray() {return 0;}
00782
00787 virtual CollBag *asCollBag() {return 0;}
00788
00793 virtual CollList *asCollList() {return 0;}
00794
00795
00800 virtual Class *asClass() {return 0;}
00801
00806 virtual AgregatClass *asAgregatClass() {return 0;}
00807
00812 virtual StructClass *asStructClass() {return 0;}
00813
00818 virtual UnionClass *asUnionClass() {return 0;}
00819
00824 virtual BasicClass *asBasicClass() {return 0;}
00825
00830 virtual Int16Class *asInt16Class() {return 0;}
00831
00836 virtual Int32Class *asInt32Class() {return 0;}
00837
00842 virtual Int64Class *asInt64Class() {return 0;}
00843
00848 virtual ByteClass *asByteClass() {return 0;}
00849
00854 virtual CharClass *asCharClass() {return 0;}
00855
00860 virtual FloatClass *asFloatClass() {return 0;}
00861
00866 virtual OidClass *asOidClass() {return 0;}
00867
00872 virtual CollectionClass *asCollectionClass() {return 0;}
00873
00878 virtual CollSetClass *asCollSetClass() {return 0;}
00879
00884 virtual CollBagClass *asCollBagClass() {return 0;}
00885
00890 virtual CollArrayClass *asCollArrayClass() {return 0;}
00891
00896 virtual CollListClass *asCollListClass() {return 0;}
00897
00902 virtual EnumClass *asEnumClass() {return 0;}
00903
00904
00909 virtual Schema *asSchema() {return 0;}
00910
00915 virtual Database *asDatabase() {return 0;}
00916
00917
00918 static Bool setReleaseCycleDetection(Bool);
00919
00924 static Bool getReleaseCycleDetection() {return release_cycle_detection;}
00925
00926
00927
00928
00929
00930 protected:
00931 Bool removed;
00932 Oid oid;
00933 Oid oid_prot;
00934 Database *db;
00935 Bool unrealizable;
00936 const Attribute *damaged_attr;
00937 int xinfo;
00938
00939 class IDR {
00940
00941 int refcnt;
00942 Data idr;
00943 Size idr_sz;
00944
00945 public:
00946 IDR(Size);
00947 IDR(Size, Data);
00948 ~IDR();
00949 Size getSize() const {return idr_sz;}
00950 const unsigned char *getIDR() const {return idr;}
00951 Data getIDR() {return idr;}
00952 int incrRefCount() {return refcnt++;}
00953 int decrRefCount() {return --refcnt;}
00954 int getRefCount() const {return refcnt;}
00955 void setIDR(Data);
00956 void setIDR(Size);
00957 void setIDR(Size, Data);
00958 } *idr;
00959
00960 void setClass(Class *cls);
00961 void setClass(const Class *cls);
00962
00963 Type type;
00964 unsigned short state;
00965
00966 enum {Tracing = 0x1, Realizing = 0x2, Removing = 0x4};
00967 void *user_data;
00968 UserDataHT *user_data_ht;
00969 void *oql_info;
00970 Bool modify;
00971 Bool applyingTrigger;
00972 Bool dirty;
00973 void headerCode(eyedblib::int32, eyedblib::int32, eyedblib::int32 = 0);
00974 void classOidCode(void);
00975 virtual void garbage();
00976 virtual gbxBool grant_release();
00977 void trace_flags(FILE *fd, unsigned int) const;
00978 void initialize(Database *);
00979
00980 virtual void userInitialize() {}
00981 virtual void userCopy(const Object &) {}
00982 virtual void userGarbage() {}
00983
00984 Bool traceRemoved(FILE *, const char *) const;
00985
00986 eyedblib::int64 c_time;
00987 eyedblib::int64 m_time;
00988
00989 static void freeList(LinkedList *, Bool wipeOut);
00990 static LinkedList* copyList(const LinkedList *, Bool copy);
00991
00992
00993
00994
00995 private:
00996
00997 Class *cls;
00998
00999 static Bool release_cycle_detection;
01000 friend class ObjectPeer;
01001 Object *master_object;
01002
01003 void copy(const Object *, Bool);
01004
01005 void setUnrealizable(Bool);
01006 void setOid(const Oid&);
01007 virtual Status trace_realize(FILE*, int, unsigned int, const RecMode *) const = 0;
01008 void init(Bool);
01009 Bool grt_obj;
01010 short dspid;
01011 const Dataspace *dataspace;
01012
01013
01014
01015
01016 public:
01017 virtual Status create() = 0;
01018 virtual Status update() = 0;
01019 virtual Status realize(const RecMode *recmode = RecMode::NoRecurs);
01020
01021 short getDataspaceID() const;
01022 virtual void touch();
01023 Bool isApplyingTrigger() const {return applyingTrigger;}
01024 void setApplyingTrigger(Bool _applying) {applyingTrigger = _applying;}
01025 Bool isDirty() const {return dirty;}
01026 void setDirty(Bool _dirty) {dirty = _dirty;}
01027 void *setOQLInfo(void *);
01028 void *getOQLInfo();
01029 void unlock_refcnt();
01030 void setDspid(short);
01031 void setDamaged(const Attribute *);
01032 const Attribute *getDamaged() const {return damaged_attr;}
01033
01034 virtual Status remove_r(const RecMode *rcm = RecMode::NoRecurs,
01035 unsigned int flags = 0);
01036
01037 const Object *getMasterObject(bool recurs) const;
01038 Object *getMasterObject(bool recurs);
01039
01040 virtual Status setMasterObject(Object *master_object);
01041
01042 virtual Status releaseMasterObject();
01043
01044 virtual Status realizePerform(const Oid& cloid,
01045 const Oid& objoid,
01046 AttrIdxContext &idx_ctx,
01047 const RecMode *);
01048 virtual Status loadPerform(const Oid&,
01049 LockMode lockmode,
01050 AttrIdxContext &idx_ctx,
01051 const RecMode* = RecMode::NoRecurs);
01052 virtual Status removePerform(const Oid& cloid,
01053 const Oid& objoid,
01054 AttrIdxContext &idx_ctx,
01055 const RecMode *);
01056 virtual Status postRealizePerform(const Oid& cloid,
01057 const Oid& objoid,
01058 AttrIdxContext &idx_ctx,
01059 Bool &mustTouch,
01060 const RecMode *rcm) {
01061 mustTouch = True;
01062 return Success;
01063 }
01064
01065 void setXInfo(int _xinfo) {xinfo = _xinfo;}
01066 };
01067
01068 std::ostream& operator<<(std::ostream&, const Object &);
01069 std::ostream& operator<<(std::ostream&, const Object *);
01070
01071 enum TraceFlag {
01072 MTimeTrace = 0x001,
01073 CTimeTrace = 0x002,
01074 CMTimeTrace = MTimeTrace | CTimeTrace,
01075 PointerTrace = 0x004,
01076 CompOidTrace = 0x008,
01077 NativeTrace = 0x010,
01078 ContentsFlag = 0x020,
01079 InhAttrTrace = 0x040,
01080 InhExecTrace = 0x080,
01081 ExecBodyTrace = 0x100,
01082 SysExecTrace = 0x200,
01083 AttrCompTrace = 0x400,
01084 AttrCompDetailTrace = 0x800,
01085 NoScope = 0x1000
01086 };
01087
01088 class ObjectList;
01089
01090 class ObjectPtr : public gbxObjectPtr {
01091
01092 public:
01093 ObjectPtr(Object *o = 0) : gbxObjectPtr(o) { }
01094
01095 Object *getObject() {return dynamic_cast<Object *>(o);}
01096 const Object *getObject() const {return dynamic_cast<const Object *>(o);}
01097
01098 Object *operator->() {return dynamic_cast<Object *>(o);}
01099 const Object *operator->() const {return dynamic_cast<const Object *>(o);}
01100 };
01101
01102 typedef std::vector<ObjectPtr> ObjectPtrVector;
01103
01104 std::ostream& operator<<(std::ostream&, const ObjectPtr &);
01105
01109 class ObjectArray {
01110
01111
01112
01113
01114 public:
01115 ObjectArray(Object ** = 0, unsigned int count = 0);
01116 ObjectArray(bool auto_garb, Object ** = 0, unsigned int count = 0);
01117 ObjectArray(const Collection *, bool auto_garb = False);
01118 ObjectArray(const ObjectArray &);
01119 ObjectArray(const ObjectList &);
01120
01121 ObjectArray& operator=(const ObjectArray &);
01122
01123 void set(Object **, unsigned int count);
01124 Status setObjectAt(unsigned int ind, Object *o);
01125
01126 unsigned int getCount() const {return count;}
01127
01128
01129 Object *operator[](unsigned int ind) {
01130 return objs[ind];
01131 }
01132
01133 const Object *operator[](unsigned int ind) const {
01134 return objs[ind];
01135 }
01136
01137 void setAutoGarbage(bool _auto_garb) {auto_garb = _auto_garb;}
01138 bool isAutoGarbage() const {return auto_garb;}
01139
01140 void setMustRelease(bool must_release);
01141
01142 ObjectList *toList() const;
01143 void makeObjectPtrVector(ObjectPtrVector &);
01144
01145 void garbage();
01146
01147 ~ObjectArray();
01148
01149
01150
01151
01152 private:
01153 unsigned int count;
01154 Object **objs;
01155 bool auto_garb;
01156 };
01157
01158 class ObjectListCursor;
01159
01160 class ObjectList {
01161
01162 public:
01163 ObjectList();
01164 ObjectList(const ObjectArray &);
01165 int getCount(void) const;
01166
01167 void insertObject(Object *);
01168 void insertObjectLast(Object *);
01169 void insertObjectFirst(Object *);
01170 Bool suppressObject(Object *);
01171 Bool exists(const Object *) const;
01172 void empty(void);
01173
01174 ObjectArray *toArray() const;
01175
01176 ~ObjectList();
01177
01178 private:
01179 LinkedList *list;
01180 friend class ObjectListCursor;
01181 };
01182
01183 class ObjectListCursor {
01184
01185 public:
01186 ObjectListCursor(const ObjectList &);
01187 ObjectListCursor(const ObjectList *);
01188
01189 Bool getNext(Object *&);
01190
01191 ~ObjectListCursor();
01192
01193 private:
01194 LinkedListCursor *c;
01195 };
01196
01197 class ObjectReleaser {
01198
01199 public:
01200 ObjectReleaser(Object *);
01201
01202 Object *dontRelease();
01203 operator Object *() {return o;}
01204
01205 ~ObjectReleaser();
01206
01207 private:
01208 Object *o;
01209 Bool dont_release;
01210 };
01211
01212 class ObjectListReleaser {
01213
01214 public:
01215 ObjectListReleaser();
01216 void add(Object *);
01217 void dontRelease();
01218 ~ObjectListReleaser();
01219
01220 private:
01221 Bool dont_release;
01222 LinkedList list;
01223 };
01224
01225 class ObjectObserver : public gbxObserver {
01226
01227 public:
01228 typedef std::vector<Object *> ObjectVector;
01229 typedef ObjectVector::iterator ObjectVectorIterator;
01230 typedef ObjectVector::const_iterator ObjectVectorConstIterator;
01231
01232 ObjectObserver(const std::string &tag = "");
01233
01234 virtual void getObjects(ObjectVector &) const;
01235 virtual bool isObjectRegistered(Object *) const;
01236
01237 virtual void addObj(gbxObject *o);
01238 virtual void rmvObj(gbxObject *o);
01239
01240 ~ObjectObserver();
01241 };
01242
01247 }
01248
01249 #endif