home *** CD-ROM | disk | FTP | other *** search
- // tabledef.cpp : MFC DAO TableDef specific functions
- //
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- // contains:
- //
- //BOOL IsExistentTable(CDaoDatabase *pDatabase, CString strTableName);
- //BOOL createNewTableDef(CDaoDatabase * pDatabase,
- // CDaoTableDef **ppTableDef,
- // CString strTableName);
- //BOOL appendTableDef(CDaoDatabase *pDatabase, CDaoTableDef *pTableDef);
- //BOOL openTableDef(CDaoDatabase * pDatabase, CDaoTableDef **ppTableDef,
- // CString strTableName);
- //BOOL getTableInfo(CDaoDatabase *pDatabase, CDaoTableDefInfo *pTableInfo,
- // int tableIndex, BOOL bReportErrors);
- //void deleteTable(CDaoDatabase *pDatabase, CString strTableName);
-
-
- #include "stdafx.h"
- #include "tabledef.h"
-
- // check for duplicate table name in tabledef collection
- // of database object
- // IN: pDatabase--pointer to database object whose tabledef collection we will
- // access
- // IN: strTableName--name of the table whose existence we want to check
- // RETURN: TRUE if the table already exists, FALSE otherwise
- BOOL IsExistentTable(CDaoDatabase *pDatabase, CString strTableName)
- {
- // if the database is non-existent, then the answer is obvious
- if (pDatabase == NULL)
- return FALSE;
-
- // initialize status indicator
- BOOL bDuplicateTableName = TRUE;
-
- // see if there is a table by this name already--duplicate
- // named tables are not accepted
- CDaoTableDefInfo tableInfo; // only needed for the call
-
- // MFC exception handler macros used
- TRY
- {
- // this call will throw an exception if there is no
- // table by the specified name--test for duplication
- pDatabase->GetTableDefInfo(strTableName, tableInfo);
- }
- CATCH (CDaoException, e)
- {
- // if this is an 'Item not found' exception, we are
- // cleared to create the table -- else this is
- // a duplicate tablename and we got another exception
- // which is irrelevant for our purposes
- if (e->m_pErrorInfo->m_lErrorCode == 3265)
- bDuplicateTableName = FALSE;
- }
- AND_CATCH (CMemoryException, e)
- {
- // do nothing
- ;
- }
- END_CATCH
-
- return bDuplicateTableName;
- }
-
- // wraps the CreateTableDef call with an exception handler and duplicate
- // name check
- // IN: pDatabase--pointer to database object whose tabledef collection we will
- // access
- // OUT: ppTableDef--pointer to pointer to tabledef we are creating
- // IN: strTableName--name of the table we want to create
- // RETURN: TRUE if creation succeeds, FALSE otherwise
- BOOL createNewTableDef(CDaoDatabase * pDatabase,
- CDaoTableDef **ppTableDef,
- CString strTableName)
- {
- // if the database is non-existent, then the answer is obvious
- if (pDatabase == NULL)
- return FALSE;
-
- // check for existing table with this name just to be safe
- if (IsExistentTable(pDatabase, strTableName))
- {
- AfxMessageBox(_T("A table by that name already exists."));
-
- // return FALSE since can't create duplicate table
- return FALSE;
- }
-
- // initialize creation failure indicator
- BOOL bCreateFailed = FALSE;
-
- // construct tabledef
- *ppTableDef = new CDaoTableDef(pDatabase);
-
- // failed to allocate so exit
- if ((*ppTableDef) == NULL)
- return FALSE;
-
- // no duplication, so create the tabledef if possible
- TRY
- {
- (*ppTableDef)->Create(strTableName);
- }
- CATCH (CDaoException, e)
- {
- // construct a meaningful message
- CString strMessage = _T("Couldn't create tabledef--Exception: ");
- strMessage += e->m_pErrorInfo->m_strDescription;
-
- AfxMessageBox(strMessage);
-
- // indicate failure
- bCreateFailed = TRUE;
-
- // delete the tabledef on failure
- if (*ppTableDef != NULL)
- {
- delete *ppTableDef;
- *ppTableDef = NULL;
- }
- }
- AND_CATCH (CMemoryException, e)
- {
- // output status
- AfxMessageBox(_T("Failed to create tabledef--Memory exception thrown."));
-
- // indicate failure
- bCreateFailed = TRUE;
-
- // delete the tabledef on failure
- if (*ppTableDef != NULL)
- {
- delete *ppTableDef;
- *ppTableDef = NULL;
- }
- }
- END_CATCH
-
- // return TRUE if creation succeeds
- return (!bCreateFailed);
- }
-
- // wraps the OpenTableDef call with an exception handler
- // IN: pDatabase--pointer to database object whose tabledef collection we will
- // access
- // OUT: ppTableDef--pointer to pointer to tabledef we are opening
- // IN: strTableName--name of the table we want to open
- // RETURN: TRUE if open succeeds, FALSE otherwise
- BOOL openTableDef(CDaoDatabase * pDatabase, CDaoTableDef **ppTableDef,
- CString strTableName)
- {
- // if the database is non-existent, then the answer is obvious
- if (pDatabase == NULL)
- return FALSE;
-
- // initialize creation failure indicator
- BOOL bOpenFailed = FALSE;
-
- // construct tabledef
- *ppTableDef = new CDaoTableDef(pDatabase);
-
- // failed to allocate so exit
- if ((*ppTableDef) == NULL)
- return FALSE;
-
- // open the tabledef if possible
- TRY
- {
- (*ppTableDef)->Open(strTableName);
- }
- CATCH (CDaoException, e)
- {
- // construct a meaningful message
- CString strMessage = _T("Couldn't open tabledef--Exception: ");
- strMessage += e->m_pErrorInfo->m_strDescription;
-
- AfxMessageBox(strMessage);
-
- // indicate failure
- bOpenFailed = TRUE;
-
- // delete the tabledef on failure
- if (*ppTableDef != NULL)
- {
- delete *ppTableDef;
- *ppTableDef = NULL;
- }
- }
- AND_CATCH (CMemoryException, e)
- {
- // output status
- AfxMessageBox(_T("Failed to open tabledef--Memory exception thrown."));
-
- // indicate failure
- bOpenFailed = TRUE;
-
- // delete the tabledef on failure
- if (*ppTableDef != NULL)
- {
- delete *ppTableDef;
- *ppTableDef = NULL;
- }
- }
- END_CATCH
-
- // return TRUE if open succeeds
- return (!bOpenFailed);
- }
-
- // append the tabledef to the database collection
- // IN: pDatabase--pointer to database object whose tabledef collection we will
- // access
- // IN: pTableDef--pointer tabledef we are appending to the collection
- // RETURN: TRUE if append succeeds, FALSE otherwise
- BOOL appendTableDef(CDaoDatabase *pDatabase, CDaoTableDef *pTableDef)
- {
- // if the database is non-existent, then the answer is obvious
- if (pDatabase == NULL)
- return FALSE;
-
- // initialize success indicator
- BOOL bSuccess = TRUE;
-
- // append the tabledef to the collection
- TRY
- {
- pTableDef->Append();
- }
- CATCH (CDaoException, e)
- {
- // construct informative message
- CString strMessage = _T("Couldn't append TableDef--Exception: ");
- strMessage += e->m_pErrorInfo->m_strDescription;
-
- // output status
- AfxMessageBox(strMessage);
-
- // failure
- bSuccess = FALSE;
- }
- AND_CATCH (CMemoryException, e)
- {
- // output status
- AfxMessageBox(_T("Failed to append tabledef--Memory exception thrown."));
-
- // failure
- bSuccess = FALSE;
- }
- END_CATCH
-
- // return status
- return bSuccess;
- }
-
- // fill a tableinfo struct--handle exceptions
- // IN: pDatabase--pointer to database object whose tabledef collection we will
- // access
- // OUT: pTableInfo--pointer to structure to hold the tabledef info
- // IN: tableIndex--index into the collection indicating which item we want
- // IN: bReportErrors--TRUE by default, if TRUE, report all errors, else silent
- // RETURN: TRUE if information obtained, FALSE otherwise
- BOOL getTableInfo(CDaoDatabase *pDatabase, CDaoTableDefInfo *pTableInfo,
- int tableIndex, BOOL bReportErrors /*= TRUE*/)
- {
- // if the database is non-existent, then the answer is obvious
- if (pDatabase == NULL)
- return FALSE;
-
- // initialize success indicator
- BOOL bSuccess = TRUE;
-
- TRY
- {
- // try to get info on the table
- pDatabase->GetTableDefInfo(tableIndex, *pTableInfo, AFX_DAO_ALL_INFO );
- }
- CATCH (CDaoException, e)
- {
- // construct a meaningful message if request
- if (bReportErrors)
- {
- CString strMessage = _T("Couldn't get information on table--Exception: ");
- strMessage += e->m_pErrorInfo->m_strDescription;
-
- AfxMessageBox(strMessage);
- }
-
- // indicate failure
- bSuccess = FALSE;
- }
- AND_CATCH (CMemoryException, e)
- {
- // output status if requested
- if (bReportErrors)
- AfxMessageBox(_T("Failed to get info on table--Memory exception thrown."));
-
- // indicate failure
- bSuccess = FALSE;
- }
- END_CATCH
-
- // return status
- return bSuccess;
- }
-
- // detete the specified table from the collection of tables
- // IN: pDatabase--pointer to database object whose tabledef collection we will
- // access
- // IN: strTableName--name of the table we want to delete
- void deleteTable(CDaoDatabase *pDatabase, CString strTableName)
- {
- // if the database is non-existent, then the answer is obvious
- if (pDatabase == NULL)
- return;
-
- // see if there is a table by this name -- if not, can't proceed
- if (!IsExistentTable(pDatabase, strTableName))
- return;
-
- // MFC exception handler macros used
- TRY
- {
- pDatabase->DeleteTableDef(strTableName);
- }
- CATCH (CDaoException, e)
- {
- // construct a meaningful message if request
- CString strMessage = _T("Couldn't delete the table--Exception: ");
- strMessage += e->m_pErrorInfo->m_strDescription;
-
- AfxMessageBox(strMessage);
- }
- AND_CATCH (CMemoryException, e)
- {
- // output status if requested
- AfxMessageBox(_T("Failed to delete the table--Memory exception thrown."));
- }
- END_CATCH
-
- return;
- }
-