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
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
00468
00469
00470
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
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
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
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
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
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
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
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