// XTPCalendarDatabaseDataProvider.h: interface for // the CXTPCalendarDatabaseDataProvider class. // // This file is a part of the XTREME CALENDAR MFC class library. // (c)1998-2012 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// //{{AFX_CODEJOCK_PRIVATE #if !defined(_XTPCALENDARDATABASEDATAPROVIDER_H__) #define _XTPCALENDARDATABASEDATAPROVIDER_H__ //}}AFX_CODEJOCK_PRIVATE #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CXTPCalendarSchedule; class CXTPCalendarSchedules; struct XTP_CALENDAR_RECURRENCE_OPTIONS; XTP_DEFINE_SMART_PTR_INTERNAL(CXTPCalendarSchedules) //=========================================================================== // Summary: // This class is the implementation of the XTPCalendarData abstract // class which represents the data portion of the Calendar control. // Remarks: // This implementation uses MS Access database as the data source. // The Data source stores all Events data and provides a way to retrieve // and save CXTPCalendarEvent objects. // // To use CXTPCalendarDatabaseDataProvider first construct an instance // of CXTPCalendarDatabaseDataProvider object then use Open() member function // to establish connection to the data source and initialize the object. // Class provides a number of functions to manipulate events and events // related data. After finished working with the data source must call // the Close() member function to close the connection and to de-initialize // the object and free any unused resources. // See Also: CXTPCalendarData, CXTPCalendarMemoryDataProvider //=========================================================================== class _XTP_EXT_CLASS CXTPCalendarDatabaseDataProvider : public CXTPCalendarData { //{{AFX_CODEJOCK_PRIVATE class CADOCommand; DECLARE_DYNAMIC(CXTPCalendarDatabaseDataProvider) //}}AFX_CODEJOCK_PRIVATE public: //----------------------------------------------------------------------- // Summary: // Default constructor. // Remarks: // Constructs a Data object. To establish a connection to a // specified data source and initialize the object the // Open() member function must be called immediately after // construction. // See Also: Open() //----------------------------------------------------------------------- CXTPCalendarDatabaseDataProvider(); //----------------------------------------------------------------------- // Summary: // Default Destructor. // Remarks: // Handles all deallocation. //----------------------------------------------------------------------- virtual ~CXTPCalendarDatabaseDataProvider(); //----------------------------------------------------------------------- // Summary: // Call this member function to initialize a newly constructed // Data object. // Remarks: // Data object must be created before you call Open. // Returns: // TRUE is successful. FALSE otherwise. //----------------------------------------------------------------------- virtual BOOL Open(); //----------------------------------------------------------------------- // Summary: // Call this member function to initialize data provider using existing // ADO Connection object. // Parameters: // pdispADOConnection - [in] An IDispatch interface of ADO Connection. // Remarks: // Set Connection String as "Provider=ADO;" (or "Provider=Access;") // Connection object must be opened before pass to OpenEx. // Also calendar data provider do not close ADO Connection on Close method. // You have to close it yourself. // Returns: // TRUE is successful. FALSE otherwise. //----------------------------------------------------------------------- virtual BOOL OpenEx(LPDISPATCH pdispADOConnection); //----------------------------------------------------------------------- // Summary: // Call this member function to create an empty database. // Remarks: // A database is created with the necessary tables structure. // It is opened by default. // Returns: // TRUE is successful. FALSE otherwise. //----------------------------------------------------------------------- virtual BOOL Create(); //----------------------------------------------------------------------- // Summary: // This method saves data to the database. // Remarks: // Actually, this method just always returns TRUE for the // database data provider. The reason is that database data provider // always keep consistency of its data and could be closed without // saving. The database file would contain the most recent data. // Returns: // TRUE is successful. FALSE otherwise. //----------------------------------------------------------------------- virtual BOOL Save(); //----------------------------------------------------------------------- // Summary: // Call this member function to close the connection to a data source. //----------------------------------------------------------------------- virtual void Close(); protected: //----------------------------------------------------------------------- // Summary: // Retrieve day events for a specified day. // Parameters: // dtDay - A specified day. // Remarks: // This method creates and executes a database query on order to // retrieve all appointments for a specified day. // Returns: // A collection of events for a specified day. //----------------------------------------------------------------------- virtual CXTPCalendarEventsPtr DoRetrieveDayEvents(COleDateTime dtDay); //----------------------------------------------------------------------- // Summary: // Remove all events from the database. // Remarks: // This method creates and executes a database query which // removes all appointments from the database. //----------------------------------------------------------------------- virtual void DoRemoveAllEvents(); //----------------------------------------------------------------------- // Summary: // Read event from the database. // Parameters: // dwEventID - Event ID of the read target. // Remarks: // This method creates and executes a database query which // retrieves all data for a specified event. // Returns: // A pointer to the new CXTPCalendarEvent object which fields // contains a data from the database. //----------------------------------------------------------------------- virtual CXTPCalendarEventPtr DoRead_Event(DWORD dwEventID); //----------------------------------------------------------------------- // Summary: // Read recurrence pattern from the database // Parameters: // dwPatternID - Pattern ID of the read target. // Remarks: // This method creates and executes a database query which // retrieves all data for a specified recurrence pattern. // Returns: // A pointer to the created CXTPCalendarRecurrencePattern object. //----------------------------------------------------------------------- virtual CXTPCalendarRecurrencePatternPtr DoRead_RPattern(DWORD dwPatternID); //----------------------------------------------------------------------- // Summary: // Creates a new event in the database // Parameters: // pEvent - Pointer to the CXTPCalendarEvent object which describes // all data fields of a newly created record. // rdwNewEventID - [out] EventID of a newly created record, // it is an auto-generated numeric events table key. // Remarks: // This method creates and executes a database query which // adds a new record to the events table. // Returns: // TRUE if event created successfully, // FALSE in case of any error during the process. //----------------------------------------------------------------------- virtual BOOL DoCreate_Event(CXTPCalendarEvent* pEvent, DWORD& rdwNewEventID); //----------------------------------------------------------------------- // Summary: // Updates event properties in the database. // Parameters: // pEvent - Pointer to the CXTPCalendarEvent object which describes // all data fields of an event. // Remarks: // This method creates and executes a database query which updates // a corresponding database record with properties from the specified // event. // Returns: // TRUE if an event updated successfully, // FALSE in case of any errors during the process. //----------------------------------------------------------------------- virtual BOOL DoUpdate_Event(CXTPCalendarEvent* pEvent); //----------------------------------------------------------------------- // Summary: // Deletes an event from the database. // Parameters: // pEvent - Pointer to the CXTPCalendarEvent object which describes // all data fields of an event. // Remarks: // This method creates and executes a database query which deletes // a corresponding database record. // Returns: // TRUE if an event deleted successfully, // FALSE in case of any errors during the process. //----------------------------------------------------------------------- virtual BOOL DoDelete_Event(CXTPCalendarEvent* pEvent); //----------------------------------------------------------------------- // Summary: // Creates a new recurrence pattern in the database // Parameters: // pPattern - Pointer to the CXTPCalendarRecurrencePattern object which // describes all data fields of a newly created record. // rdwNewPatternID - [out] ID of a newly created record, // it is an auto-generated numeric table key. // Remarks: // This method creates and executes a database query which // adds a new record to the recurrence patterns table. // Returns: // TRUE if recurrence pattern created successfully, // FALSE in case of any error during the process. //----------------------------------------------------------------------- virtual BOOL DoCreate_RPattern(CXTPCalendarRecurrencePattern* pPattern, DWORD& rdwNewPatternID); //----------------------------------------------------------------------- // Summary: // Updates a recurrence pattern in the database // Parameters: // pPattern - Pointer to the CXTPCalendarRecurrencePattern object. // Remarks: // This method creates and executes a database query which // updates a corresponding record in the recurrence patterns table. // Returns: // TRUE if recurrence pattern updated successfully, // FALSE in case of any error during the process. //----------------------------------------------------------------------- virtual BOOL DoUpdate_RPattern(CXTPCalendarRecurrencePattern* pPattern); //----------------------------------------------------------------------- // Summary: // Deletes a recurrence pattern from the database // Parameters: // pPattern - Pointer to the CXTPCalendarRecurrencePattern object // which should be deleted. // Remarks: // This method creates and executes a database query which // deletes a corresponding record from the recurrence patterns table. // Returns: // TRUE if recurrence pattern deleted successfully, // FALSE in case of any error during the process. //----------------------------------------------------------------------- virtual BOOL DoDelete_RPattern(CXTPCalendarRecurrencePattern* pPattern); //----------------------------------------------------------------------- // Summary: // This method implements Getting all events from the database // without generating recurrence occurrences. // Remarks: // Simple events are included as is. // For the recurrence events only master events are included, // recurrence occurrences are not generated. // Returns: // A CXTPCalendarEvents pointer containing a collection of // all events. // See Also: GetAllEvents_raw() //----------------------------------------------------------------------- virtual CXTPCalendarEventsPtr DoGetAllEvents_raw(); //----------------------------------------------------------------------- // Summary: // Retrieves a collection of events expiring in the period from // dtFrom during next spPeriod. // Parameters: // dtFrom - Start date and time of a specified period. // spPeriod - A duration of a specified period. // Remarks: // This method creates and executes a database query which // returns a collection of upcoming events. // It is used by a reminders manager. // Returns: // A CXTPCalendarEvents pointer containing a collection of // upcoming events. // See Also: // CXTPCalendarRemindersManager overview //----------------------------------------------------------------------- virtual CXTPCalendarEventsPtr DoGetUpcomingEvents(COleDateTime dtFrom, COleDateTimeSpan spPeriod); public: //{{AFX_CODEJOCK_PRIVATE static void AFX_CDECL TRACE_ProviderError(XTPADODB::_Connection* pConnDB); static void AFX_CDECL TRACE_ComError(_com_error &e); //}}AFX_CODEJOCK_PRIVATE private: virtual CXTPCalendarEventPtr _ReadEvent_common(XTPADODB::_Recordset* pRS, BOOL bEcxception); virtual BOOL _ReadRExceptions(CXTPCalendarRecurrencePattern* pPattern); virtual BOOL _GetRPatternOptions(XTPADODB::_Recordset* pRS, XTP_CALENDAR_RECURRENCE_OPTIONS* rROptions); //----------------------------------------------------------------------- // Summary: // This member function is used to update options data in the database. // Parameters: // strOptionsData - Options data in XML format. // Returns: // TRUE if successful. Otherwise FALSE. // See Also: LoadOptions //----------------------------------------------------------------------- virtual BOOL SaveOptions(const CString& strOptionsData); //----------------------------------------------------------------------- // Summary: // This member function is used to load options data from the database. // Returns: // TRUE if successful. Otherwise FALSE. // See Also: SaveOptions //----------------------------------------------------------------------- virtual BOOL LoadOptions(); virtual CXTPCalendarSchedulesPtr LoadSchedules(); virtual void UpdateSchedules(); virtual void _AddSchedules(CXTPCalendarSchedules* pAddSet); virtual void _UpdateSchedules(CXTPCalendarSchedules* pUpdateSet, CXTPCalendarSchedules* pOrigSet); virtual void _DeleteSchedules(CUIntArray* pDeleteIDs); virtual CXTPCalendarSchedule* _ReadSchedule(XTPADODB::_Recordset* pRS); protected: BOOL m_bTraceOptions; // Indicates whether there should be only one record // in the options table, or every save should add the new one. private: //{{AFX_CODEJOCK_PRIVATE BOOL _Open(); void CreateEventTable(XTPADOX::_CatalogPtr ptrCatalog); void CreateRPatternTable(XTPADOX::_CatalogPtr ptrCatalog); void CreateOptionsTable(XTPADOX::_CatalogPtr ptrCatalog); void CreateSchedulesTable(XTPADOX::_CatalogPtr ptrCatalog); BOOL IsTableExist(XTPADOX::_CatalogPtr ptrCatalog, LPCWSTR pwszTableName); //void CreateDicTable(XTPADOX::_CatalogPtr ptrCatalog, LPCWSTR strTable, // LPCWSTR strNameID, bool bAuto = true); BOOL UpdateDBStructure(XTPADODB::_Connection* pconnDb); //}}AFX_CODEJOCK_PRIVATE //{{AFX_CODEJOCK_PRIVATE // members XTPADODB::_ConnectionPtr m_pconnDb; BOOL m_bCloseDbConnection; CADOCommand* m_pcmdGetLastID; CADOCommand* m_pcmdAddEvent; CADOCommand* m_pcmdDelEvent; CADOCommand* m_pcmdUpdEvent; CADOCommand* m_pcmdGetDayEvents; CADOCommand* m_pcmdGetRExceptions; CADOCommand* m_pcmdGetEvent; CADOCommand* m_pcmdUpdEventPatternID; CADOCommand* m_pcmdAddRPattern; CADOCommand* m_pcmdDelRPattern; CADOCommand* m_pcmdUpdRPattern; CADOCommand* m_pcmdGetRPattern; CADOCommand* m_pcmdRemoveAllEvents; CADOCommand* m_pcmdRemoveAllRPatterns; CADOCommand* m_pcmdRemoveAllOptions; CADOCommand* m_pcmdGetOptions; CADOCommand* m_pcmdAddOptions; CADOCommand* m_pcmdAddSchedule; CADOCommand* m_pcmdUpdSchedule; //}}AFX_CODEJOCK_PRIVATE private: // internal only used member functions //{{AFX_CODEJOCK_PRIVATE virtual BOOL _SetRPatternOptions(CADOCommand* pCmd, CXTPCalendarRecurrencePattern* pPattern); void DeleteAllDBCommands(); void CreateGetLastIDCommand(); void CreateAddEventCommand(); void CreateDelEventCommand(); void CreateUpdEventCommand(); void CreateGetDayEventCommand(); void CreateAddRPatternCommand(); void CreateDelRPatternCommand(); void CreateUpdRPatternCommand(); void CreateGetRPatternCommand(); void CreateGetRExceptionsCommand(); void CreateGetEventCommand(); void CreateUpdEventPatternIDCommand(); void CreateRemoveAllCommands(); void CreateGetOptionsCommand(); void CreateAddOptionsCommand(); void CreateAddScheduleCommand(); void CreateUpdScheduleCommand(); //}}AFX_CODEJOCK_PRIVATE }; #endif // !defined(_XTPCALENDARDATABASEDATAPROVIDER_H__)