2013-08-25 34 views
8

Hem CouchDB hem de PouchDB için yeniyim ve mobil ve masaüstü aygıtları arasında eşzamanlayan ve çevrimdışı olarak kullanılabilen bir kişi yönetim sistemi oluşturmak için kullanıyorum. Ben PouchDB kullanarak bir PHP/MySQL arka uç yazmak zorunda kalmadan daha kolay olduğunu görüyorum.Sürekli çoğaltma ile çakışmalar nasıl giderilir

Başarıyla kullandım ve çevrimdışı aygıtlarda çakışan değişiklikler yaptığımda, CouchDB bir kazanan seçmek için bir algoritma kullanır ve sonra doğru olarak tüm aygıtlara zorlar.

Yapmak istediğim, çakışan kayıtları birleştirmek için özel bir algoritma uygulamaktır.

  1. rekor Tek müşteriye silinir ve hem müşteriler silme üzerinde anlaşma olmadıkça, sadece, diğerinde güncellenmiş sürümü kazanır güncellenmesi halinde: İşte kullanmak istiyorum algoritmasıdır.
  2. En son "değiştirilmiş" zaman damgasına sahip kayıt ana olur ve eski kayıt ikincil hale gelir.
  3. Yalnızca ikincil (veya ana dosyasında boş) bulunan tüm alanlar, master'e taşınır.
  4. Ana revizyon kaydedilir ve ikincil silinir.

CouchDB rehberi iyi explanation vardır, ama nasıl sürekli çoğaltma sırasında PouchDB API ile bunu uygulamak için bir ipucu yok. PouchDB API'a göre, çoğaltma seçeneklerinde bir "onChange" dinleyicisi var, ancak çakışmaları engellemek için bunu nasıl kullanacağımı anlamıyorum.

Birisi, bazı örnek kodlar dahil olmak üzere kısa bir öğretici yazabilir ve kendimi ve diğer birçok PouchDB kullanıcılarının bunu takdir edeceğini eminim!

cevap

7

gerçekten iyi bir fikir çatışma çözünürlüğü yönetmek için tam olarak nasıl örneklerle bir makale Yazma, bu kafa karıştırıcı olabilir, ama bir

fikri eksikliği CouchDB ile aynı olup, uzlaşmazlıkların da sizi çözmek için olabilir Bu konuda endişelenmenize gerek kazanmak vermedi revizyonları silin (ve gerekirse yeni kazanan yazma)

# 1 zaten nasıl CouchDB çatışma çözümü çalışmaları, yani yok, silinmiş yapraklar eski çatışma

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}); 

Bu yok hataya ihtiyaç duyacak ling vb ve çok güzel yazılmış olabilir, sadece kodun

+0

gibi görünebileceğini gösteren hızlı bir peçete çizim oldu Çok teşekkürler Dale! Bu çok yardımcı olur. –

İlgili konular