#define DB_PREFETCH_LEN (6)
+Database Database::m_instance;
+
class Conditions : public std::vector<std::string> {
public:
Conditions (void) : std::vector<std::string> (1) {}
sqlite3_stmt *m_stmt;
};
-Query::Query (Database & db,
- const PinyinArray & pinyin,
+Query::Query (const PinyinArray & pinyin,
guint pinyin_begin,
guint pinyin_len,
guint option)
- : m_db (db),
- m_pinyin (pinyin),
+ : m_pinyin (pinyin),
m_pinyin_begin (pinyin_begin),
m_pinyin_len (pinyin_len),
m_option (option),
while (m_pinyin_len > 0) {
if (G_LIKELY (m_stmt == NULL)) {
- m_stmt = m_db.query (m_pinyin, m_pinyin_begin, m_pinyin_len, -1, m_option);
+ m_stmt = Database::instance ().query (m_pinyin, m_pinyin_begin, m_pinyin_len, -1, m_option);
g_assert (m_stmt != NULL);
}
class Query {
public:
- Query (Database & db,
- const PinyinArray & pinyin,
+ Query (const PinyinArray & pinyin,
guint pinyin_begin,
guint pinyin_len,
guint option);
gint fill (PhraseArray &phrases, gint count);
private:
- Database & m_db;
const PinyinArray & m_pinyin;
guint m_pinyin_begin;
guint m_pinyin_len;
};
class Database {
-public:
+private:
Database ();
~Database ();
+
+public:
SQLStmt *query (const PinyinArray & pinyin,
guint pinyin_begin,
guint pinyin_len,
void conditionsDouble (void);
void conditionsTriple (void);
+ static Database & instance (void) {return m_instance; }
+
private:
gboolean init (void);
gboolean initUserDatabase (const gchar *userdb);
String m_sql; /* sql stmt */
String m_buffer; /* temp buffer */
+
+private:
+ static Database m_instance;
};
namespace PY {
-Database PhraseEditor::m_database;
-
PhraseEditor::PhraseEditor (PinyinProperties & props)
: m_candidates (32),
m_selected_phrases (8),
gboolean
PhraseEditor::resetCandidate (guint i)
{
- m_database.remove (m_candidates[i]);
+ Database::instance ().remove (m_candidates[i]);
updateCandidates ();
return TRUE;
m_candidates.push_back (phrase);
}
- m_query = new Query (m_database,
- m_pinyin,
+ m_query = new Query (m_pinyin,
m_cursor,
m_pinyin.size () - m_cursor,
Config::option ());
while (begin != end) {
gint ret;
- Query query (m_database,
- m_pinyin,
+ Query query (m_pinyin,
begin,
end - begin,
Config::option ());
m_selected_phrases.insert (m_selected_phrases.end (),
m_candidate_0_phrases.begin (), m_candidate_0_phrases.end ());
#endif
- m_database.commit (m_selected_phrases);
+ Database::instance ().commit (m_selected_phrases);
reset ();
}
guint m_cursor;
PinyinProperties & m_props;
Query * m_query;
-
-private:
- static Database m_database;
};
};
/* init static members */
PinyinParser PinyinEditor::m_parser;
-SpecialTable PinyinEditor::m_special_table;
PinyinEditor::PinyinEditor (PinyinProperties & props)
: Editor (props),
if (begin < end &&
m_selected_special_phrase.empty () &&
- m_special_table.lookup (m_text.substr (begin, m_cursor - begin), m_special_phrases)) {
+ SpecialTable::instance ().lookup (m_text.substr (begin, m_cursor - begin), m_special_phrases)) {
return TRUE;
}
return oldsize > 0;
protected:
static PinyinParser m_parser;
- static SpecialTable m_special_table;
};
};
namespace PY {
+SpecialTable SpecialTable::m_instance;
+
class StaticPhrase : public SpecialPhrase {
public:
StaticPhrase (const std::string &text, guint pos) :
};
class SpecialTable {
-public:
+private:
SpecialTable (void);
+
+public:
void insert (const std::string & command, SpecialPhrase *phrase);
gboolean lookup (const std::string &command, std::vector<std::string> &result);
+
private:
gboolean load (const gchar *file);
+
+public:
+ static SpecialTable & instance (void) { return m_instance; }
+
private:
typedef std::list<SpecialPhrase *> List;
typedef std::map<std::string, List> Map;
Map m_map;
+
+private:
+ static SpecialTable m_instance;
};
};