/* Copyright 2015-2016 Amebis This file is part of ZRCola. ZRCola is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ZRCola is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ZRCola. If not, see . */ #pragma once #include #include #include #include namespace ZRCola { /// /// Source database /// class DBSource { public: /// /// Translation /// class translation { public: wchar_t chr; ///< Composed character std::wstring str; ///< Decomposed string }; /// /// Key sequence /// class keyseq { public: /// /// Key code /// struct keycode { wchar_t key; ///< Key bool shift; ///< Shift modifier bool ctrl; ///< Ctrl modifier bool alt; ///< Alt modifier }; public: wchar_t chr; ///< Character std::vector seq; ///< Key sequence }; public: DBSource(); virtual ~DBSource(); /// /// Opens the database /// /// \param[in] filename File name of the MDB database. /// /// \returns /// - true when open succeeds /// - false otherwise /// bool Open(LPCTSTR filename); /// /// Logs errors in database connections /// void LogErrors() const; /// /// Is recordset at end /// /// \param[out] rs Recordset with results /// /// \returns /// - true when at end /// - false otherwise /// static inline bool IsEOF(const ATL::CComPtr& rs) { VARIANT_BOOL eof = VARIANT_TRUE; return FAILED(rs->get_EOF(&eof)) || eof ? true : false; } /// /// Gets number of records in a recordset /// /// \param[out] rs Recordset with results /// /// \returns Number of records /// static inline size_t GetRecordsetCount(const ATL::CComPtr& rs) { ADO_LONGPTR count; return SUCCEEDED(rs->get_RecordCount(&count)) ? count : (size_t)-1; } /// /// Gets encoded Unicode character from ZRCola.zrc database /// /// \param[in] f Data field /// \param[out] chr Output character /// /// \returns /// - true when successful /// - false otherwise /// bool GetUnicodeCharacter(const ATL::CComPtr& f, wchar_t& chr) const; /// /// Gets encoded Unicode string from ZRCola.zrc database /// /// \param[in] f Data field /// \param[out] str Output string /// /// \returns /// - true when successful /// - false otherwise /// bool GetUnicodeString(const ATL::CComPtr& f, std::wstring& str) const; /// /// Gets encoded key sequence from ZRCola.zrc database /// /// \param[in] f Data field /// \param[out] seq Output sequence /// /// \returns /// - true when successful /// - false otherwise /// bool GetKeySequence(const ATL::CComPtr& f, std::vector& seq) const; /// /// Returns character translations /// /// \param[out] rs Recordset with results /// /// \returns /// - true when query succeeds /// - false otherwise /// bool SelectTranslations(ATL::CComPtr& rs) const; /// /// Returns translation data /// /// \param[in] rs Recordset with results /// \param[out] t Translation /// /// \returns /// - true when succeeded /// - false otherwise /// bool GetTranslation(const ATL::CComPtr& rs, translation& t) const; /// /// Returns key sequences /// /// \param[out] rs Recordset with results /// /// \returns /// - true when query succeeds /// - false otherwise /// bool SelectKeySequences(ATL::CComPtr& rs) const; /// /// Returns key sequence data /// /// \param[in] rs Recordset with results /// \param[out] ks Key sequence /// /// \returns /// - true when succeeded /// - false otherwise /// bool GetKeySequence(const ATL::CComPtr& rs, keyseq& ks) const; protected: std::basic_string m_filename; ///< Database filename ATL::CComPtr m_db; ///< Database _locale_t m_locale; ///< Database locale }; };