AesSQLite3.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include "StdAfx.h"
  2. #include "AesSQLite3.h"
  3. #include <shlwapi.h>
  4. AesSQLite3::AesSQLite3(void)
  5. {
  6. m_pSQLite3 = NULL;
  7. memset(m_szKey, 0, MAX_PATH);
  8. m_nKeyLen = 0;
  9. m_bSetKey = FALSE;
  10. }
  11. AesSQLite3::~AesSQLite3(void)
  12. {
  13. if ( m_pSQLite3 )
  14. sqlite3_close(m_pSQLite3);
  15. m_pSQLite3 = NULL;
  16. }
  17. void AesSQLite3::SetKey(IN LPCTSTR lpKey)
  18. {
  19. if ( lpKey == NULL || lpKey[0] == _T('\0'))
  20. return;
  21. #ifdef UNICODE
  22. if ( UNICODE2ASCII(lpKey, m_szKey, MAX_PATH) == FALSE )
  23. #else
  24. if ( _stprintf_s(m_szKey, MAX_PATH, _T("%s"), lpKey) == -1)
  25. #endif
  26. return;
  27. m_nKeyLen = strlen(m_szKey);
  28. m_bSetKey = TRUE;
  29. }
  30. WCHAR* AesSQLite3::ASCII2UNICODE(IN LPCCH lpASCIIStr)
  31. {
  32. if ( lpASCIIStr == NULL )
  33. return NULL;
  34. // 获取宽字符字节数;
  35. int cchWideChar = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
  36. if ( cchWideChar == 0)
  37. return NULL;
  38. // 转换成宽字符串;
  39. WCHAR *pWideChar = new WCHAR[cchWideChar + 1];
  40. memset(pWideChar, 0 , sizeof(WCHAR)*(cchWideChar + 1));
  41. int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pWideChar, cchWideChar );
  42. if ( nWriteNum != cchWideChar)
  43. {
  44. if (pWideChar)
  45. delete []pWideChar;
  46. return NULL;
  47. }
  48. return pWideChar;
  49. }
  50. BOOL AesSQLite3::ASCII2UNICODE(IN LPCCH lpASCIIStr, OUT PWCH pUNICODEStr, IN CONST INT& nUNICODEStrLen)
  51. {
  52. if ( lpASCIIStr == NULL )
  53. return FALSE;
  54. // 获取宽字符字节数;
  55. int cchWideChar = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
  56. if ( cchWideChar == 0 || cchWideChar >= nUNICODEStrLen)
  57. return FALSE;
  58. // 转换成宽字符串;
  59. memset(pUNICODEStr, 0 , sizeof(WCHAR)*nUNICODEStrLen);
  60. int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pUNICODEStr, cchWideChar );
  61. if ( nWriteNum != cchWideChar)
  62. return FALSE;
  63. return TRUE;
  64. }
  65. CHAR* AesSQLite3::UNICODE2ASCII(IN LPWCH lpUNICODEStr)
  66. {
  67. if ( lpUNICODEStr == NULL )
  68. return NULL;
  69. // 获取多字节字符字节数;
  70. int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  71. if ( cbMultiByte == 0 )
  72. return NULL;
  73. // 转换成多字节字符;
  74. CHAR *pMultiByteStr = new CHAR[cbMultiByte+1];
  75. memset(pMultiByteStr, 0, cbMultiByte + 1);
  76. int nWriteNum = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, pMultiByteStr, cbMultiByte, NULL, NULL);
  77. if (nWriteNum != cbMultiByte)
  78. {
  79. if (pMultiByteStr)
  80. delete []pMultiByteStr;
  81. return NULL;
  82. }
  83. return pMultiByteStr;
  84. }
  85. BOOL AesSQLite3::UNICODE2ASCII(IN LPWCH lpUNICODEStr, OUT LPCH pASCIIStr, IN CONST INT& nASCIIStrLen)
  86. {
  87. if ( lpUNICODEStr == NULL )
  88. return FALSE;
  89. // 获取多字节字符字节数;
  90. int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  91. if ( cbMultiByte == 0 || cbMultiByte >= nASCIIStrLen )
  92. return FALSE;
  93. // 转换成多字节字符;
  94. memset((void*)pASCIIStr, 0, nASCIIStrLen);
  95. int nWriteNum = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, pASCIIStr, cbMultiByte, NULL, NULL);
  96. if (nWriteNum != cbMultiByte)
  97. {
  98. return FALSE;
  99. }
  100. return TRUE;
  101. }
  102. CHAR* AesSQLite3::UNICODE2UTF8(IN LPWCH lpUNICODEStr)
  103. {
  104. if ( lpUNICODEStr == NULL )
  105. return NULL;
  106. // 获取多字节字符字节数;
  107. int cbMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  108. if ( cbMultiByte == 0 )
  109. return NULL;
  110. // 转换成多字节字符;
  111. CHAR* pMultiByteStr = new CHAR[cbMultiByte+1];
  112. memset(pMultiByteStr, 0, cbMultiByte + 1);
  113. int nWriteNum = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, pMultiByteStr, cbMultiByte, NULL, NULL);
  114. if (nWriteNum != cbMultiByte)
  115. {
  116. if (pMultiByteStr)
  117. delete []pMultiByteStr;
  118. return NULL;
  119. }
  120. return pMultiByteStr;
  121. }
  122. BOOL AesSQLite3::UNICODE2UTF8(IN LPWCH lpUNICODEStr, OUT LPCH pUTF8Str, IN CONST INT& nUTF8StrLen)
  123. {
  124. if ( lpUNICODEStr == NULL )
  125. return FALSE;
  126. // 获取多字节字符字节数;
  127. int cbMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  128. if ( cbMultiByte == 0 || cbMultiByte >= nUTF8StrLen )
  129. return FALSE;
  130. // 转换成多字节字符;
  131. memset(pUTF8Str, 0, nUTF8StrLen);
  132. int nWriteNum = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, pUTF8Str, cbMultiByte, NULL, NULL);
  133. if (nWriteNum != cbMultiByte)
  134. {
  135. return FALSE;
  136. }
  137. return TRUE;
  138. }
  139. CHAR* AesSQLite3::ASCII2UTF8(IN LPCCH lpASCIIStr)
  140. {
  141. // 将ASCII字符串转成UNICODE字符串;
  142. WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
  143. if ( pWideChar == NULL )
  144. return NULL;
  145. // 再将UICODE转成UTF8;
  146. CHAR* pUTF8 = UNICODE2UTF8(pWideChar);
  147. if ( pWideChar )
  148. delete []pWideChar;
  149. return pUTF8;
  150. }
  151. BOOL AesSQLite3::ASCII2UTF8(IN LPCCH lpASCIIStr, OUT LPCH pUTF8Str, IN CONST INT& nUTF8StrLen)
  152. {
  153. // 将ASCII字符串转成UNICODE字符串;
  154. WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
  155. if ( pWideChar == NULL )
  156. return FALSE;
  157. // 再将UICODE转成UTF8;
  158. BOOL bResult = UNICODE2UTF8(pWideChar, pUTF8Str, nUTF8StrLen);
  159. if ( pWideChar )
  160. delete []pWideChar;
  161. return bResult;
  162. }
  163. BOOL AesSQLite3::Open(IN LPCTSTR lpSQLitePath)
  164. {
  165. if ( lpSQLitePath == NULL || PathFileExists(lpSQLitePath) == FALSE )
  166. {
  167. return FALSE;
  168. }
  169. CHAR szUTF8Path[MAX_PATH] = {0};
  170. #ifdef UNICODE
  171. if ( !UNICODE2UTF8(lpSQLitePath, szUTF8Path, MAX_PATH) )
  172. #else
  173. if ( !ASCII2UTF8(lpSQLitePath, szUTF8Path, MAX_PATH) )
  174. #endif
  175. {
  176. return FALSE;
  177. }
  178. INT nSQLiteError = sqlite3_open(szUTF8Path, &m_pSQLite3);
  179. if ( nSQLiteError != SQLITE_OK )
  180. return FALSE;
  181. if ( m_bSetKey)
  182. nSQLiteError = sqlite3_key(m_pSQLite3, m_szKey, m_nKeyLen);
  183. return TRUE;
  184. }
  185. void AesSQLite3::Close()
  186. {
  187. if ( m_pSQLite3 )
  188. {
  189. INT nError = sqlite3_close(m_pSQLite3);
  190. if ( nError != SQLITE_OK )
  191. {
  192. printf("关闭数据库失败\n");
  193. }
  194. else
  195. m_pSQLite3 = NULL;
  196. }
  197. }
  198. INT AesSQLite3::Execute(IN LPCTSTR lpSQL)
  199. {
  200. if ( m_pSQLite3 || lpSQL == NULL )
  201. return SQLITE_ERROR;
  202. CHAR* psError = NULL;
  203. INT nRet = SQLITE_ERROR;
  204. #ifdef UNICODE
  205. CHAR* pSQL = UNICODE2ASCII(lpSQL);
  206. if ( pSQL == NULL )
  207. return SQLITE_ERROR;
  208. nRet = sqlite3_exec(m_pSQLite3, pSQL, NULL, 0, &psError);
  209. if ( pSQL )
  210. delete []pSQL;
  211. #else
  212. nRet = sqlite3_exec(m_pSQLite3, lpSQL, NULL, 0, &psError);
  213. #endif
  214. return nRet;
  215. }