OSDN Git Service

サーバ - データベース - エディタ - ブラウザの同期実装♪
[wordring-tm/wordring-tm.git] / proxy / tmdatabase.cpp
index 25e5a6c..c599290 100644 (file)
@@ -102,16 +102,16 @@ TM::SiteDatabase::~SiteDatabase()
 /*!
  * \brief 引数として与えられたドメイン名に対して一意な番号を返します。
  */
-int TM::SiteDatabase::site_id(QString domain)
+quint32 TM::SiteDatabase::site_id(QString domain)
 {
        // キャッシュが大きくなりすぎた場合、消去する。
        if(m_cache_limit < m_cache.size()) m_cache.clear();
        // キャッシュを検索。
-       QMap<QString, int>::const_iterator it = m_cache.find(domain);
+       QMap<QString, quint32>::const_iterator it = m_cache.find(domain);
        if(it != m_cache.end()) return *it; // キャッシュに存在する場合、ここで終わり。
 
        // キャッシュにない場合、データベースを検索。
-       int result = find_site_id(domain);
+       quint32 result = find_site_id(domain);
        // データベースにない場合、データベースに登録。
        if(!result)
        {
@@ -130,11 +130,11 @@ int TM::SiteDatabase::site_id(QString domain)
  *
  * 登録されていない場合、0を返します。
  */
-int TM::SiteDatabase::find_site_id(QString host_name)
+quint32 TM::SiteDatabase::find_site_id(QString host_name)
 {
        m_find_site_id.bindValue(0, host_name);
        exec(m_find_site_id, Q_FUNC_INFO);
-       if(m_find_site_id.next()) return m_find_site_id.value(0).toInt();
+       if(m_find_site_id.next()) return m_find_site_id.value(0).toUInt();
 
        return 0;
 }
@@ -582,18 +582,23 @@ void TM::Database::open_word_database(int code, QString name)
        m_word_databases.insert(code, WordDatabase::create(m_settings, name));
 }
 
+/*!
+ * \brief 引数として与えられたサイトに対応するIDを返します。
+ */
 quint32 TM::Database::find_site_id(QString host_name)
 {
        quint32 result = m_site_database->site_id(host_name);
        return result;
 }
 
-void TM::Database::find_sentence(quint32 site_id, int scode, int tcode,
-                       int segment_id, int index, sentence_data_type::pointer source,
-                       SocketConnection::pointer socket)
+void TM::Database::find_sentence(QString site_name, int scode, int tcode,
+                                                       sentence_data_type::pointer source, int token)
 {
        sentence_data_type::pointer result;
 
+       quint32 site_id = find_site_id(site_name);
+       assert(site_id);
+
        SentenceDatabase::pointer sdb = find_sentence_database(site_id, scode);
        assert(sdb);
        SentenceDatabase::pointer tdb = find_sentence_database(site_id, tcode);
@@ -615,31 +620,45 @@ void TM::Database::find_sentence(quint32 site_id, int scode, int tcode,
                if(result) result->quality = 100;
        }
 
-       // 検索結果を返す。
-       QMetaObject::invokeMethod(
-               m_service, "sentence_found",
-               Qt::QueuedConnection,
-               Q_ARG(qint32, segment_id),
-               Q_ARG(qint32, index),
-               Q_ARG(sentence_data_type::pointer, result),
-               Q_ARG(SocketConnection::pointer, socket));
-
+       if(result) // 検索結果を返す。
+       {
+               QMetaObject::invokeMethod(
+                       m_service, "sentence_found",
+                       Qt::QueuedConnection,
+                       Q_ARG(sentence_data_type::pointer, result),
+                       Q_ARG(qint32, token));
+       }
+       else // 検索できなかったことを通知する。
+       {
+               QMetaObject::invokeMethod(
+                       m_service, "sentence_not_found",
+                       Qt::QueuedConnection,
+                       Q_ARG(QString, site_name),
+                       Q_ARG(qint32, scode),
+                       Q_ARG(qint32, tcode),
+                       Q_ARG(QString, source->sentence),
+                       Q_ARG(qint32, token));
+       }
 }
 
-void TM::Database::insert_sentence(quint32 site_id,
-               quint32 scode, sentence_data_type::pointer source,
-               quint32 tcode, sentence_data_type::pointer target)
+void TM::Database::insert_sentence(
+               QString site_name, quint32 scode, quint32 tcode,
+               sentence_data_type::pointer source,
+               sentence_data_type::pointer target)
 {
        // 入力の検証。
-       assert(site_id);
+       assert(!site_name.isEmpty());
        assert(scode);
        assert(tcode);
-
        assert(source->source_id == 0);
        assert(source->json.isEmpty());
        assert(target->previous_crc == 0);
        assert(target->next_crc == 0);
 
+       quint32 site_id = find_site_id(site_name);
+       assert(site_id);
+       if(!site_id) return;
+
        // 原文の更新。
        SentenceDatabase::pointer sdb = find_sentence_database(site_id, scode);
        assert(sdb);
@@ -689,10 +708,9 @@ void TM::Database::insert_sentence(quint32 site_id,
        IndexDatabase::pointer index_database =
                        find_index_database(site_id, scode, tcode);
        assert(index_database);
-       WordDatabase::pointer word_database =
-                       find_word_database(scode);
+       WordDatabase::pointer word_database = find_word_database(scode);
+       assert(word_database);
        index_database->insert_index(word_database, source, target_id);
-       assert(index_database);
 }
 
 QString TM::Database::find_language_name(int code) const