dbase.h

Go to the documentation of this file.
00001 /**
00002  * \file rvc/dbase.h 
00003  * \brief interface for the RVCDBASE class.
00004  *
00005  * \if NODOC
00006  * $Id: dbase.h_v 1.23 2004/10/13 19:46:53 scowan Exp $
00007  *
00008  * $Log: dbase.h_v $
00009  * Revision 1.23  2004/10/13 19:46:53  scowan
00010  * Added flag.
00011  *
00012  * Revision 1.22  2004/10/06 20:05:00  dfriberg
00013  * Modified JOINFLAGS comments
00014  *
00015  * Revision 1.21  2004/07/02 15:43:16  scowan
00016  * Added remove dup rec method.
00017  *
00018  * Revision 1.20  2004/04/07 23:18:36  scowan
00019  * Added new copy flag.
00020  *
00021  * Revision 1.19  2004/02/19 22:47:11  scowan
00022  * Added static method.
00023  *
00024  * Revision 1.18  2004/01/02 15:53:18  scowan
00025  * Added resize to elem trans list.
00026  *
00027  * Revision 1.17  2003/12/03 21:28:03  scowan
00028  * Added methods to compare structures of database tables for a match.
00029  *
00030  * Revision 1.16  2003/11/12 18:49:42  dwilliss
00031  * new filter didn't implement a pure-virtual method that it needed to.
00032  *
00033  * Revision 1.15  2003/11/12 18:39:18  dwilliss
00034  * Added new getobjfilter
00035  *
00036  * Revision 1.14  2003/10/16 20:16:17  scowan
00037  * Passed mi string instead of file pointer for log in validate.
00038  *
00039  * Revision 1.13  2003/10/07 17:35:50  scowan
00040  * Object virtual method changes.
00041  *
00042  * Revision 1.12  2003/09/30 16:52:06  dwilliss
00043  * Doxygen
00044  *
00045  * Revision 1.11  2003/09/25 21:20:04  dwilliss
00046  * Fixed doxygen comment
00047  *
00048  * Revision 1.10  2003/09/15 13:49:45  fileserver!dwilliss
00049  * Doxygen
00050  *
00051  * Revision 1.9  2003/09/02 17:29:43  dwilliss
00052  * Added COPYTABLE_FreezeComputedFields flag
00053  * Removed COPYTABLE_SkipIdentity and COPYTABLE_ConvertIdentity per Steve's
00054  *    instructions
00055  *
00056  * Revision 1.8  2003/06/25 22:16:57  scowan
00057  * Added shape database to filter.
00058  *
00059  * Revision 1.7  2003/05/27 20:15:39  scowan
00060  * Added another filter.
00061  *
00062  * Revision 1.6  2003/05/27 17:57:51  scowan
00063  * Added is empty filter.
00064  *
00065  * Revision 1.5  2003/02/17 18:15:46  scowan
00066  * Added validate method.
00067  *
00068  * Revision 1.4  2002/12/06 15:15:08  scowan
00069  * Fixed for genator docs to establish the correct parent object.
00070  *
00071  * Revision 1.3  2002/10/04 22:04:52  scowan
00072  * Added new virtual method.
00073  *
00074  * Revision 1.2  2002/09/03 21:23:59  scowan
00075  * Updated elem trans list.
00076  *
00077  * Revision 1.1  2002/08/13 21:25:36  scowan
00078  * Initial revision
00079  *
00080  * Revision 1.29  2002/04/09 15:33:37  scowan
00081  * Moved open as subobject to dbase element.
00082  *
00083  * Revision 1.28  2002/04/05 17:55:34  scowan
00084  * Added a new friend.
00085  *
00086  * Revision 1.27  2002/04/05 17:19:38  scowan
00087  * Added open methods.
00088  *
00089  * Revision 1.26  2002/03/22 22:55:59  scowan
00090  * Added flag.
00091  *
00092  * Revision 1.25  2002/02/25 18:17:35  scowan
00093  * Made an elem trans list class for translaytion list management.
00094  *
00095  * Revision 1.24  2002/02/25 17:52:37  scowan
00096  * Added default "None" flag for enum flag types.
00097  *
00098  * Revision 1.23  2002/02/14 00:08:24  scowan
00099  * Added the bulk modify class.
00100  *
00101  * Revision 1.22  2002/02/11 17:39:23  scowan
00102  * Added another join database method.
00103  *
00104  * Revision 1.21  2002/01/31 16:22:31  scowan
00105  * Comment out protected methods for genator docs.
00106  *
00107  * Revision 1.20  2002/01/30 15:57:00  scowan
00108  * Added sml context creation method.
00109  *
00110  * Revision 1.19  2002/01/09 23:58:06  scowan
00111  * Moved some nested classes out for genator docs.
00112  *
00113  * Revision 1.18  2001/10/08 17:32:49  scowan
00114  * Nothing.
00115  *
00116  * Revision 1.17  2001/08/22 23:06:02  scowan
00117  * Added copy database method between different types.
00118  *
00119  * Revision 1.16  2001/06/26 16:54:59  scowan
00120  * Define label elemtype to find no database table.
00121  *
00122  * Revision 1.15  2001/06/25 20:48:18  scowan
00123  * Added new virtual method.
00124  *
00125  * Revision 1.14  2001/06/21 15:15:44  scowan
00126  * Added copy and join database methods.
00127  *
00128  * Revision 1.13  2001/06/19 22:16:44  scowan
00129  * Added ELEMTYPE to database filter.
00130  *
00131  * Revision 1.11  2001/06/14 16:04:57  scowan
00132  * Changed source trype.
00133  *
00134  * Revision 1.10  2001/06/13 21:27:58  scowan
00135  * Added rvc to method parameters.
00136  *
00137  * Revision 1.9  2001/06/13 20:09:52  scowan
00138  * Moved to RVC namespace.
00139  * Added make method.
00140  *
00141  * Revision 1.7  2001/06/11 22:52:34  scowan
00142  * Added simple copy method for tables.
00143  *
00144  * Revision 1.4  2001/05/31 19:35:55  scowan
00145  * Added method to append one list entry to a dblist.
00146  *
00147  * Revision 1.3  2001/05/24 20:43:46  scowan
00148  * Removed redundant methods.
00149  *
00150  * Revision 1.2  2001/05/24 14:53:24  scowan
00151  * Fixed UNIX, MAc errors.
00152  *
00153  * Revision 1.1  2001/05/23 20:36:09  scowan
00154  * Initial revision
00155  *
00156  * \endif
00157 **/
00158 
00159 //!   \class RVC::DBASE rvc/dbase.h
00160 //!   \brief Manages OBJTYPE_Database RVC objects.  
00161 //!
00162 //!   The interface currently wraps the MfDatabase functions.
00163 //!   
00164 //!   RVC Object Types that this class supports:
00165 //!      - OBJTYPE_Database
00166 //!      - OBJTYPE_RastDBase
00167 //!      - OBJTYPE_PointDBase
00168 //!      - OBJTYPE_LineDBase
00169 //!      - OBJTYPE_PolyDBase
00170 //!      - OBJTYPE_CADDBase
00171 //!      - OBJTYPE_TINDBase
00172 //!
00173 //!   Default RVC Object Type for this class: OBJTYPE_Database.
00174 //!
00175 //!   Valid parents for this class:
00176 //!      - OBJTYPE_File
00177 //!      - OBJTYPE_Folder
00178 
00179 
00180 #ifndef INC_RVC_DBASE_H
00181 #define INC_RVC_DBASE_H
00182 
00183 #ifndef INC_RVC_OBJECT_H
00184    #include <rvc/object.h>
00185 #endif   
00186 
00187 #ifndef INC_MI32_ELEMTYPE_H
00188    #include <mi32/elemtype.h>
00189 #endif
00190 
00191 #ifndef INC_MI32_SIMPLEAR_H
00192    #include <mi32/simplear.h>
00193 #endif
00194 
00195 #ifndef INC_MI32_RVCDBASE_H
00196    #include <mi32/rvcdbase.h>
00197 #endif
00198 
00199 #ifndef INC_RVC_GETOBJF_H
00200    #include <rvc/getobjf.h>
00201 #endif
00202 
00203 #ifndef GENERATING_DOXYGEN_OUTPUT
00204 struct DBCALLBACKSTRUCT;      // Forward Declarations
00205 struct SMLCONTEXT;
00206 #endif // GENERATING_DOXYGEN_OUTPUT
00207 
00208 namespace RVC {
00209 
00210 #ifndef GENERATING_DOXYGEN_OUTPUT
00211 class DBTABLE;
00212 class DBTABLE_STYLE;
00213 #endif // GENERATING_DOXYGEN_OUTPUT
00214 
00215 class DBASE : public RVC::OBJECT {
00216    public:
00217       enum COPYFLAG {
00218          COPYFLAG_None =                  0x00000000,
00219          COPYFLAG_TableLinks =            0x00000004,    //!< Copy table links instead of the tables themselves
00220          COPYFLAG_DemoteIdentityTables =  0x00000008,    //!< Demote identity tables in MfDatabaseJoin() because they can no longer exist
00221          COPYFLAG_MinimizeTableSize =     0x00000020,    //!< Minimize table sizes (convert Identity and OneToOne to OneRecordPerElement)
00222          COPYFLAG_DontRemoveRecords =     0x00000200,    //!< Do not remove records while copying
00223          COPYFLAG_RemoveStdAttribTables = 0x00000800,    //!< Remove standard attribute tables
00224          COPYFLAG_IgnoreStdAttribTables = 0x00040000,    //!< Ignore standard attribute tables
00225          COPYFLAG_CopyThemeTable =        0x01000000     //!< Copy theme tables, only if not joining tables
00226          };
00227       
00228       enum COPYTABLE {
00229          COPYTABLE_None =                 0x00000000,
00230          COPYTABLE_CopyLinks =            0x00000004,
00231          COPYTABLE_RemoveStdAttTables =   0x00000800,
00232          COPYTABLE_FreezeComputedFields = 0x00080000
00233          };
00234          
00235       //! Search flags for GetAttachedRecordList()
00236       enum FINDFLAG {
00237          FINDFLAG_AllAttached = 0,
00238          FINDFLAG_NoInternal = 1,
00239          FINDFLAG_OnlyDirect = 2,
00240          FINDFLAG_FirstMatch = 8
00241          };
00242 
00243       enum JOINFLAGS {
00244          JOINFLAG_None =            0x00000000,
00245          JOINFLAG_CopyThemeTable =  0x01000000,    //!< Copy theme tables, only if not joining tables
00246          JOINFLAG_OuterRight =      0x02000000,    //!< Right Outer (for Join)
00247          JOINFLAG_Union =           0x04000000,    //!< Union (RVC::DBTABLE::Combine only)
00248          JOINFLAG_Natural =         0x08000000,    //!< Natural Join (RVC::DBTABLE::Combine only)
00249          JOINFLAG_SameStrc =        0x10000000,    //!< Only table structure has to match
00250          JOINFLAG_SameNmSt =        0x30000000,    //!< Table structure and name has to match
00251          JOINFLAG_RemoveDups =      0x40000000,    //!< Remove duplicate records when joining
00252          JOINFLAG_Outer =           0x80000000     //!< Outer Union or Left Outer Join
00253          };
00254 
00255       #ifndef GENERATING_DOXYGEN_OUTPUT
00256       class BULKMODIFY;             //!< Forward Declarations
00257       friend class BULKMODIFY;
00258       class ELEMTRANSLIST;
00259       class GETOBJFILTER_ISCAPABLE;
00260       friend class GETOBJFILTER_ISCAPABLE;
00261       class GETOBJFILTER_ISNOTEMPTY;
00262       friend class GETOBJFILTER_ISNOTEMPTY;
00263       class GETOBJFILTER_ISSELECTABLE;
00264       friend class GETOBJFILTER_ISSELECTABLE;
00265       class INVERSEDBLISTSUSPEND;
00266       class OBSERVER;
00267       class TABLEITERATOR;
00268       friend class TABLEITERATOR;
00269       class CONST_TABLEITERATOR;
00270       friend class CONST_TABLEITERATOR;
00271       #endif // GENERATING_DOXYGEN_OUTPUT
00272          
00273       //! Constant iterator class
00274       //!
00275       //! This class is used to iterate through a parent rvc object's children.  This construct replaces the MfGetList() routines.
00276       //! See methods ChildListBegin() and ChildListEnd() for obtaining an child iterator
00277       class CONST_TABLEITERATOR {
00278       public:
00279          //! Default constructor
00280          CONST_TABLEITERATOR (
00281             ) : 
00282             m_TableNum(TABLE_InternalNode),
00283             m_CurrentObj(0)
00284             {}
00285 
00286          //! Internal constructor used by TableEnd() methods
00287          CONST_TABLEITERATOR (
00288             const RVC::DBASE* dbase,
00289             INT32 TableNum
00290             ) : 
00291             m_TableNum(TableNum),
00292             m_CurrentObj(dbase)
00293             {}
00294 
00295          //! Copy constructor
00296          CONST_TABLEITERATOR (
00297             const TABLEITERATOR& rhs
00298             ) : 
00299             m_TableNum(rhs.m_TableNum),
00300             m_CurrentObj(rhs.m_CurrentObj)
00301             {}
00302 
00303          //! Interanl constructor used by TableBegin() methods
00304          CONST_TABLEITERATOR (
00305             const RVC::DBASE* dbase
00306             );
00307 
00308          //! Destructor
00309          virtual ~CONST_TABLEITERATOR (
00310             ) {}
00311 
00312          //! Assignment
00313          CONST_TABLEITERATOR& operator= (
00314             const CONST_TABLEITERATOR& rhs
00315             ) {
00316             if (this != &rhs) {
00317                m_TableNum = rhs.m_TableNum;
00318                m_CurrentObj = rhs.m_CurrentObj;
00319                }
00320             return (*this);
00321             }
00322 
00323          //! Dereference
00324          const INT32& operator* (
00325             ) const { return (m_TableNum); }
00326 
00327          //! Dereference arrow
00328          const INT32* operator-> (
00329             ) const { return (&**this); }
00330 
00331          //! Pre-increment
00332          CONST_TABLEITERATOR& operator++ (
00333             );
00334 
00335          //! Comparison for equality
00336          bool operator== (
00337             const CONST_TABLEITERATOR& rhs
00338             ) const { return (m_TableNum == rhs.m_TableNum && m_CurrentObj == rhs.m_CurrentObj); }
00339 
00340          //! Comparison for inequality
00341          bool operator!= (
00342             const CONST_TABLEITERATOR& rhs
00343             ) const { return (!(*this == rhs)); }
00344 
00345       protected:
00346          INT32 m_TableNum;
00347          const DBASE *m_CurrentObj;
00348          };
00349 
00350 
00351       //! Iterator class
00352       //!
00353       //! This class is used to iterate through a parent rvc object's children.  This construct replaces the MfGetList() routines.
00354       //! See methods ChildListBegin() and ChildListEnd() for obtaining an child iterator
00355       class TABLEITERATOR : public CONST_TABLEITERATOR {
00356          public:
00357 
00358             //! Default constructor
00359             TABLEITERATOR (
00360                ) : CONST_TABLEITERATOR() {}
00361 
00362             //! Copy constructor
00363             TABLEITERATOR (
00364                CONST_TABLEITERATOR& rhs
00365                ) : CONST_TABLEITERATOR(rhs) {}
00366 
00367             //! Internal constructor used by TableBegin() methods
00368             TABLEITERATOR (
00369                const RVC::DBASE* dbase
00370                ) : CONST_TABLEITERATOR(dbase) {}
00371 
00372             //! Internal constructor used by TableEnd() methods
00373             TABLEITERATOR (
00374                const RVC::DBASE* dbase,
00375                INT32 TableNum
00376                ) : CONST_TABLEITERATOR(dbase, TableNum) {}
00377 
00378             //! Dereference
00379             const INT32& operator* (
00380                ) const { return (m_TableNum); }
00381 
00382             //! Dereference arrow
00383             const INT32* operator-> (
00384                ) const { return (&**this); }
00385 
00386             //! Pre-increment
00387             TABLEITERATOR& operator++ (
00388                ) {
00389                CONST_TABLEITERATOR::operator++();
00390                return (*this);
00391                }
00392 
00393             //! Comparison for equality
00394             bool operator== (
00395                const TABLEITERATOR& rhs
00396                ) const { return (m_TableNum == rhs.m_TableNum && m_CurrentObj == rhs.m_CurrentObj); }
00397 
00398             //! Comparison for inequality
00399             bool operator!= (
00400                const TABLEITERATOR& obj
00401                ) const { return (!(*this == obj)); }
00402          };
00403 
00404       //! Default constructor
00405       DBASE (
00406          );
00407 
00408       //! Copy constructor
00409       DBASE (                       //! Copy Constructor
00410          const RVC::DBASE& rhs
00411          );
00412 
00413       //! Destructor
00414       virtual ~DBASE (
00415          );
00416 
00417       //! Assignment
00418       RVC::DBASE& operator= (
00419          const RVC::DBASE& rhs
00420          );
00421 
00422       //! Copy a database from the source to under the destination object using an element translation list
00423       ERRVALUE CopyDatabaseTo (
00424          RVC::OBJECT& DestParentObj,
00425          const SIMPLE_ARRAY<INT32>& TransList,
00426          COPYFLAG flags
00427          );
00428 
00429       //! Copy a database from the source to under the destination object using an element translation list
00430       ERRVALUE CopyDatabaseTo (
00431          RVC::OBJECT& DestParentObj,
00432          RVC::DBASE& DestDBaseObj,                 //!< To be filled in with the new database object
00433          const ELEMTRANSLIST& TransList,
00434          COPYFLAG flags
00435          );
00436 
00437       //! Copy a table from the source database to the destination database
00438       //! @return Table number of copied table or error if < 0 
00439       INT32 CopyTableTo (
00440          INT32 SrcTableNum,
00441          RVC::DBASE& DestDBase,
00442          COPYTABLE flags
00443          ) const;
00444 
00445       //! Create an SML context for the given database class instance
00446       ERRVALUE CreateSMLContext (
00447          SMLCONTEXT **pcontext               //!< SML context allocated and RETURNED
00448          );
00449 
00450       //! Compare table structures between two databases to determine which tables structurally
00451       //! match.  Returns the set of exact matching tables In the TableMatch array if the entry != -1
00452       ERRVALUE FindTableMatches (
00453          const RVC::DBASE& rhs,
00454          SIMPLE_ARRAY<INT32>& TableMatch     //!< Translation from lhs table number to rhs table number, -1 if no other table matches
00455          ) const;
00456 
00457       //! Flush cached records and build indexes if necessary
00458       ERRVALUE Flush (
00459          );
00460 
00461       //! Get list of field names that are key fields
00462       //! @return Number of key field names
00463       ERRVALUE GetKeyFieldNames (
00464          SIMPLE_ARRAY<RVC::OBJECTNAME>& FieldNames
00465          ) const;
00466 
00467       //! Determine the number of tables in the database
00468       //! @return Number of tables in the database
00469       INT32 GetNumTables (
00470          ) const;
00471          
00472       //! Get correct OBJTYPESET for all database OBJTYPE's
00473       //! @return OBJTYPESET for all database OBJTYPE's
00474       static RVC::OBJTYPESET GetObjTypeSet (
00475          );
00476          
00477       //! Build an inverse DB list for all DBlist entries
00478       ERRVALUE InverseDBListBuild (
00479          );
00480 
00481       //! Resume maintainence of the inverse DB list from a InverseDBListSuspend() call
00482       void InverseDBListResume (
00483          );
00484 
00485       //! Suspend maintainence of the inverse DB lists.  Used if doing multiple database changes
00486       void InverseDBListSuspend (
00487          );
00488 
00489       //! Join a database from the source to the destination database object using an element translation list
00490       ERRVALUE JoinDatabaseTo (
00491          RVC::DBASE& DestDBaseObj,
00492          const SIMPLE_ARRAY<INT32>& TransList,
00493          COPYFLAG CopyFlags,
00494          JOINFLAGS JoinFlags
00495          );
00496 
00497       //! Join a database from the source to the destination database object using an element translation list
00498       ERRVALUE JoinDatabaseTo (
00499          RVC::DBASE& DestDBaseObj,
00500          const ELEMTRANSLIST& TransList,
00501          COPYFLAG CopyFlags,
00502          JOINFLAGS JoinFlags
00503          );
00504 
00505       //! Make a new database object
00506       ERRVALUE Make (
00507          const RVC::OBJECT& parent,          //!< Parent object to create database under
00508          const RVC::OBJECTNAME& name,           //!< Name of database object
00509          const RVC::OBJECTDESC& desc,           //!< Database object description
00510          const char* Source = 0                 //!< Source of database creation, default is GetAppName()
00511          );
00512 
00513       //! Make a new database object
00514       ERRVALUE Make (
00515          const RVC::OBJITEM& ObjItem,
00516          const char* Source = 0                 //!< Source of database creation, default is GetAppName()
00517          );
00518 
00519       //! Remove duplicate records from all tables (except for ATTACHMENT_Identity and ATTACHMENT_OneToOne) tables
00520       ERRVALUE RemoveDuplicateRecords (
00521          );
00522          
00523       //! Remove unattached records from all tables
00524       ERRVALUE RemoveUnattachedRecords (
00525          );
00526          
00527       //! Get a beginning constant table iterator 
00528       CONST_TABLEITERATOR TableBegin (
00529          ) const {
00530          m_NumTables = (IsOpen()) ? GetNumTables() : 0;
00531          return (CONST_TABLEITERATOR(this));
00532          }
00533 
00534       //! Get a beginning table iterator 
00535       TABLEITERATOR TableBegin (
00536          ) {
00537          m_NumTables = (IsOpen()) ? GetNumTables() : 0;
00538          return (TABLEITERATOR(this));
00539          }
00540 
00541       //! Get a ending constant table iterator 
00542       CONST_TABLEITERATOR TableEnd (
00543          ) const { return (CONST_TABLEITERATOR(this, m_NumTables)); }
00544 
00545       //! Get a ending table iterator 
00546       TABLEITERATOR TableEnd (
00547          ) { return (TABLEITERATOR(this, m_NumTables)); }
00548          
00549       //! Validate the database
00550       ERRVALUE Validate (
00551          MISTRING& LogString
00552          );
00553 
00554       //! Validate new table and field names against existing tables and fields
00555       ERRVALUE ValidateTableName (
00556          RVC::OBJECTNAME& name,                 //!< Table name to validate, can be changed
00557          SIMPLE_ARRAY<RVC::OBJECTNAME>& finfo   //!< Field names to validate, can be changed
00558          ) const;
00559 
00560    protected:
00561 
00562       #ifndef GENERATING_DOXYGEN_OUTPUT
00563       INT32 AppendDBList (
00564          ELEMTYPE ElemType, 
00565          INT32 ElemNum,
00566          const SIMPLE_ARRAY<DBLISTELMT>& DBList
00567          );
00568 
00569       INT32 AppendDBList (
00570          ELEMTYPE ElemType, 
00571          INT32 ElemNum,
00572          const DBLISTELMT& item
00573          );
00574 
00575       ERRVALUE CleanDBList (
00576          ELEMTYPE ElemType
00577          );
00578 
00579       //! Get records attached to the specified element for all tables
00580       ERRVALUE GetAttachedRecordList (
00581          ELEMTYPE ElemType,
00582          INT32 ElemNum,
00583          SIMPLE_ARRAY<DBLISTELMT>& dblist,   //!< List of attachments allocated and returned
00584          FINDFLAG FindFlag = FINDFLAG_AllAttached,
00585          INT32 BaseTableNum = -1
00586          ) const;
00587          
00588       INT32 GetDBListItemSize (
00589          ELEMTYPE ElemType,
00590          INT32 ElemNum,
00591          bool ExcludeInternal = false
00592          ) const;
00593 
00594       INT32 GetDBListMaxItemSize (
00595          ELEMTYPE ElemType
00596          ) const;
00597 
00598       INT32 GetDBListNumElements (
00599          ELEMTYPE ElemType
00600          ) const;
00601 
00602       bool IsNodeAPoint (
00603          INT32 NodeNum,
00604          SIMPLE_ARRAY<DBLISTELMT>& DBList
00605          ) const;
00606          
00607       //! Open the database.  If a database object does not exist, make one
00608       ERRVALUE OpenAsSubobject (
00609          const OBJECT& parent,            //!< Parent object to find and/or create database under
00610          OPENMODE mode = OPENMODE_Read,
00611          MDLGPARENT widget = 0               //!< Parent dialog handle, 0 for default handle
00612          );
00613 
00614       INT32 ReadDBList (
00615          ELEMTYPE ElemType,
00616          INT32 ElemNum,
00617          SIMPLE_ARRAY<DBLISTELMT>& DBList
00618          ) const;
00619 
00620       ERRVALUE ResizeDBList (
00621          ELEMTYPE ElemType,
00622          INT32 NumItems
00623          );
00624 
00625       ERRVALUE ResizeDBListItem (
00626          ELEMTYPE ElemType,
00627          INT32 ElemNum,
00628          INT32 NumItems
00629          );
00630 
00631       ERRVALUE SwapDBList (
00632          ELEMTYPE ElemType,
00633          INT32 Item1,
00634          INT32 Item2
00635          );
00636 
00637       INT32 WriteDBList (
00638          ELEMTYPE ElemType,
00639          INT32 ElemNum,
00640          const SIMPLE_ARRAY<DBLISTELMT>& DBList
00641          );
00642 
00643       INT32 UnattachDBList (
00644          ELEMTYPE ElemType,
00645          INT32 ElemNum,
00646          const SIMPLE_ARRAY<DBLISTELMT>& DBList
00647          );
00648 
00649       ERRVALUE UpdateDBListNumElements (
00650          ELEMTYPE ElemType, 
00651          INT32 NumElements
00652          );
00653 
00654       int m_DBaseID;
00655 
00656       #endif // GENERATING_DOXYGEN_OUTPUT
00657    private:
00658       #ifndef GENERATING_DOXYGEN_OUTPUT
00659 
00660       mutable INT32 m_NumTables;
00661 
00662       //! Implementation of RVC::OBJECT virtual methods
00663       virtual ERRVALUE v_CloseObject ();              //! Close the open object
00664       virtual OBJTYPE v_GetDftObjectType () const;
00665       virtual bool v_IsMultiObject () const;
00666       virtual bool v_IsObjectOpen () const;           //!< Is this object opened?
00667       virtual ERRVALUE v_OpenObject (OPENMODE OpenFlags, MDLGPARENT parent);              //! Open the database object
00668       virtual bool v_ValidateObjectType (const OBJTYPE otype) const;       //!< Validate the object type this class can handle
00669 
00670       INT32 FindTable (const OBJECTNAME& name) const;
00671          
00672       static void DatabaseCallbackFunc (DBCALLBACKSTRUCT *cb, void *data);
00673 
00674       friend class DBTABLE;
00675       friend class DBTABLE_STYLE;
00676       #endif // GENERATING_DOXYGEN_OUTPUT
00677    };
00678 
00679 DEFINE_ENUM_OPERATORS(DBASE::COPYFLAG);
00680 DEFINE_ENUM_OPERATORS(DBASE::COPYTABLE);
00681 DEFINE_ENUM_OPERATORS(DBASE::FINDFLAG);
00682 DEFINE_ENUM_OPERATORS(DBASE::JOINFLAGS);
00683 
00684 class DBASE::BULKMODIFY {
00685    public:
00686       BULKMODIFY (
00687          RVC::DBASE& dbase
00688          ) : m_dbase(dbase) {
00689          MfDatabaseBulkModifyBegin(dbase.m_DBaseID);
00690          }
00691          
00692       ~BULKMODIFY (
00693          ) {
00694          MfDatabaseBulkModifyEnd(m_dbase.m_DBaseID);
00695          }
00696          
00697    private:
00698       #ifndef GENERATING_DOXYGEN_OUTPUT
00699       RVC::DBASE& m_dbase;
00700       #endif // GENERATING_DOXYGEN_OUTPUT
00701    };
00702          
00703 
00704 //! This class is used in CopyDatabaseTo() and JoinDatabaseTo() for one <-> many conversions
00705 class DBASE::ELEMTRANSLIST {
00706    public:
00707       //! Constructor
00708       ELEMTRANSLIST (
00709          );
00710          
00711       //! Copy Constructor
00712       ELEMTRANSLIST (
00713          const ELEMTRANSLIST& rhs
00714          ) {Copy(rhs);}
00715          
00716       //! Destructor
00717       ~ELEMTRANSLIST (
00718          );
00719          
00720       //! Assignment operator
00721       ELEMTRANSLIST& operator= (
00722          const ELEMTRANSLIST& rhs
00723          ) {
00724          if (this != &rhs) Copy(rhs);
00725          return (*this);
00726          }
00727          
00728       //! Conversion operator for MfDatabaseJoinExt() call
00729       operator const DBELEMTRANSLIST* (
00730          ) const {return (m_TransList);}
00731          
00732       //! Add a destination element to the list
00733       ERRVALUE AddElement (
00734          INT32 SourceNum,
00735          INT32 DestNum
00736          );
00737    
00738       //! Get the number of source items in the translation list
00739       //! @return Number of source translation list items
00740       INT32 GetNumItems (
00741          ) const {return (m_TransList.GetNumItems());}
00742 
00743       //! Initialize the translist to the number of source elements
00744       ERRVALUE Initialize (
00745          INT32 NumItems             //!< Number of source elements
00746          );
00747          
00748       //! Resize the translist to the new number of source elements
00749       ERRVALUE Resize (
00750          INT32 NumItems             //!< Number of source elements
00751          );
00752          
00753    private:
00754       #ifndef GENERATING_DOXYGEN_OUTPUT
00755       SIMPLE_ARRAY<DBELEMTRANSLIST> m_TransList;
00756       
00757       void Copy (const ELEMTRANSLIST& rhs);
00758       #endif // GENERATING_DOXYGEN_OUTPUT
00759    };
00760 
00761 
00762 //! Database object selection filter to select either a database object or a geospatial object capable of holding a database subobject (existing or not)
00763 class DBASE::GETOBJFILTER_ISCAPABLE : public RVC::GETOBJFILTER, private RVC::OBJECT::FILTER {
00764    public:
00765       GETOBJFILTER_ISCAPABLE () {}
00766    private:
00767       #ifndef GENERATING_DOXYGEN_OUTPUT
00768       virtual bool Filter (const RVC::OBJECT& Object);
00769       virtual bool v_IsSelectable (const RVC::OBJITEM& objitem, int position);
00770       #endif // GENERATING_DOXYGEN_OUTPUT
00771    }; 
00772    
00773 
00774 //! Database object selection filter to determine if the database is not empty (has tables) and is selectable under the parent object
00775 class DBASE::GETOBJFILTER_ISNOTEMPTY : public RVC::GETOBJFILTER, private RVC::OBJECT::FILTER {
00776    public:
00777       GETOBJFILTER_ISNOTEMPTY () {}
00778    private:
00779       #ifndef GENERATING_DOXYGEN_OUTPUT
00780       virtual bool Filter (const RVC::OBJECT& Object);
00781       virtual bool v_HasSelectableSubObjects (const RVC::OBJITEM& objitem);
00782       virtual bool v_IsSelectable (const RVC::OBJITEM& objitem, int position);
00783       #endif // GENERATING_DOXYGEN_OUTPUT
00784    }; 
00785    
00786 
00787 //! Database object selection filter to determine if the database exists and is selectable under the parent object
00788 class DBASE::GETOBJFILTER_ISSELECTABLE : public RVC::GETOBJFILTER, private RVC::OBJECT::FILTER {
00789    public:
00790       GETOBJFILTER_ISSELECTABLE () {}
00791    private:
00792       #ifndef GENERATING_DOXYGEN_OUTPUT
00793       virtual bool Filter (const RVC::OBJECT& Object);
00794       virtual bool v_HasSelectableSubObjects (const RVC::OBJITEM& objitem);
00795       virtual bool v_IsSelectable (const RVC::OBJITEM& objitem, int position);
00796       #endif // GENERATING_DOXYGEN_OUTPUT
00797    }; 
00798 
00799 
00800 //! Manage suspend and resume state on inverse db list operations 
00801 class DBASE::INVERSEDBLISTSUSPEND {
00802    public:
00803       //! Constructor
00804       INVERSEDBLISTSUSPEND (
00805          RVC::DBASE& DBase,                  //!< Database to suspend
00806          bool Rebuild = false,            //!< Rebuild inverse DB lists after resume if true
00807          bool Condition = true            //!< Condition to suspend inverse DB lists, true to suspend
00808          ) :
00809          m_DBase(DBase),
00810          m_Rebuild(Rebuild),
00811          m_Condition(Condition)
00812          {
00813          if (m_DBase.IsOpen() && Condition) m_DBase.InverseDBListSuspend();
00814          }
00815          
00816       ~INVERSEDBLISTSUSPEND (
00817          ) {
00818          if (m_DBase.IsOpen() && m_Condition) {
00819             m_DBase.InverseDBListResume();
00820             if (m_Rebuild) m_DBase.InverseDBListBuild();
00821             }
00822          }
00823          
00824    private:
00825       #ifndef GENERATING_DOXYGEN_OUTPUT
00826       DBASE& m_DBase;
00827       bool m_Rebuild;
00828       bool m_Condition;
00829       #endif // GENERATING_DOXYGEN_OUTPUT
00830    };
00831 
00832    
00833 //! OBSERVER class for DBASE objects.  The SUBJECT class is DBASE.
00834 class DBASE::OBSERVER : public OBJECTOBSERVER {
00835    public:
00836 
00837       //! Types of table structural changes made, used in DBTABLE::OBSERVER::OnStructChanged()
00838       enum STRUCTCHANGE {
00839          STRUCTCHANGE_Name =              0x00000001,
00840          STRUCTCHANGE_Desc =              0x00000002,
00841          STRUCTCHANGE_ViewMode =          0x00000004,
00842          STRUCTCHANGE_Field =             0x00000008,       //!< Something in one or more fields changed 
00843          STRUCTCHANGE_FieldsAdded =       0x00000010,
00844          STRUCTCHANGE_Flags =             0x00000020,
00845          STRUCTCHANGE_AttachmentType =    0x00000040,
00846          STRUCTCHANGE_Encoding =          0x00000080,
00847          STRUCTCHANGE_DBEditorUpdate =    0x00000100,
00848          STRUCTCHANGE_DBEditorRebuild =   0x00000200
00849          }; 
00850 
00851       //! Constructor
00852       explicit OBSERVER (
00853          RVC::DBASE& dbase
00854          ) : OBJECTOBSERVER(dbase) {}
00855          
00856       //! Destructor
00857       virtual ~OBSERVER (
00858          ) {}
00859          
00860       //! Called if any change has occured, useful for setting IsDirty flags
00861       virtual void OnAnyChange (
00862          ) { return; }
00863 
00864       //! Called if an element entry is added to the dblist
00865       virtual void OnDBListAdd (
00866          ELEMTYPE ElemType,
00867          INT32 ElemNum
00868          ) { return; }
00869 
00870       //! Called if an element entry is modified in the dblist
00871       virtual void OnDBListChanged (
00872          ELEMTYPE ElemType,
00873          INT32 ElemNum
00874          ) { return; }
00875          
00876       //! Called when table structure information has changed
00877       virtual void OnStructChanged (
00878          INT32 TableNum,
00879          STRUCTCHANGE SubReason
00880          ) { return; }
00881          
00882       //! Called when a table is added to the database
00883       virtual void OnTableAdd (
00884          INT32 TableNum
00885          ) { return; }
00886          
00887       //! Called if a table is being dropped from the database
00888       virtual void OnTableDropBegin (
00889          INT32 TableNum
00890          ) { return; }
00891       
00892       //! Called if a table is dropped from the database
00893       virtual void OnTableDropEnd (
00894          INT32 TableNum
00895          ) { return; }
00896          
00897    private:
00898       #ifndef GENERATING_DOXYGEN_OUTPUT
00899       virtual void OnNotifyRaw (UINT32 reason, void *data);
00900       #endif // GENERATING_DOXYGEN_OUTPUT
00901    };
00902 
00903 
00904 class DBELEMTYPEFILTER : public OBJECT::FILTER {
00905    public:
00906 
00907       DBELEMTYPEFILTER (
00908          ELEMTYPE ElemType
00909          ) :
00910          m_ObjType(RVC::OBJTYPE_Database)
00911          {
00912          switch (ElemType) {
00913             case ELEMTYPE_Node: m_ObjType = OBJTYPE_All; break;
00914             case ELEMTYPE_Line: m_ObjType = OBJTYPE_Database_VectorLine; break;
00915             case ELEMTYPE_Point: m_ObjType = OBJTYPE_Database_VectorPoint; break;
00916             case ELEMTYPE_Polygon: m_ObjType = OBJTYPE_Database_VectorPolygon; break;
00917             case ELEMTYPE_Edge:
00918             case ELEMTYPE_Triangle: m_ObjType = OBJTYPE_Database_TIN; break;
00919             case ELEMTYPE_CAD: m_ObjType = OBJTYPE_Database_CAD; break;
00920             case ELEMTYPE_RasterCellValue: m_ObjType = OBJTYPE_Database_Raster; break;
00921             case ELEMTYPE_All: m_ObjType = OBJTYPE_Database_Shape; break;
00922             case ELEMTYPE_Label: m_ObjType = OBJTYPE_LAST; break;    //!< Database cannot exist for this type
00923             }
00924          }
00925 
00926       virtual bool Filter (
00927          const RVC::OBJECT& object
00928          ) {
00929          if (m_ObjType == OBJTYPE_All) {        //! Vector or TIN node database
00930             OBJECT parent;
00931             if (object.GetParent(parent) < 0) return (false);
00932             m_ObjType = (parent.GetObjectType() == OBJTYPE_Vector) ? OBJTYPE_Database_VectorPoint : OBJTYPE_Database_TIN;
00933             }
00934          return (object.GetObjectType() == m_ObjType);
00935          }
00936 
00937    private:
00938       #ifndef GENERATING_DOXYGEN_OUTPUT
00939       OBJTYPE m_ObjType;
00940       #endif // GENERATING_DOXYGEN_OUTPUT
00941    };
00942 
00943 }     //! End of RVC namespace
00944 
00945 #endif   //!< INC_RVC_DBASE_H

Generated on Tue Dec 14 13:18:44 2004 for TNTsdk by  doxygen 1.3.8-20040913