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

Generated on Wed May 31 15:27:18 2006 for TNTsdk by  doxygen 1.3.8-20040913