9 #include <QSqlDatabase>
22 #define TMDATABASE_ROOT_PATH_KEY "Database/root"
37 bool open(char const *message);
38 QSqlQuery prepare(char const *sql, char const *message = nullptr);
39 bool exec(QSqlQuery &query, char const *message = nullptr);
40 QSqlQuery exec(char const *sql, char const *message = nullptr);
41 void error(QString message, QSqlQuery *query = nullptr);
44 QSqlDatabase m_database;
45 QString m_database_name;
49 * \brief サイトに番号を振るためのクラスです。
51 class SiteDatabase : public DatabaseBase
54 typedef std::unique_ptr<SiteDatabase> pointer;
57 SiteDatabase(Settings *settings);
60 quint32 site_id(QString domain);
63 quint32 find_site_id(QString host_name);
64 void insert_site(QString host_name);
65 QString find_site_name(int site_id);
68 static pointer create(Settings *settings);
71 QSqlQuery m_find_site_id;
72 QSqlQuery m_insert_site;
74 QMap<QString, quint32> m_cache;
79 * \brief 単語に番号を振るためのクラスです。
81 class WordDatabase : public DatabaseBase
84 typedef std::shared_ptr<WordDatabase> pointer;
87 WordDatabase(Settings *settings, QString name);
91 int word_id(QString word);
94 int find_word_id(QString word);
95 void insert_word(QString word);
98 static pointer create(Settings *settings, QString name);
101 QSqlQuery m_find_word_id;
102 QSqlQuery m_insert_word;
104 QMap<QString, int> m_cache;
108 class SentenceDatabase : public DatabaseBase
111 typedef std::shared_ptr<SentenceDatabase> pointer;
112 typedef QList<sentence_data_type> sentences_data_type;
115 SentenceDatabase(Settings *settings, int site_id, QString name);
119 quint32 find_sentence_id(QString sentence);
120 quint32 find_sentence_id_with_context(
121 QString sentence, quint32 previous_crc, quint32 next_crc);
123 bool find_sentence_by_crc(
124 quint32 crc, QString *tsentence, QJsonArray *json = nullptr);
126 sentence_data_type find_sentence(quint32 sentence_id);
127 sentence_data_type find_sentence_by_source_id(int source_id);
129 void insert(sentence_data_type const &sentence_data);
130 void update(sentence_data_type const &sentence_data);
131 void remove(quint32 source_id);
134 sentence_data_type stuff_value(QSqlQuery *query);
137 static pointer create(Settings *settings, int site_id, QString name);
140 QSqlQuery m_find_sentence_id;
141 QSqlQuery m_find_sentence_id_with_context;
142 QSqlQuery m_find_sentence;
143 QSqlQuery m_find_sentence_by_crc;
144 QSqlQuery m_find_sentence_by_source_id;
145 QSqlQuery m_insert_sentence;
146 QSqlQuery m_update_sentence;
147 QSqlQuery m_delete_sentence;
150 struct index_data_type
155 quint32 word_id; /*!< 単語ID */
156 QSet<quint32> source_ids; /*!< 原文IDの集合 */
161 * \brief 原文の単語IDと訳文のIDを結びつけるクラスです。
163 class IndexDatabase : public DatabaseBase
166 typedef std::shared_ptr<IndexDatabase> pointer;
169 IndexDatabase(Settings *settings, QString dbname);
172 QSet<quint32> find_index(quint32 word_id);
173 void insert_index(quint32 word_id, quint32 source_id);
174 void remove_index(quint32 word_id, quint32 source_id);
177 static pointer create(Settings *settings, QString dbname);
180 QSqlQuery m_find_index;
181 QSqlQuery m_insert_index;
182 QSqlQuery m_update_index;
183 QSqlQuery m_remove_index;
188 class Database : public QObject
192 typedef std::function<void(sentence_data_type)> sentence_callback;
195 Database(Settings *settings, Service *service);
203 void open_word_database(int code, QString name);
205 quint32 find_site_id(QString host_name);
207 void find_sentence(sentence_data_type source,
208 TextSentence::weak_pointer token);
209 void insert_sentence(sentence_data_type source, sentence_data_type target,
210 TextSentence::weak_pointer token);
211 void remove_sentence(sentence_data_type sdata,
212 sentence_data_type tdata);
214 void find_candidates(sentence_data_type source,
215 TextSentence::weak_pointer token);
218 QString find_language_name(int code) const;
220 int find_word_id(int code, QString word);
221 WordDatabase::pointer find_word_database(int code);
223 IndexDatabase::pointer find_index_database(
224 quint32 site_id, int scode, int tcode);
226 SentenceDatabase::pointer find_sentence_database(quint32 site_id, int code);
229 Settings *m_settings;
232 QMap<int, QString> m_language_map; /*!< 言語コード、言語名 */
234 SiteDatabase::pointer m_site_database;
235 QMap<int, WordDatabase::pointer> m_word_databases; /*!< 言語コード, 単語データベース */
237 /*! QPair<サイトID、言語コード>、文データベース */
238 QMap<QPair<quint32, int>, SentenceDatabase::pointer> m_sentence_databases;
239 int m_sentence_cache_limit; /*!< 文データベース接続の最大値 */
241 QMap<QString, IndexDatabase::pointer> m_index_databases;
242 int m_index_cache_limit;
247 #endif // TMDATABASE_H