2013-08-25 25 views
8

私はCouchDBとPouchDBの両方が新しく、モバイルデバイスとデスクトップデバイス間で同期し、オフラインで使用できる連絡先管理システムを作成するために使用しています。 PHP/MySQLのバックエンドを書く必要があるよりも、PouchDBの使用が無限に簡単であることがわかりました。連続レプリケーションとの競合を解決する方法

私はそれをうまく使いました。オフラインデバイスで矛盾する変更を加えると、CouchDBはアルゴリズムを使用して勝者を任意に選んですべてのデバイスに正しくプッシュします。

私がしたいのは、競合するレコードをマージするカスタムアルゴリズムを実装することです。

  1. レコードは1つのクライアント上で削除され、単に別に更新されている場合は、 更新されたバージョンの勝利を、両方のクライアントが削除に同意しない:ここで私が使用したいアルゴリズムがあります。
  2. 最新の「変更済み」タイムスタンプのレコードは マスターになり、古いレコードは2次レコードになります。
  3. セカンダリにのみ存在するフィールド(または マスターに空のフィールド)はすべてマスターに移動されます。
  4. マスターリビジョンが保存され、セカンダリが削除されます。

CouchDBのガイドには良いexplanationがありますが、連続レプリケーション中にPouchDB APIを使用して実装する方法がわかりません。 PouchDB APIによると、レプリケート・オプションには "onChange"リスナーがありますが、それを使用して競合を傍受する方法はわかりません。

サンプルコードを含む簡単なチュートリアルを書く人がいれば、自分自身と私は確信しています。紛争解決を管理する正確にどのようにの例で記事を書く

答えて

7

は本当に良いアイデアです、それは混乱することができますが、1

の欠如とアイデアは、CouchDBのと全く同じである、競合にあなたを解決するために勝利をdidntのリビジョンを削除(および必要に応じて、新たな勝者を書く)あなたは、削除葉が競合

function onChange(doc) { 
    if (!doc._conflicts) return; 
    collectConflicts(doc._conflicts, function(docs) { 
     var master = docs.sort(byTime).unshift(); 
     for (var doc in docs) { 
     for (var prop in doc) { 
      if (!(prop in master)) { 
      master[prop] = doc[prop]; 
      } 
     } 
     } 
     db.put(master, function(err) { 
     if (!err) { 
      for (var doc in docs) { 
      db.remove(doc); 
      } 
     } 
     });  
    }); 
    } 
} 

db.changes({conflicts: true, onChange: onChange}); 

これをいけない、そのことについて心配する必要はいけないので、

#1は、どのようにCouchDBの紛争解決の作品とにかくですエラーハンドが必要になりますあなたのコードがどんなものかを簡単にナプキンで描いていただけです

+0

ありがとうございました!これは大いに役立ちます。 –

関連する問題