Convert.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include "StdAfx.h"
  2. #include "Convert.h"
  3. #include "AccessToSqlite.h"
  4. #include "DataTable.h"
  5. #include "TypesTable.h"
  6. CConvert::CConvert(void)
  7. {
  8. }
  9. CConvert::~CConvert(void)
  10. {
  11. }
  12. bool CConvert::ConvertNonGroups()
  13. {
  14. try
  15. {
  16. CMainTable recset;
  17. recset.m_pDatabase = &theApp.m_AccessDatabase;
  18. recset.m_strFilter.Format(_T("bIsGroup = FALSE"));
  19. recset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T(""), 0);
  20. if(recset.IsEOF() == FALSE)
  21. {
  22. while(!recset.IsEOF())
  23. {
  24. ConvertEntry(recset);
  25. recset.MoveNext();
  26. m_Progress.StepIt();
  27. m_Progress.PeekAndPump(FALSE);
  28. }
  29. }
  30. }
  31. catch(CDaoException* e)
  32. {
  33. TCHAR cError[100];
  34. e->GetErrorMessage(cError, 100);
  35. Log(StrF(_T("CDaoException - %s"), cError));
  36. ASSERT(FALSE);
  37. e->Delete();
  38. return false;
  39. }
  40. return true;
  41. }
  42. bool CConvert::ConvertGroups(long lParentID)
  43. {
  44. try
  45. {
  46. CMainTable recset;
  47. recset.m_pDatabase = &theApp.m_AccessDatabase;
  48. recset.m_strFilter.Format(_T("bIsGroup = TRUE AND lParentID = %d"), lParentID);
  49. recset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T(""), 0);
  50. while(!recset.IsEOF())
  51. {
  52. ConvertEntry(recset);
  53. ConvertGroups(recset.m_lID);
  54. recset.MoveNext();
  55. m_Progress.StepIt();
  56. m_Progress.PeekAndPump(FALSE);
  57. }
  58. }
  59. catch(CDaoException* e)
  60. {
  61. TCHAR cError[100];
  62. e->GetErrorMessage(cError, 100);
  63. Log(StrF(_T("CDaoException - %s"), cError));
  64. ASSERT(FALSE);
  65. e->Delete();
  66. return false;
  67. }
  68. return true;
  69. }
  70. bool CConvert::ConvertEntry(CMainTable &recset)
  71. {
  72. bool bRet = false;
  73. try
  74. {
  75. CClip Clip;
  76. Clip.m_Desc = recset.m_strText;
  77. Clip.m_Time = recset.m_lDate;
  78. Clip.m_lShortCut = recset.m_lShortCut;
  79. Clip.m_lDontAutoDelete = recset.m_lDontAutoDelete;
  80. Clip.m_bIsGroup = recset.m_bIsGroup;
  81. long lParent;
  82. if(m_ParentMap.Lookup(recset.m_lParentID, lParent))
  83. {
  84. Clip.m_lParent = lParent;
  85. }
  86. if(Clip.m_bIsGroup || LoadFormats(recset.m_lID, Clip.m_Formats))
  87. {
  88. Clip.AddToDB(false);
  89. if(Clip.m_bIsGroup)
  90. {
  91. m_ParentMap.SetAt(recset.m_lID, Clip.m_ID);
  92. }
  93. bRet = true;
  94. }
  95. else
  96. {
  97. Log(StrF(_T("Error loading formats id = %d"), recset.m_lID));
  98. }
  99. }
  100. catch (CppSQLite3Exception& e)
  101. {
  102. Log(StrF(_T("SQLITE Exception %d - %s"), e.errorCode(), e.errorMessage()));
  103. ASSERT(FALSE);
  104. bRet = false;
  105. }
  106. return bRet;
  107. }
  108. bool CConvert::LoadFormats(long lID, CClipFormats& formats)
  109. {
  110. CClipFormat cf;
  111. HGLOBAL hGlobal = 0;
  112. formats.RemoveAll();
  113. try
  114. {
  115. CDataTable recset;
  116. recset.m_pDatabase = &theApp.m_AccessDatabase;
  117. //Open the data table for all that have the parent id
  118. CString csSQL;
  119. csSQL.Format(
  120. _T("SELECT Data.* FROM Data ")
  121. _T("INNER JOIN Main ON Main.lDataID = Data.lDataID ")
  122. _T("WHERE Main.lID = %d"), lID);
  123. recset.Open(csSQL);
  124. while( !recset.IsEOF() )
  125. {
  126. cf.m_cfType = GetFormatID(recset.m_strClipBoardFormat);
  127. // create a new HGLOBAL duplicate
  128. hGlobal = NewGlobalH(recset.m_ooData.m_hData, recset.m_ooData.m_dwDataLength);
  129. if(hGlobal)
  130. {
  131. cf.m_hgData = hGlobal;
  132. formats.Add( cf );
  133. }
  134. recset.MoveNext();
  135. }
  136. cf.m_hgData = 0; // formats owns all the data
  137. recset.Close();
  138. }
  139. catch(CDaoException* e)
  140. {
  141. TCHAR cError[100];
  142. e->GetErrorMessage(cError, 100);
  143. Log(StrF(_T("CDaoException - %s"), cError));
  144. ASSERT(FALSE);
  145. e->Delete();
  146. return false;
  147. }
  148. return formats.GetSize() > 0;
  149. }
  150. bool CConvert::ConvertTypes()
  151. {
  152. try
  153. {
  154. CTypesTable recset;
  155. recset.m_pDatabase = &theApp.m_AccessDatabase;
  156. recset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM Types"), NULL);
  157. bool bFoundCF_UNICODETEXT = false;
  158. bool bAddedOne = false;
  159. while(!recset.IsEOF())
  160. {
  161. theApp.m_db.execDMLEx(_T("INSERT INTO Types VALUES(NULL, '%s');"), recset.m_TypeText);
  162. bAddedOne = true;
  163. if(recset.m_TypeText == "CF_UNICODETEXT")
  164. bFoundCF_UNICODETEXT = true;
  165. recset.MoveNext();
  166. }
  167. if(bAddedOne && bFoundCF_UNICODETEXT == false)
  168. {
  169. theApp.m_db.execDML(_T("INSERT INTO Types VALUES(NULL, 'CF_UNICODETEXT');"));
  170. }
  171. }
  172. catch(CDaoException* e)
  173. {
  174. TCHAR cError[100];
  175. e->GetErrorMessage(cError, 100);
  176. Log(StrF(_T("CDaoException - %s"), cError));
  177. ASSERT(FALSE);
  178. e->Delete();
  179. return false;
  180. }
  181. catch (CppSQLite3Exception& e)
  182. {
  183. Log(StrF(_T("SQLITE Exception %d - %s"), e.errorCode(), e.errorMessage()));
  184. ASSERT(FALSE);
  185. return false;
  186. }
  187. return true;
  188. }
  189. void CConvert::SetupProgressWnd()
  190. {
  191. CMainTable recset;
  192. recset.m_pDatabase = &theApp.m_AccessDatabase;
  193. recset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T(""), 0);
  194. recset.MoveLast();
  195. m_Progress.Create(NULL, _T("Ditto Conversion"), TRUE);
  196. m_Progress.SetRange(0, recset.GetRecordCount());
  197. m_Progress.HideCancel();
  198. m_Progress.SetText(_T("Converting version 2 database to version 3 database.\n")
  199. _T(" Version 3 now uses sqlite (sqlite.org) as it's database\n")
  200. _T(" Version 3 now support Unicode, display international characters"));
  201. ::SetWindowPos(m_Progress.GetSafeHwnd(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);
  202. }