home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Demos / OOFILE / Buildable, limited OOFILE / OOFILE headers / oofrel.hpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-27  |  4.9 KB  |  206 lines  |  [TEXT/CWIE]

  1. #ifndef H_OOFREL
  2. #define H_OOFREL
  3. // COPYRIGHT 1994 A.D. Software, All rights reserved
  4.  
  5. // public layer of OOFILE database
  6.  
  7. #include "oof2.hpp"
  8.  
  9. class dbRelRefBase : public dbClass, public OOF_mixRelChainEndPoint
  10. {
  11. public:
  12.     dbRelRefBase(dbRelHalf* ref=0, unsigned long maxLinks=0) : 
  13.                 mThisLinkRelHalf(ref),
  14.                 mMinLinks(0),
  15.                 mMaxLinks(maxLinks)
  16.     {};
  17.     
  18.     void newRecord();
  19. // recordwise access
  20.     void start();
  21.     bool more();
  22.     void next();
  23.     unsigned long count();
  24.     bool gotoRelativeRecord(unsigned long);
  25.     
  26. protected:
  27.     void LogTransition();
  28.     void BuildRelChainToTable();
  29.     dbTable* RefersToTable();
  30.     void SetRelHalfByWhichWeNavigate(dbRelHalf*);
  31. // data storage
  32.     dbRelHalf*    mThisLinkRelHalf;
  33.     unsigned long mMinLinks, mMaxLinks;
  34.     friend class dbRelHalf;
  35. };
  36.  
  37.  
  38. class dbRelRef : public dbRelRefBase
  39. {
  40. public:
  41.     dbRelRef(dbRelHalf* ref=0) : dbRelRefBase(ref, 1 /* only 1 related value allowed */) {};
  42. };
  43.  
  44.  
  45. class dbRelSet : public dbRelRefBase
  46. {
  47. public:
  48.     dbRelSet(dbRelHalf* ref=0) : dbRelRefBase(ref) {};
  49. };
  50.  
  51.  
  52.  
  53. class dbRelationship : public dbClass {
  54. public:
  55.     dbRelationship(dbRelRefBase&, dbRelRefBase&, const char* name=0);
  56.     dbRelationship(dbRelRefBase&, dbRelRefBase&, dbField& joinLeft, dbField& joinRight, const char* name=0);
  57.     dbRelationship(dbRelHalf* lhs=0, dbRelHalf* rhs=0);
  58.     ~dbRelationship();
  59.     
  60.     void buildRelationship();
  61.                 
  62.     dbRelationship& names(const char*, const char*);
  63.     dbRelationship& tables(dbTable*, dbTable*);
  64.     dbRelationship& tables(dbTable&, dbTable&);
  65.     dbRelationship& joinFields(dbField*, dbField*);
  66.     dbRelationship& joinFields(dbField&, dbField&);
  67.     void lhsOwnsRHSasParts();
  68.     void rhsOwnsLHSasParts();
  69.     
  70.     void lhs(dbTable*, dbRelRefBase& linkFld, const char*name=0);
  71.     void rhs(dbTable*, dbRelRefBase& linkFld, const char*name=0);
  72.     void lhs(dbTable&, dbRelRefBase& linkFld, const char*name=0);
  73.     void rhs(dbTable&, dbRelRefBase& linkFld, const char*name=0);
  74.     void lhs(dbField* joinOver, dbRelRefBase& linkFld, const char* name=0);
  75.     void rhs(dbField* joinOver, dbRelRefBase& linkFld, const char* name=0);
  76.     void lhs(dbField& joinOver, dbRelRefBase& linkFld, const char* name=0);
  77.     void rhs(dbField& joinOver, dbRelRefBase& linkFld, const char* name=0);
  78.     
  79.     virtual void describe(ostream&);
  80.     void joinsUpdateFields(bool);
  81.     
  82. protected:
  83. enum PartSides { neither, lhsIsPart, rhsIsPart };
  84. // data storage
  85.     dbRelHalf  *mlhs, *mrhs;
  86.     OOF_String mName;
  87.     PartSides mPartSides;
  88.     bool mJoinUpdatesJoinField;
  89.     
  90. public:
  91.     static bool sAllJoinsUpdateJoinField;
  92.     
  93.     friend class dbConnect;
  94. };
  95.  
  96.  
  97. class dbRelHalf : public dbClass {
  98. public:
  99.     dbRelHalf(dbTable* tbl, dbRelRefBase& linkFldPtr, const char* name=0) :
  100.                     mTable(tbl),
  101.                     mInverseTable(0),
  102.                     mLinkfield(linkFldPtr),
  103.                     mName(name),
  104.                     mJoinField(0),
  105.                     mJoinToField(0),
  106.                     mPartRelation(false)
  107.                     {};
  108.  
  109.     dbRelHalf(dbField* joinOver, dbRelRefBase& linkFldPtr, const char* name=0);
  110.  
  111.     dbRelHalf(dbRelRefBase& linkFldPtr) :
  112.                     mTable(0),
  113.                     mInverseTable(0),
  114.                     mLinkfield(linkFldPtr),
  115.                     mName(0),
  116.                     mJoinField(0),
  117.                     mJoinToField(0),
  118.                     mPartRelation(false)
  119.                     {};
  120.                     
  121.     virtual ~dbRelHalf() {};
  122.  
  123.     void buildRelationship(dbTable* inverseTable);
  124.  
  125.     virtual void describe(ostream&);
  126.     dbTable* relatesToTable() const;
  127.     bool rhsbackendIsThisTable(const OOF_tableBackend*) const;
  128.     void refreshContext(dbTable*);
  129.     void updateJoinField(dbTable*);    
  130.     dbRelChain* askTableToBuildValidChain(dbRelChain*);
  131.  
  132.  protected:
  133. // data storage
  134.     dbTable *mTable, *mInverseTable;
  135.     dbRelRefBase& mLinkfield;
  136.     OOF_String mName;
  137.     dbField *mJoinField, *mJoinToField;
  138.     bool mPartRelation;
  139. public:
  140.     bool mJoinUpdatesJoinField;
  141.  
  142.     friend class dbRelationship;    
  143.     friend class dbTable;
  144. };
  145.  
  146.  
  147. class dbRelChain : public OOF_Dictionary {
  148. public:
  149.     dbRelChain(unsigned int numSlots=1) :
  150.                     OOF_Dictionary(numSlots),
  151.                     mTablesList(0),
  152.                     mContextValid(false)
  153.     {};
  154.     dbRelChain(const dbRelChain&) {assert(0);};
  155.     virtual ~dbRelChain();
  156.     dbRelChain* buildChain();
  157.     void validateContext();
  158.     void baseContextHasChanged();
  159.     void saveRecord();
  160.     void deleteRecord();
  161.     void unloadRecord();
  162.     dbTable* getFinalTable();
  163.     dbField* getFinalField(fieldNumT);
  164.     void newRecord();
  165.     void propagateJoinCopy();
  166.     
  167. // recordwise access
  168.     void startRelated();
  169.     bool moreRelated();
  170.     void nextRelated();
  171.     unsigned long countRelated();
  172.     bool gotoRelativeRecord(unsigned long);
  173.     bool isStillJustACandidate();
  174.     
  175. private:
  176.     void ConvertToRealChain();
  177.     
  178. // data storage
  179.     OOF_DictRep* mTablesList;
  180.     bool mContextValid;
  181.     dbTable* mFinalTable;
  182.     
  183.     friend class dbTable;
  184. }; 
  185.  
  186.  
  187. class OOF_relChainList : public OOF_ExpandableLongArray
  188. {
  189. public:
  190.     OOF_relChainList(unsigned long numSlots=2, unsigned int expandBySlots=4) :
  191.                                             OOF_ExpandableLongArray(0, numSlots, expandBySlots)
  192.                                             {};
  193. // access protocol
  194.     void append(const dbRelChain*);
  195.     dbRelChain* match(dbRelChain*);
  196.     void baseContextHasChanged();
  197.     void propagateSave();
  198.     void propagateDelete();
  199.     void propagateUnload();
  200. };
  201.  
  202.  
  203.  
  204. // include inline definitions
  205. #include "oofrel.inl"
  206. #endif