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_CLASS_H
00026 #define _EYEDB_CLASS_H
00027
00028 namespace eyedb {
00029
00035 typedef eyedbsm::Idx Idx;
00036
00037 class Instance;
00038 class Schema;
00039 class Collection;
00040 class ClassPeer;
00041 class ClassComponent;
00042 class Trigger;
00043 class GenCodeHints;
00044 class Signature;
00045 class ClassVariable;
00046 class GenContext;
00047 class AttributeComponent;
00048 class IndexImpl;
00049
00053 class Class : public Object {
00054
00055
00056
00057
00058 public:
00059 enum MType {
00060 System = 1,
00061 User = 2
00062 };
00063
00069 Class(const char *s, Class *p = NULL);
00070
00076 Class(const char *s, const Oid *poid);
00077
00084 Class(Database *db, const char *s, Class *p = NULL);
00085
00092 Class(Database *db, const char *s, const Oid *poid);
00093
00098 Class(const Class &cl);
00099
00104 virtual Object *clone() const {return new Class(*this);}
00105
00111 Class& operator=(const Class &cl);
00112
00117 const char *getName() const {return name;}
00118
00124 virtual const char *getCName(Bool useAsRef = False) const;
00125
00130 unsigned int getNum() const {return num;};
00131
00137 virtual Status setName(const char *s);
00138
00143 Class *getParent();
00144
00149 const Class *getParent() const;
00150
00157 Status getParent(Database *db, Class *&rparent);
00158
00163 Schema *getSchema();
00164
00169 const Schema *getSchema() const;
00170
00176 virtual Status setDatabase(Database *mdb);
00177
00184 Status getExtent(Collection *&extent, Bool reload = False) const;
00185
00192 Status getComponents(Collection *&components, Bool reload = False) const;
00193
00199 Status setExtentImplementation(const IndexImpl *idximpl);
00200
00205 IndexImpl *getExtentImplementation() const;
00206
00211 Size getIDRObjectSize() const {return idr_objsz;}
00212
00220 Size getIDRObjectSize(Size *psize, Size *vsize = 0, Size *isize = 0) const;
00221
00228 Status add(ClassComponent *comp, Bool incrRefCount = True);
00229
00237 Status add(unsigned int w, ClassComponent * comp, Bool incrRefCount = True);
00238
00245 Status add(unsigned int w, AttributeComponent *comp);
00246
00253 Status suppress(unsigned int w, ClassComponent *comp);
00254
00261 Status suppress(unsigned int w, AttributeComponent *comp);
00262
00268 Status suppress(ClassComponent *comp);
00269
00275 Status getDefaultInstanceDataspace(const Dataspace *&instance_dataspace) const;
00276
00282 Status setDefaultInstanceDataspace(const Dataspace *instance_dataspace);
00283
00290 Status getInstanceLocations(ObjectLocationArray &locarr,
00291 Bool include_subclasses = False);
00292
00299 Status moveInstances(const Dataspace *dataspace,
00300 Bool include_subclasses = False);
00301
00306 Bool isSystem() const {return (m_type == System) ? True : False;}
00307
00312 Class::MType getMType() const {return m_type;}
00313
00318 virtual Class *asClass() {return this;}
00319
00324 virtual const Class *asClass() const {return this;}
00325
00326 Status setValue(Data);
00327 Status getValue(Data *) const;
00328
00329 virtual Object * newObj(Database * = NULL) const;
00330 virtual Object * newObj(Data, Bool _copy = True) const;
00331
00336 virtual Status create();
00337
00342 virtual Status update();
00343
00344 virtual Status remove(const RecMode* = RecMode::NoRecurs);
00345
00353 virtual Status trace(FILE *fd = stdout, unsigned int flags = 0,
00354 const RecMode *recmode = RecMode::FullRecurs) const;
00355
00363 static Bool isClass(Database *db, const Oid& cl_oid, const Oid& oid);
00364
00370 Bool compare(const Class *cl) const;
00371
00377 Bool compare_l(const Class *cl) const;
00378
00385 Status isSuperClassOf(const Class *cl, Bool *is) const;
00386
00393 Status isSubClassOf(const Class *cl, Bool *is) const;
00394
00402 Status getSubClasses(Class **&subclasses, unsigned int &subclass_count,
00403 Bool sort_down_to_top = True) const;
00404
00412 Status isObjectOfClass(const Object *o, Bool *is, Bool issub) const;
00413
00422 Status isObjectOfClass(const Oid *o_oid, Bool *is, Bool issub,
00423 Class **po_class = NULL) const;
00424
00429 unsigned int getAttributesCount(void) const;
00430
00436 const Attribute *getAttribute(unsigned int n) const;
00437
00443 const Attribute *getAttribute(const char *nm) const;
00444
00451 virtual Status setAttributes(Attribute **agr, unsigned int base_n);
00452
00458 inline const Attribute **getAttributes(unsigned int& cnt) const {
00459 cnt = items_cnt;
00460 return (const Attribute **)items;
00461 }
00462
00467 inline const Attribute **getAttributes() const {
00468 return (const Attribute **)items;
00469 }
00470
00477 Status getComp(const char *mcname, ClassComponent *&comp) const;
00478
00484 Method **getMethods(unsigned int& mth_cnt);
00485
00491 const Method **getMethods(unsigned int& mth_cnt) const;
00492
00500 Status getMethod(const char *name, Method *&mth,
00501 Signature *sign = 0);
00502
00510 Status getMethod(const char *name, const Method *&mth,
00511 Signature *sign = 0) const;
00512
00517 unsigned int getMethodCount() const;
00518
00525 Status getMethodCount(const char *name, unsigned int &cnt) const;
00526
00532 Trigger **getTriggers(unsigned int& cnt);
00533
00539 const Trigger **getTriggers(unsigned int& cnt) const;
00540
00546 ClassVariable **getVariables(unsigned int& cnt);
00547
00553 const ClassVariable **getVariables(unsigned int& cnt) const;
00554
00561 Status getVariable(const char *name, ClassVariable *&rvar);
00562
00569 Status getVariable(const char *name, const ClassVariable *&rvar) const;
00570
00571 virtual Status generateCode_C(Schema *,
00572 const char *prefix,
00573 const GenCodeHints &,
00574 const char *stubs,
00575 FILE *fdh, FILE *fdc, FILE *, FILE *,
00576 FILE *, FILE *);
00577
00578 virtual Status generateCode_Java(Schema *,
00579 const char *prefix,
00580 const GenCodeHints &,
00581 FILE *);
00582
00583 virtual Status generateMethodBody_C(Schema *, GenContext *,
00584 GenContext *, GenContext *,
00585 GenContext *, GenContext *);
00586
00587 virtual Status generateMethodBodyBE_C(Schema *, GenContext *,
00588 GenContext *, Method *);
00589
00590 virtual Status generateTriggerBody_C(Schema *m, GenContext *,
00591 Trigger *);
00592
00593 virtual Status generateMethodBodyFE_C(Schema *, GenContext *,
00594 Method *);
00595
00596 virtual Status generateClassComponent_C(GenContext *);
00597
00598 virtual Status generateAttrComponent_C(GenContext *);
00599
00600 virtual Status checkInverse(const Schema *) const;
00601
00602 enum CompIdx {
00603 Variable_C,
00604 Method_C,
00605 TrigCreateBefore_C,
00606 TrigCreateAfter_C,
00607 TrigUpdateBefore_C,
00608 TrigUpdateAfter_C,
00609 TrigLoadBefore_C,
00610 TrigLoadAfter_C,
00611 TrigRemoveBefore_C,
00612 TrigRemoveAfter_C,
00613 ComponentCount_C
00614 };
00615
00620 const LinkedList *getCompList() const;
00621
00627 const LinkedList *getCompList(CompIdx idx) const;
00628
00629 enum AttrCompIdx {
00630 UniqueConstraint_C,
00631 NotnullConstraint_C,
00632 CardinalityConstraint_C,
00633 Index_C,
00634 CollectionImpl_C,
00635 AttrComponentCount_C
00636 };
00637
00644 Status getAttrComp(const char *mcname, AttributeComponent *&comp) const;
00645
00651 Status getAttrCompList(const LinkedList *&list);
00652
00659 Status getAttrCompList(AttrCompIdx idx, const LinkedList *&list);
00660
00667 virtual int genODL(FILE *fd, Schema *m) const;
00668
00673 Bool isFlatStructure() const;
00674
00678 virtual ~Class();
00679
00680
00681
00682
00683 protected:
00684 Class *parent;
00685 char *name;
00686 char *aliasname;
00687 char *canonname;
00688 const Dataspace *instance_dataspace;
00689 short instance_dspid;
00690 Bool mustCreateComps;
00691 IndexImpl *idximpl;
00692
00693 Size idr_psize, idr_vsize, idr_inisize;
00694 Size idr_objsz;
00695
00696 Bool attrs_complete;
00697 Oid parent_oid;
00698 Oid coll_oid;
00699 Collection *extent;
00700 Collection *components;
00701 LinkedList *complist, *clist[ComponentCount_C];
00702 LinkedList *attr_complist, *attr_clist[AttrComponentCount_C];
00703
00704 MType m_type;
00705
00706
00707 virtual Bool compare_perform(const Class *cl,
00708 Bool compClassOwner,
00709 Bool compNum,
00710 Bool compName,
00711 Bool inDepth) const;
00712 virtual void garbage();
00713 Status setNameRealize(const char *);
00714 Status trace_comps(FILE *, int, unsigned int, const RecMode *) const;
00715 Status trace_common(FILE *, int, unsigned int, const RecMode *) const;
00716 Bool items_set;
00717 unsigned int items_cnt;
00718 Attribute ** items;
00719 void free_items();
00720 virtual Status trace_realize(FILE*, int, unsigned int, const RecMode *) const;
00721 Status check_items(Attribute **, int);
00722 Bool isFlat;
00723 Bool isFlatSet;
00724 void setPName(const char *);
00725 void codeExtentCompOids(Size);
00726
00727
00728
00729
00730 private:
00731 Bool is_root;
00732 char *tied_code;
00733 Bool sort_down_to_top;
00734 Bool subclass_set;
00735 Class **subclasses;
00736 unsigned int subclass_count;
00737 Schema *sch;
00738 unsigned int num;
00739 Oid extent_oid, comp_oid;
00740 Bool partially_loaded;
00741 Bool setup_complete;
00742
00743 friend class Schema;
00744 friend class ClassPeer;
00745
00746 virtual Status realize(const RecMode* = RecMode::NoRecurs);
00747 void _init(const char *);
00748 virtual void newObjRealize(Object *) const;
00749 Status setupInherit();
00750 Status scanComponents();
00751 Status triggerManage(Trigger *);
00752 Status sort(Bool sort_down_to_top) const;
00753 void setNum(unsigned int _num) {num = _num;};
00754
00755 void genODL(FILE *fd, Schema *m, Attribute *attr) const;
00756 Status makeAttrCompList();
00757 void compAddGenerate(GenContext *ctx, FILE *fd);
00758 void pre_release();
00759
00760
00761
00762
00763 public:
00764 static void init(void);
00765 static void _release(void);
00766 static int RemoveInstances;
00767 Status manageDataspace(short dspid);
00768 void setInstanceDspid(short dspid);
00769 short get_instdspid() const;
00770 void setSchema(Schema *_sch) {sch = _sch;}
00771 virtual Status compile(void);
00772 const char *getAliasName() const {return (aliasname ? aliasname : name);}
00773 const char *getStrictAliasName() const {return aliasname;}
00774 void setAliasName(const char *_aliasname) {
00775 free(aliasname);
00776 aliasname = (_aliasname ? strdup(_aliasname) : 0);
00777 }
00778 const char *getCanonicalName() const {return (canonname ? canonname : name);}
00779 void setCanonicalName(const char *_canonname) {
00780 free(canonname);
00781 canonname = (_canonname ? strdup(_canonname) : 0);
00782 }
00783 Status setInSubClasses(ClassComponent *, Bool);
00784 unsigned int getMagorder() const;
00785
00786 void unmakeAttrCompList();
00787 static const char *getSCName(const char *);
00788 static Status makeClass(Database *db, const Oid &oid,
00789 int, const char *, Bool &, Class *&cl);
00790 virtual Status postCreate();
00791 Bool isRootClass() const {return is_root;}
00792 void setIsRootClass() {is_root = True;}
00793 Status setup(Bool, Bool = False);
00794 static const char *classNameToCName(const char *name);
00795 virtual void revert(Bool) { }
00796 void setTiedCode(char *);
00797 char *getTiedCode();
00798 virtual Status createComps();
00799 void setExtentCompOid(const Oid &, const Oid &);
00800 void setPartiallyLoaded(Bool _partially_loaded) {partially_loaded = _partially_loaded;}
00801 void setExtentImplementation(const IndexImpl *, Bool);
00802
00803 static EnumClass *makeBoolClass();
00804 static Bool isBoolClass(const char *);
00805 static Bool isBoolClass(const Class *cls) {
00806 return isBoolClass(cls->getName());
00807 }
00808
00809 Bool compare(const Class *cl,
00810 Bool compClassOwner,
00811 Bool compNum,
00812 Bool compName,
00813 Bool inDepth) const;
00814
00815
00816 Bool isAttrsComplete() const {return attrs_complete;}
00817 Bool isSetupComplete() const {return setup_complete;}
00818 Bool isPartiallyLoaded() const {return partially_loaded;}
00819
00820 virtual Status attrsComplete();
00821 Status setupComplete();
00822 virtual Status loadComplete(const Class *);
00823 Status wholeComplete();
00824
00825 void setSetupComplete(Bool _setup_complete) {
00826 setup_complete = _setup_complete;
00827 }
00828
00829 Class(const Oid&, const char *);
00830 Status clean(Database *db);
00831
00832
00833 virtual void decode(void * hdata,
00834 const void * xdata,
00835 Size incsize,
00836 unsigned int nb = 1) const;
00837
00838 virtual void encode(void * xdata,
00839 const void * hdata,
00840 Size incsize,
00841 unsigned int nb = 1) const;
00842
00843 virtual int cmp(const void * xdata,
00844 const void * hdata,
00845 Size incsize,
00846 unsigned int nb = 1) const;
00847 };
00848
00849 class ClassPtr : public ObjectPtr {
00850
00851 public:
00852 ClassPtr(Class *o = 0) : ObjectPtr(o) { }
00853
00854 Class *getClass() {return dynamic_cast<Class *>(o);}
00855 const Class *getClass() const {return dynamic_cast<Class *>(o);}
00856
00857 Class *operator->() {return dynamic_cast<Class *>(o);}
00858 const Class *operator->() const {return dynamic_cast<Class *>(o);}
00859 };
00860
00861 typedef std::vector<ClassPtr> ClassPtrVector;
00862
00863 extern Class
00864 *Object_Class,
00865
00866 *Class_Class,
00867 *BasicClass_Class,
00868 *EnumClass_Class,
00869 *AgregatClass_Class,
00870 *StructClass_Class,
00871 *UnionClass_Class,
00872
00873 *Instance_Class,
00874 *Basic_Class,
00875 *Enum_Class,
00876 *Agregat_Class,
00877 *Struct_Class,
00878 *Union_Class,
00879 *Schema_Class,
00880 *Bool_Class,
00881
00882 *CollectionClass_Class,
00883 *CollSetClass_Class,
00884 *CollBagClass_Class,
00885 *CollListClass_Class,
00886 *CollArrayClass_Class,
00887
00888 *Collection_Class,
00889 *CollSet_Class,
00890 *CollBag_Class,
00891 *CollList_Class,
00892 *CollArray_Class;
00893
00894 class AttrNative;
00895
00896 extern struct InstanceInfo {
00897 const char *name;
00898 int items_cnt;
00899 AttrNative **items;
00900 } class_info[];
00901
00906 }
00907
00908 #endif