INDEX.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // index.cpp : MFC DAO Index specific functions
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. //
  13. // contains index specific functions:
  14. //BOOL IsExistentIndex(CDaoTableDef *pTableDef, CString strIndexName);
  15. //BOOL createNewIndex(CDaoTableDef *pTableDef, CDaoIndexInfo *pIndexInfo);
  16. //BOOL getIndexInfo(CDaoTableDef *pTableDef, CDaoIndexInfo *pIndexInfo,
  17. //                int IndexIndex, BOOL bReportErrors = TRUE);
  18. //BOOL deleteIndex(CDaoTableDef *pTableDef, CString strIndexName);
  19. #include "stdafx.h"
  20. #include "index.h"
  21. // check for duplicate name in collection
  22. // of tabledef object
  23. // IN: pTableDef--pointer to tabledef object whose index collection we access
  24. // IN: strIndexName--name of index to check for existence
  25. // RETURN: TRUE if the index exists in the collection, FALSE otherwise
  26. BOOL IsExistentIndex(CDaoTableDef *pTableDef, CString strIndexName)
  27. {
  28. // if the tabledef is non-existent, then the answer is obvious
  29. if (pTableDef == NULL)
  30. return FALSE;
  31. // initialize status indicator
  32. BOOL bDuplicateIndexName = TRUE;
  33. // see if there is a Index by this name already--duplicate
  34. // named Indexs are not accepted
  35. CDaoIndexInfo IndexInfo;    // only needed for the call
  36. // MFC exception handler macros used
  37. TRY
  38. {
  39. // this call will throw an exception if there is no
  40. // Index by the specified name--test for duplication
  41. pTableDef->GetIndexInfo(strIndexName, IndexInfo);
  42. }
  43. CATCH (CDaoException, e)
  44. {
  45. // if this is an 'Item not found' exception, we are
  46. // cleared to create the Index -- else this is
  47. // a duplicate Index name and we got another exception
  48. // which is irrelevant for our purposes
  49. if (e->m_pErrorInfo->m_lErrorCode == 3265)
  50. bDuplicateIndexName = FALSE;
  51. }
  52. AND_CATCH (CMemoryException, e)
  53. {
  54. // do nothing
  55. ;
  56. }
  57. END_CATCH
  58. return bDuplicateIndexName;
  59. }
  60. // wraps the CreateIndex DAO call in an exception handler
  61. // IN: pTableDef--pointer to tabledef object whose index collection we access
  62. // IN: pIndexInfo--information on index to be created
  63. // RETURN: TRUE if new index created, FALSE otherwise
  64. BOOL createNewIndex(CDaoTableDef *pTableDef, CDaoIndexInfo *pIndexInfo)
  65. {
  66. // if the tabledef is non-existent, then the answer is obvious
  67. if (pTableDef == NULL)
  68. return FALSE;
  69. // check for existing Index with this name just to be safe
  70. if (IsExistentIndex(pTableDef, pIndexInfo->m_strName))
  71. {
  72. AfxMessageBox(_T("A Index by that name already exists."));
  73. // return FALSE since can't create duplicate Index
  74. return FALSE;
  75. }
  76. // initialize failure indicators
  77. BOOL bCreateFailed = FALSE;
  78. // create a Index with the specified properties
  79. // it is automatically appended to Index collection
  80. // of the tabledef
  81. TRY
  82. {
  83. pTableDef->CreateIndex(*pIndexInfo);
  84. }
  85. CATCH (CDaoException, e)
  86. {
  87. // construct a meaningful message
  88. CString message = _T("Couldn't create Index--Exception: ");
  89. message += e->m_pErrorInfo->m_strDescription;
  90. AfxMessageBox(message);
  91. // indicate failure
  92. bCreateFailed = TRUE;
  93. }
  94. AND_CATCH (CMemoryException, e)
  95. {
  96. AfxMessageBox(_T("Failed to create Index--Memory exception thrown."));
  97. // indicate failure
  98. bCreateFailed = TRUE;
  99. }
  100. END_CATCH
  101. // return TRUE if creation succeeds
  102. return (!bCreateFailed);
  103. }
  104. // fill a Indexinfo struct--handle exceptions
  105. // IN: pTableDef--pointer to tabledef object whose index collection we access
  106. // OUT: pIndexInfo--information on index that is specifieed
  107. // IN: IndexIndex--the index into the index collection for the item we want
  108. // IN: bReportErrors--if TRUE, report any errors that occur, else silent
  109. //     TRUE by default
  110. // RETURN: TRUE if information obtained, FALSE otherwise
  111. BOOL getIndexInfo(CDaoTableDef *pTableDef, CDaoIndexInfo *pIndexInfo,
  112.   int IndexIndex, BOOL bReportErrors /*= TRUE*/)
  113. {
  114. // if the tabledef is non-existent, then the answer is obvious
  115. if (pTableDef == NULL)
  116. return FALSE;
  117. // initialize success indicator
  118. BOOL bSuccess = TRUE;
  119. TRY
  120. {
  121. // try to get info on the Index
  122. pTableDef->GetIndexInfo(IndexIndex, *pIndexInfo, AFX_DAO_ALL_INFO );
  123. }
  124. CATCH (CDaoException, e)
  125. {
  126. // construct a meaningful message if requested
  127. if (bReportErrors)
  128. {
  129. CString strMessage = _T("Couldn't get information on Index--Exception: ");
  130. strMessage += e->m_pErrorInfo->m_strDescription;
  131. AfxMessageBox(strMessage);
  132. }
  133. // indicate failure
  134. bSuccess = FALSE;
  135. }
  136. AND_CATCH (CMemoryException, e)
  137. {
  138. // output status if requested
  139. if (bReportErrors)
  140. AfxMessageBox(_T("Failed to get info on Index--Memory exception thrown."));
  141. // indicate failure
  142. bSuccess = FALSE;
  143. }
  144. END_CATCH
  145. // return status
  146. return bSuccess;
  147. }
  148. // wrap Index deletion with exception handlers
  149. // IN: pTableDef--pointer to tabledef object whose index collection we access
  150. // IN: strIndexName--name of index to delete
  151. // RETURN: TRUE if deletion suceeded, FALSE otherwise
  152. BOOL deleteIndex(CDaoTableDef *pTableDef, CString strIndexName)
  153. {
  154. // if the tabledef is non-existent, then the answer is obvious
  155. if (pTableDef == NULL)
  156. return FALSE;
  157. // initialize success indicator
  158. BOOL bSuccess = TRUE;
  159. // MFC exception handler macros used
  160. TRY
  161. {
  162. // this call will throw an exception if there is no
  163. // Index by the specified name--test for duplication
  164. pTableDef->DeleteIndex(strIndexName);
  165. }
  166. CATCH (CDaoException, e)
  167. {
  168. CString strMessage = _T("Couldn't delete the Index--Exception: ");
  169. strMessage += e->m_pErrorInfo->m_strDescription;
  170. AfxMessageBox(strMessage);
  171. // indicate failure
  172. bSuccess = FALSE;
  173. }
  174. AND_CATCH (CMemoryException, e)
  175. {
  176. AfxMessageBox(_T("Failed to delete the Index--Memory exception thrown."));
  177. // indicate failure
  178. bSuccess = FALSE;
  179. }
  180. END_CATCH
  181. return bSuccess;
  182. }