Class.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_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     // Class Interface
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     // Class Protected Part
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     //virtual Bool compare_perform(const Class *) const;
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     // Class Private Part
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     // Class Restricted Access (conceptually private)
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     // completion management
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     // XDR
00833     virtual void decode(void * hdata, // to
00834                         const void * xdata, // from
00835                         Size incsize, // temporarely necessary 
00836                         unsigned int nb = 1) const;
00837 
00838     virtual void encode(void * xdata, // to
00839                         const void * hdata, // from
00840                         Size incsize, // temporarely necessary 
00841                         unsigned int nb = 1) const;
00842 
00843     virtual int cmp(const void * xdata,
00844                     const void * hdata,
00845                     Size incsize, // temporarely necessary 
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

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