/*
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 boolean from ZRCola.zrc database
///
/// \param[in] f Data field
/// \param[out] val Output boolean value
///
/// \returns
/// - true when successful
/// - false otherwise
///
bool GetValue(const ATL::CComPtr& f, bool& val) const;
///
/// Gets integer from ZRCola.zrc database
///
/// \param[in] f Data field
/// \param[out] val Output integer value
///
/// \returns
/// - true when successful
/// - false otherwise
///
bool GetValue(const ATL::CComPtr& f, int& val) const;
///
/// 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 from ZRCola.zrc database
///
/// \param[in] f Data field
/// \param[out] kc Output key code
///
/// \returns
/// - true when successful
/// - false otherwise
///
bool GetKeyCode(const ATL::CComPtr& f, keyseq::keycode& kc) 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
};
};