SQLDataHelper.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:21k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // SQLDataHelper.cpp: implementation of the CSQLDataHelper class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "SQLServerDataProvider.h"
  6. #include "SQLDataHelper.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. AFX_INLINE CString _MakeSQLDateTime(DATE t)
  16. {
  17. COleDateTime ct(t);
  18. return ct.Format(_T("{ts'%Y-%m-%d %H:%M:%S'}"));
  19. }
  20. void TRACE_ComError(_com_error &e)
  21. {
  22. CXTPCalendarDatabaseDataProvider::TRACE_ComError(e);
  23. }
  24. //===========================================================================
  25. void TRACE_ProviderError(XTPADODB::_Connection* pConnDB)
  26. {
  27. CXTPCalendarDatabaseDataProvider::TRACE_ProviderError(pConnDB);
  28. }
  29. void TRACE_ProviderError(XTPADODB::_Recordset* pRS)
  30. {
  31. ASSERT(pRS);
  32. if (pRS && pRS->GetActiveConnection().vt == VT_DISPATCH &&
  33. pRS->GetActiveConnection().pdispVal)
  34. {
  35. XTPADODB::_Connection* pConnDB = NULL;
  36. HRESULT hr = pRS->GetActiveConnection().pdispVal->QueryInterface(__uuidof(XTPADODB::_Connection), (void**)&pConnDB);
  37. if (SUCCEEDED(hr))
  38. {
  39. TRACE_ProviderError(pConnDB);
  40. }
  41. }
  42. }
  43. template<class _TData>
  44. _TData _GetField(XTPADODB::_Recordset* pRS, LPCTSTR pcszFName, _TData defVal)
  45. {
  46. _TData dataValue;
  47. try
  48. {
  49. XTPADODB::FieldPtr ptrField = pRS->Fields->GetItem(pcszFName);
  50. if (ptrField)
  51. {
  52. _variant_t vtValue = ptrField->Value;
  53. if (vtValue.vt == VT_NULL || vtValue.vt == VT_EMPTY ||
  54. vtValue.vt == VT_ERROR)
  55. {
  56. return defVal;
  57. }
  58. dataValue = (_TData)vtValue;
  59. return dataValue;
  60. }
  61. }
  62. catch (_com_error &e)
  63. {
  64. e;
  65. #ifdef _DEBUG
  66. if (pRS->GetActiveConnection().vt == VT_DISPATCH &&
  67. pRS->GetActiveConnection().pdispVal)
  68. {
  69. XTPADODB::_Connection* pConnDB = NULL;
  70. HRESULT hr = pRS->GetActiveConnection().pdispVal->QueryInterface(__uuidof(XTPADODB::_Connection), (void**)&pConnDB);
  71. if (SUCCEEDED(hr))
  72. {
  73. TRACE_ProviderError(pConnDB);
  74. }
  75. }
  76. TRACE_ComError(e);
  77. #endif
  78. }
  79. catch(...)
  80. {}
  81. TRACE(_T("ERROR: CalendarDB provider: Cannot Get field '%s' n"), pcszFName);
  82. return defVal;
  83. }
  84. BOOL _SetField(XTPADODB::_Recordset* pRS, LPCTSTR pcszFName, _variant_t vtValue, VARTYPE vtType = VT_ILLEGAL)
  85. {
  86. try
  87. {
  88. XTPADODB::FieldPtr ptrField = pRS->Fields->GetItem(pcszFName);
  89. if (ptrField)
  90. {
  91. if (vtType != VT_ILLEGAL)
  92. {
  93. // Implemented to set VT_DATE instead of VT_R8.
  94. // VariantChangeType may be used for more complex situations.
  95. //
  96. ASSERT(vtType == VT_DATE || vtType == vtValue.vt);
  97. vtValue.vt = vtType;
  98. }
  99. ptrField->Value = vtValue;
  100. return TRUE;
  101. }
  102. }
  103. catch (_com_error &e)
  104. {
  105. e;
  106. #ifdef _DEBUG
  107. if (pRS->GetActiveConnection().vt == VT_DISPATCH &&
  108. pRS->GetActiveConnection().pdispVal)
  109. {
  110. XTPADODB::_Connection* pConnDB = NULL;
  111. HRESULT hr = pRS->GetActiveConnection().pdispVal->QueryInterface(__uuidof(XTPADODB::_Connection), (void**)&pConnDB);
  112. if (SUCCEEDED(hr))
  113. {
  114. TRACE_ProviderError(pConnDB);
  115. }
  116. }
  117. TRACE_ComError(e);
  118. #endif
  119. }
  120. catch(...)
  121. {}
  122. TRACE(_T("ERROR: CalendarDB provider: Cannot Set field '%s' n"), pcszFName);
  123. return FALSE;
  124. }
  125. CSQLDataHelper::CSQLDataHelper(CXTPCalendarData* pDataProvider, XTPADODB::_Connection* pDBconn)
  126. {
  127. ASSERT(pDataProvider);
  128. m_pDataProvider = pDataProvider;
  129. if (m_pDataProvider)
  130. m_pDataProvider->InternalAddRef();
  131. m_ptrDBconn = pDBconn;
  132. }
  133. CSQLDataHelper::~CSQLDataHelper()
  134. {
  135. if (m_pDataProvider)
  136. m_pDataProvider->InternalRelease();
  137. m_pDataProvider = NULL;
  138. }
  139. CString CSQLDataHelper::MakeRetrieveDayEventsSQL(COleDateTime dtDay)
  140. {
  141. CString strSQL;
  142. TCHAR szBuffer[64];
  143. CString strYear = ITOT_S(dtDay.GetYear(), szBuffer, 64);
  144. CString strMonth = ITOT_S(dtDay.GetMonth(), szBuffer, 64);
  145. CString strDay = ITOT_S(dtDay.GetDay(), szBuffer, 64);
  146. strSQL = _T("SELECT * FROM CalendarEvents WHERE rn");
  147. strSQL += _T(" ( RecurrenceState = 0 OR RecurrenceState = 1 ) AND rn"); //xtpCalendarRecurrenceNotRecurring OR xtpCalendarRecurrenceMaster
  148. strSQL += _T("( YEAR(StartDateTime) < ") + strYear + _T("rn");
  149. strSQL += _T("  OR ( YEAR(StartDateTime) = ") + strYear + _T(" AND rn");
  150. strSQL += _T("       ( MONTH(StartDateTime) < ") + strMonth + _T(" OR rn");
  151. strSQL += _T("         MONTH(StartDateTime) = ") + strMonth + _T(" AND rn");
  152. strSQL += _T("         DAY(StartDateTime) <= ") + strDay + _T("rn");
  153. strSQL += _T("     ) ) ) AND rn");
  154. strSQL += _T("( YEAR(EndDateTime) > ") + strYear + _T("rn");
  155. strSQL += _T("  OR ( YEAR(EndDateTime) = ") + strYear + _T(" AND rn");
  156. strSQL += _T("       ( MONTH(EndDateTime) > ") + strMonth + _T(" OR rn");
  157. strSQL += _T("         MONTH(EndDateTime) = ") + strMonth + _T(" AND rn");
  158. strSQL += _T("         DAY(EndDateTime) >= ") + strDay + _T("rn");
  159. strSQL += _T("     ) ) ) rn");
  160. return strSQL;
  161. }
  162. CString CSQLDataHelper::MakeGetUpcomingEventsSQL(COleDateTime dtFrom, int nPeriodMinutes, BOOL bOptimized)
  163. {
  164. // The SQL script below can be created in 2 ways - simple or optimized.
  165. //
  166. // * The simple script is read all events from DB.
  167. //   RemindersManager will filter events and use only events with reminder 
  168. //   which will be Fired untill dtFrom + PeriodMinutes. 
  169. //   This can be very slow operation, 
  170. //   but it is called no so often - once per 2 hours by default.
  171. // 
  172. // * The optimized script is filter events instead of reminder manager.
  173. //   This can significantly improve performance.
  174. //
  175. // The simple variant can be useful for some debug purposes.
  176. // 
  177. // NOTE: generally dtFrom is Now.
  178. TCHAR szBuffer[64];
  179. CString strRState_no = ITOT_S(xtpCalendarRecurrenceNotRecurring, szBuffer, 64);
  180. CString strRState_master = ITOT_S(xtpCalendarRecurrenceMaster, szBuffer, 64);
  181. CString strRState_exception = ITOT_S(xtpCalendarRecurrenceException, szBuffer, 64);
  182. CString strSQL = _T("SELECT * FROM CalendarEvents WHERE rn");
  183. strSQL += _T(" (RecurrenceState = ") + strRState_no + _T(" OR rn");
  184. strSQL += _T("  RecurrenceState = ") + strRState_master + _T(") rn");
  185. //----------------------------------------------------------
  186. if(bOptimized)
  187. {
  188. COleDateTime dtUntil = dtFrom + CXTPCalendarUtils::Minutes2Span(nPeriodMinutes);
  189. CString strUntil = _MakeSQLDateTime(dtUntil);
  190. strSQL += _T(" AND rn");
  191. strSQL += _T(" ( IsReminder <> 0 OR rn");
  192. strSQL += _T("     ( RecurrenceState = ") + strRState_master + _T(" AND rn");
  193. strSQL += _T("       RecurrencePatternID IN ");
  194. strSQL += _T("         ( SELECT RecurrencePatternID  FROM CalendarEvents rn");
  195. strSQL += _T("           WHERE ");
  196. strSQL += _T("             RecurrenceState = ")  + strRState_exception + _T(" AND rn");
  197. strSQL += _T("             IsReminder <> 0 AND ");
  198. strSQL += _T(" DATEADD("n", -1 * ReminderMinutesBeforeStart, StartDateTime) <= ") + strUntil + _T("rn");
  199. strSQL += _T("         ) rn");
  200. strSQL += _T("     ) rn");
  201. strSQL += _T(" ) AND rn");
  202. strSQL += _T(" DATEADD("n", -1 * ReminderMinutesBeforeStart, StartDateTime) <= ") + strUntil;
  203. }
  204. return strSQL;
  205. }
  206. CXTPCalendarEventsPtr CSQLDataHelper::CreateEventsFromData(XTPADODB::_Recordset* pRSevents, BOOL bCloseRS)
  207. {
  208. if (!pRSevents || m_ptrDBconn == NULL) 
  209. {
  210. ASSERT(FALSE);
  211. return NULL;
  212. }
  213. CXTPCalendarEventsPtr ptrEvents = new CXTPCalendarEvents();
  214. if (!ptrEvents)
  215. {
  216. return NULL;
  217. }
  218. CXTPCalendarEventPtr  ptrEvent;
  219.   try
  220. {
  221. // process recordset
  222. while(!pRSevents->bEOF)
  223. {
  224. ptrEvent = _CreateEventFromData(pRSevents, FALSE);
  225. ASSERT(ptrEvent);
  226. if (ptrEvent)
  227. {
  228. ptrEvents->Add(ptrEvent);
  229. }
  230. // next record
  231. pRSevents->MoveNext();
  232. }
  233. //----------------
  234. if (bCloseRS && pRSevents->GetState() == XTPADODB::adStateOpen) 
  235. {
  236. pRSevents->Close();
  237. }
  238. return ptrEvents;
  239. }
  240. catch (_com_error &e)
  241. {
  242. TRACE_ProviderError(m_ptrDBconn);
  243. TRACE_ComError(e);
  244. }
  245. catch(...)
  246. {}
  247. TRACE(_T("ERROR: Exeption in CSQLDataHelper::CreateEventsFromData n"));
  248. return NULL;
  249. }
  250. CXTPCalendarEventPtr CSQLDataHelper::CreateEventFromData(XTPADODB::_Recordset* pRSevent, BOOL bCloseRS)
  251. {
  252. if (!pRSevent || m_ptrDBconn == NULL) 
  253. {
  254. ASSERT(FALSE);
  255. return NULL;
  256. }
  257.   try
  258. {
  259. CXTPCalendarEventPtr ptrEvent;
  260. // process recordset
  261. if(!pRSevent->bEOF)
  262. {
  263. ptrEvent = _CreateEventFromData(pRSevent, FALSE);
  264. ASSERT(ptrEvent);
  265. }
  266. //----------------
  267. if (bCloseRS && pRSevent->GetState() == XTPADODB::adStateOpen) 
  268. {
  269. pRSevent->Close();
  270. }
  271. return ptrEvent;
  272. }
  273. catch (_com_error &e)
  274. {
  275. TRACE_ProviderError(m_ptrDBconn);
  276. TRACE_ComError(e);
  277. }
  278. catch(...)
  279. {}
  280. TRACE(_T("ERROR: Exeption in CSQLDataHelper::CreateEventFromData n"));
  281. return NULL;
  282. }
  283. CXTPCalendarEventPtr CSQLDataHelper::_CreateEventFromData(XTPADODB::_Recordset* pRS, BOOL bException)
  284. {
  285. try
  286. {
  287. ASSERT(m_pDataProvider);
  288. if (!pRS || pRS->GetState() != XTPADODB::adStateOpen || !m_pDataProvider || m_ptrDBconn == NULL) 
  289. {
  290. return NULL;
  291. }
  292. DWORD dwEventID = (DWORD)(long)pRS->Fields->GetItem(_T("EventID"))->Value;
  293. CXTPCalendarEventPtr ptrEvent = m_pDataProvider->CreateNewEvent(dwEventID);
  294. if (!ptrEvent)
  295. return NULL;
  296. ptrEvent->SetEndTime((DATE)pRS->Fields->GetItem(_T("EndDateTime"))->Value);
  297. ptrEvent->SetStartTime((DATE)pRS->Fields->GetItem(_T("StartDateTime"))->Value);
  298. ptrEvent->SetAllDayEvent(_GetField<long>(pRS, _T("IsAllDayEvent"), 0) != 0);
  299. ptrEvent->SetSubject(_GetField<_bstr_t>(pRS, _T("Subject"), _T("") ));
  300. ptrEvent->SetLocation(_GetField<_bstr_t>(pRS, _T("Location"), _T("") ));
  301. ptrEvent->SetBody(_GetField<_bstr_t>(pRS, _T("Body"), _T("") ));
  302. ptrEvent->SetReminderSoundFile(_GetField<_bstr_t>(pRS, _T("RemainderSoundFile"), _T("") ));
  303. ptrEvent->SetBusyStatus(_GetField<long>(pRS, _T("BusyStatus"), 0));
  304. ptrEvent->SetImportance(_GetField<long>(pRS, _T("ImportanceLevel"), 0));
  305. ptrEvent->SetLabelID(_GetField<long>(pRS, _T("LabelID"), 0));
  306. ptrEvent->SetScheduleID(_GetField<long>(pRS, _T("ScheduleID"), 0));
  307. ptrEvent->SetCreationTime(_GetField<DATE>(pRS, _T("Created"), 0));
  308. ptrEvent->SetLastModificationTime(_GetField<DATE>(pRS, _T("Modified"), 0));
  309. ptrEvent->SetMeeting(_GetField<long>(pRS, _T("IsMeeting"), 0) != 0);
  310. ptrEvent->SetPrivate(_GetField<long>(pRS, _T("IsPrivate"), 0) != 0);
  311. ptrEvent->SetReminder(_GetField<long>(pRS, _T("IsReminder"), 0) != 0);
  312. ptrEvent->SetReminderMinutesBeforeStart(_GetField<long>(pRS, _T("ReminderMinutesBeforeStart"), 0));
  313. if (ptrEvent->GetCustomIcons())
  314. {
  315. _bstr_t bstrArray = _GetField<_bstr_t>(pRS, _T("CustomIconsIDs"), _T(""));
  316. ptrEvent->GetCustomIcons()->LoadFromString(bstrArray);
  317. }
  318. if (ptrEvent->GetCustomProperties())
  319. {
  320. _bstr_t bstrPropsXMLData = _GetField<_bstr_t>(pRS, _T("CustomPropertiesXMLData"), _T("") );
  321. ptrEvent->GetCustomProperties()->LoadFromXML(bstrPropsXMLData);
  322. }
  323. if(bException)
  324. {
  325. ptrEvent->MakeAsRException();
  326. ptrEvent->SetRException_StartTimeOrig((DATE)pRS->Fields->GetItem(_T("RExceptionStartTimeOrig"))->Value);
  327. ptrEvent->SetRException_EndTimeOrig((DATE)pRS->Fields->GetItem(_T("RExceptionEndTimeOrig"))->Value);
  328. ptrEvent->SetRExceptionDeleted(_GetField<long>(pRS, _T("ISRecurrenceExceptionDeleted"), 0) != 0);
  329. else // if(!bException)
  330. {         
  331. // "process_RecurrenceState" and "process_RecurrencePatternID" properties
  332. //  are used to process master events.
  333. //
  334. //  If they are set and RecurrenceStaie is Master Data provider will
  335. //  fier DoReadRPattern event and make event as Master.
  336. //  And it will also generate occurrences for RetrieveDayEvents method.
  337. //
  338. //  These properties are temporary and they will be removed by data provider.
  339. //
  340. //  If these properties are not set data provider expect that master event
  341. //  is already compleated - CreateRecurrence method is called and
  342. //  Recurrence pattern is set.
  343. //
  344. //  This mechanism is useful for DB data providers, when events and patterns
  345. //  are stored separately (in tables).
  346. //  But if events stored in some memory collection or array
  347. //  it should not be used because master event store recurrence pattern inside.
  348. long nRState = _GetField<long>(pRS, _T("RecurrenceState"), xtpCalendarRecurrenceNotRecurring);
  349. long nPatternID = _GetField<long>(pRS, _T("RecurrencePatternID"), XTP_CALENDAR_UNKNOWN_RECURRENCE_PATTERN_ID);
  350. ptrEvent->GetCustomProperties()->SetProperty(cszProcess_RecurrenceState, COleVariant((long)nRState));
  351. ptrEvent->GetCustomProperties()->SetProperty(cszProcess_RecurrencePatternID, COleVariant((long)nPatternID));
  352. }
  353. return ptrEvent;    
  354. }
  355. catch (_com_error &e)
  356. {
  357. TRACE_ProviderError(m_ptrDBconn);
  358. TRACE_ComError(e);
  359. }
  360. catch(...)
  361. {}
  362. TRACE(_T("ERROR: Exeption in CSQLDataHelper::_CreateEventFromData n"));
  363. return NULL;
  364. }
  365. void CSQLDataHelper::PutEventToData(CXTPCalendarEvent* pEvent, XTPADODB::_Recordset* pRS)
  366. {
  367. try
  368. {
  369. ASSERT(pEvent && pRS);
  370. ASSERT(m_pDataProvider);
  371. if (!pEvent || !pRS || pRS->GetState() != XTPADODB::adStateOpen || !m_pDataProvider || m_ptrDBconn == NULL) 
  372. {
  373. return;
  374. }
  375. // pRS->Fields->GetItem(_T("EventID"))->Value = (long)pEvent->GetEventID();
  376. BOOL bStart = _SetField(pRS, _T("StartDateTime"), (DATE)pEvent->GetStartTime(), VT_DATE);
  377. BOOL bEnd = _SetField(pRS, _T("EndDateTime"), (DATE)pEvent->GetEndTime(), VT_DATE);
  378. if (!bStart || !bEnd)
  379. {
  380. return;
  381. }
  382. _SetField(pRS, _T("IsAllDayEvent"), (long)pEvent->IsAllDayEvent());
  383. _SetField(pRS, _T("Subject"), _bstr_t(pEvent->GetSubject()) );
  384. _SetField(pRS, _T("Location"), _bstr_t(pEvent->GetLocation()) );
  385. _SetField(pRS, _T("Body"), _bstr_t(pEvent->GetBody()) );
  386. _SetField(pRS, _T("RemainderSoundFile"), _bstr_t(pEvent->GetReminderSoundFile()) );
  387. _SetField(pRS, _T("BusyStatus"), (long)pEvent->GetBusyStatus());
  388. _SetField(pRS, _T("ImportanceLevel"), (long)pEvent->GetImportance());
  389. _SetField(pRS, _T("LabelID"), (long)pEvent->GetLabelID());
  390. _SetField(pRS, _T("ScheduleID"), (long)pEvent->GetScheduleID());
  391. _SetField(pRS, _T("Created"), (DATE)pEvent->GetCreationTime(), VT_DATE);
  392. _SetField(pRS, _T("Modified"), (DATE)pEvent->GetLastModificationTime(), VT_DATE);
  393. _SetField(pRS, _T("IsMeeting"), (long)pEvent->IsMeeting());
  394. _SetField(pRS, _T("IsPrivate"), (long)pEvent->IsPrivate());
  395. _SetField(pRS, _T("IsReminder"), (long)pEvent->IsReminder());
  396. _SetField(pRS, _T("ReminderMinutesBeforeStart"), (long)pEvent->GetReminderMinutesBeforeStart());
  397. if (pEvent->GetCustomIcons())
  398. {
  399. CString strArray = pEvent->GetCustomIcons()->SaveToString();
  400. _SetField(pRS, _T("CustomIconsIDs"), _bstr_t(strArray));
  401. }
  402. if (pEvent->GetCustomProperties())
  403. {
  404. CString strCustProps;
  405. pEvent->GetCustomProperties()->SaveToXML(strCustProps);
  406. _SetField(pRS, _T("CustomPropertiesXMLData"), _bstr_t(strCustProps) );
  407. }
  408. _SetField(pRS, _T("RecurrenceState"),   (long)pEvent->GetRecurrenceState());
  409. _SetField(pRS, _T("RecurrencePatternID"), (long)pEvent->GetRecurrencePatternID());
  410. _SetField(pRS, _T("RExceptionStartTimeOrig"), (DATE)pEvent->GetRException_StartTimeOrig(), VT_DATE);
  411. _SetField(pRS, _T("RExceptionEndTimeOrig"),   (DATE)pEvent->GetRException_EndTimeOrig(), VT_DATE);
  412. _SetField(pRS, _T("ISRecurrenceExceptionDeleted"), (long)pEvent->IsRExceptionDeleted());
  413. return;
  414. }
  415. catch (_com_error &e)
  416. {
  417. TRACE_ProviderError(m_ptrDBconn);
  418. TRACE_ComError(e);
  419. }
  420. catch(...)
  421. {}
  422. TRACE(_T("ERROR: Exeption in CSQLDataHelper::PutEventToData n"));
  423. }
  424. CXTPCalendarRecurrencePatternPtr CSQLDataHelper::CreatePatternFromData(XTPADODB::_Recordset* pRS)
  425. {
  426. try
  427. {
  428. ASSERT(m_pDataProvider);
  429. if (!pRS || pRS->GetState() != XTPADODB::adStateOpen || !m_pDataProvider || m_ptrDBconn == NULL) 
  430. {
  431. return NULL;
  432. }
  433. DWORD dwPatternID = (DWORD)(long)pRS->Fields->GetItem(_T("RecurrencePatternID"))->Value;
  434. CXTPCalendarRecurrencePatternPtr ptrPattern = m_pDataProvider->CreateNewRecurrencePattern(dwPatternID);
  435. if (!ptrPattern)
  436. return NULL;
  437. ptrPattern->SetMasterEventID((DWORD)(long)pRS->Fields->GetItem(_T("MasterEventID"))->Value);
  438.     
  439. ptrPattern->SetPatternStartDate((DATE)pRS->Fields->GetItem(_T("PatternStartDate"))->Value);
  440. int nUseEnd = _GetField<long>(pRS, _T("PatternEndMethod"), xtpCalendarPatternEndNoDate);
  441. if (nUseEnd == xtpCalendarPatternEndDate)
  442. {
  443. ptrPattern->SetPatternEndDate(_GetField<DATE>(pRS, _T("PatternEndDate"), 0));
  444. }
  445. else if (nUseEnd == xtpCalendarPatternEndAfterOccurrences)
  446. {
  447. ptrPattern->SetEndAfterOccurrences(_GetField<long>(pRS, _T("PatternEndAfterOccurrences"), 1));
  448. }
  449. else 
  450. {
  451. ASSERT(nUseEnd == xtpCalendarPatternEndNoDate);
  452. ptrPattern->SetNoEndDate();
  453. }
  454. long nData1 = (long)pRS->Fields->GetItem(_T("OptionsData1"))->Value;
  455. long nData2 = (long)pRS->Fields->GetItem(_T("OptionsData2"))->Value;
  456. long nData3 = (long)pRS->Fields->GetItem(_T("OptionsData3"))->Value;
  457. long nData4 = (long)pRS->Fields->GetItem(_T("OptionsData4"))->Value;
  458. XTP_CALENDAR_RECURRENCE_OPTIONS _options;
  459. _options.SetData(nData1, nData2, nData3, nData4);
  460. // for previous versions use code below instead of SetData
  461. //
  462. //_options.m_nRecurrenceType = (XTPCalendarEventRecurrenceType)nData1;
  463. //_options.m_YearNth.nWhichDay = nData2;
  464. //_options.m_YearNth.nWhichDayMask = nData3;
  465. //_options.m_YearNth.nMonthOfYear = nData4;
  466. ptrPattern->SetRecurrenceOptions(_options);
  467. ptrPattern->SetStartTime(_GetField<DATE>(pRS, _T("EventStartTime"), 0));
  468. ptrPattern->SetDurationMinutes(_GetField<long>(pRS, _T("EventDuration"), 0));
  469. if (ptrPattern->GetCustomProperties())
  470. {
  471. _bstr_t bstrPropsXMLData = _GetField<_bstr_t>(pRS, _T("CustomPropertiesXMLData"), _T("") );
  472. ptrPattern->GetCustomProperties()->LoadFromXML(bstrPropsXMLData);
  473. }
  474.           
  475. pRS->Close();
  476. ReadRPatternExceptions(ptrPattern);
  477. return ptrPattern;    
  478. }
  479. catch (_com_error &e)
  480. {
  481. TRACE_ProviderError(m_ptrDBconn);
  482. TRACE_ComError(e);
  483. }
  484. catch(...)
  485. {}
  486. TRACE(_T("ERROR: Exeption in CSQLDataHelper::CreatePatternFromData n"));
  487. return NULL;
  488. }
  489. void CSQLDataHelper::ReadRPatternExceptions(CXTPCalendarRecurrencePattern* pPattern)
  490. {
  491. if (!pPattern || m_ptrDBconn == NULL) 
  492. {
  493. ASSERT(FALSE);
  494. return;
  495. }
  496.   try
  497. {
  498. CString strSQL;
  499. strSQL.Format(_T("SELECT * FROM CalendarEvents WHERE RecurrenceState = %d AND RecurrencePatternID = %d"),
  500.   xtpCalendarRecurrenceException, pPattern->GetPatternID());
  501. XTPADODB::_RecordsetPtr ptrRS = m_ptrDBconn->Execute(_bstr_t(strSQL), NULL, XTPADODB::adOptionUnspecified);
  502. if (ptrRS == NULL)
  503. {
  504. ASSERT(FALSE);
  505. return;   
  506. }
  507. // process recordset
  508. while(!ptrRS->bEOF)
  509. {
  510. CXTPCalendarEventPtr ptrEvent = _CreateEventFromData(ptrRS, TRUE);
  511. ASSERT(ptrEvent);
  512. if (ptrEvent)
  513. {
  514. pPattern->SetException(ptrEvent);
  515. }
  516. // next record
  517. ptrRS->MoveNext();
  518. }
  519. //----------------
  520. ptrRS->Close();
  521. return;
  522. }
  523. catch (_com_error &e)
  524. {
  525. TRACE_ProviderError(m_ptrDBconn);
  526. TRACE_ComError(e);
  527. }
  528. catch(...)
  529. {}
  530. TRACE(_T("ERROR: Exeption in CSQLDataHelper::ReadRPatternExceptions n"));
  531. }
  532. void CSQLDataHelper::PutPatternToData(CXTPCalendarRecurrencePattern* pPattern, XTPADODB::_Recordset* pRS)
  533. {
  534. try
  535. {
  536. ASSERT(pPattern && pRS);
  537. ASSERT(m_pDataProvider && m_ptrDBconn != NULL);
  538. if (!pPattern || !pRS || pRS->GetState() != XTPADODB::adStateOpen || !m_pDataProvider || m_ptrDBconn == NULL) 
  539. {
  540. return;
  541. }
  542. _SetField(pRS, _T("MasterEventID"), (long)pPattern->GetMasterEventID());     
  543. _SetField(pRS, _T("PatternStartDate"), (DATE)pPattern->GetPatternStartDate(), VT_DATE);
  544. _SetField(pRS, _T("PatternEndMethod"), (long)pPattern->GetUseEndMethod());
  545. _SetField(pRS, _T("PatternEndDate"), (DATE)pPattern->GetPatternEndDate(), VT_DATE);
  546. _SetField(pRS, _T("PatternEndAfterOccurrences"), (long)pPattern->GetEndAfterOccurrences());
  547. XTP_CALENDAR_RECURRENCE_OPTIONS _options = pPattern->GetRecurrenceOptions();
  548. long nData1 = 0, nData2 = 0, nData3 = 0, nData4 = 0;
  549. _options.GetData(nData1, nData2, nData3, nData4);
  550. // for previous versions use code below instead of GetData
  551. //
  552. //nData1 = _options.m_nRecurrenceType;
  553. //nData2 = _options.m_YearNth.nWhichDay;
  554. //nData3 = _options.m_YearNth.nWhichDayMask;
  555. //nData4 = _options.m_YearNth.nMonthOfYear;
  556. _SetField(pRS, _T("OptionsData1"), (long)nData1);
  557. _SetField(pRS, _T("OptionsData2"), (long)nData2);
  558. _SetField(pRS, _T("OptionsData3"), (long)nData3);
  559. _SetField(pRS, _T("OptionsData4"), (long)nData4);
  560. _SetField(pRS, _T("EventStartTime"), (DATE)pPattern->GetStartTime(), VT_DATE);
  561. _SetField(pRS, _T("EventDuration"), (long)pPattern->GetDurationMinutes());
  562. if (pPattern->GetCustomProperties())
  563. {
  564. CString strCustProps;
  565. pPattern->GetCustomProperties()->SaveToXML(strCustProps);
  566. _SetField(pRS, _T("CustomPropertiesXMLData"), _bstr_t(strCustProps) );
  567. }
  568. return;
  569. }
  570. catch (_com_error &e)
  571. {
  572. TRACE_ProviderError(m_ptrDBconn);
  573. TRACE_ComError(e);
  574. }
  575. catch(...)
  576. {}
  577. TRACE(_T("ERROR: Exeption in CSQLDataHelper::PutPatternToData n"));
  578. }