本文整理汇总了Golang中github.com/syndtr/goleveldb/leveldb.Batch类的典型用法代码示例。如果您正苦于以下问题:Golang Batch类的具体用法?Golang Batch怎么用?Golang Batch使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Batch类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: ChildFileIds
// ChildFileIds returns the IDs of all Files that have parent refs to the given file.
func (d *DriveDB) ChildFileIds(fileId string) ([]string, error) {
var ids []string
d.iters.Add(1)
batch := new(leveldb.Batch)
iter := d.db.NewIterator(util.BytesPrefix(childKey(fileId)), nil)
for iter.Next() {
pidcid := deKey(string(iter.Key()))
cid := pidcid[len(fileId)+1:]
found, err := d.db.Has(fileKey(cid), nil)
if err == nil && found {
ids = append(ids, cid)
} else {
batch.Delete(iter.Key())
}
}
iter.Release()
d.iters.Done()
if batch.Len() > 0 {
err := d.db.Write(batch, nil)
if err != nil {
log.Printf("error writing to db: %v", err)
}
}
return ids, iter.Error()
}
示例2: DeleteDataWithPrefix
// DeleteDataWithPrefix deletes all service data such as service metadata, items and payloads.
func (ds *LevelDBStorage) DeleteDataWithPrefix(prefix string) int {
ds.FlushCache()
ds.saveLock.Lock()
defer ds.saveLock.Unlock()
limitCounter := 0
total := 0
iter := ds.IterData(prefix)
wb := new(leveldb.Batch)
for iter.Valid() {
total++
if limitCounter < 1000 {
wb.Delete(iter.GetKey())
limitCounter++
} else {
limitCounter = 0
ds.db.Write(wb, nil)
wb.Reset()
}
iter.Next()
}
ds.db.Write(wb, nil)
return total
}
示例3: saveInDb
func (self dbSync) saveInDb(mult map[string]string) {
batch := new(leveldb.Batch)
for k, v := range mult {
batch.Put([]byte(k), []byte(v))
}
self.Db.Write(batch, nil)
}
示例4: msetnx
func msetnx(v resp.CommandArgs, ex *CommandExtras) error {
if len(v) == 0 || len(v)%2 != 0 {
return resp.NewError(ErrFmtWrongNumberArgument, "msetnx").WriteTo(ex.Buffer)
}
batch := new(leveldb.Batch)
for i := 0; i < len(v); {
batch.Put(v[i], v[i+1])
i += 2
}
ex.DB.Lock()
defer ex.DB.Unlock()
for i := 0; i < len(v); {
_, err := ex.DB.Get(v[i])
if err != nil && err != leveldb.ErrNotFound {
return err
}
if err != leveldb.ErrNotFound {
return resp.ZeroInteger.WriteTo(ex.Buffer)
}
i += 2
}
if err := ex.DB.WriteBatch(batch); err != nil {
return err
}
return resp.OneInteger.WriteTo(ex.Buffer)
}
示例5: multiDeleteDb
func (self dbSync) multiDeleteDb(ks []string) {
batch := new(leveldb.Batch)
for _, k := range ks {
batch.Delete([]byte(k))
}
self.Db.Write(batch, nil)
}
示例6: PersistReceivedRecords
// PersistReceivedRecords save the info about which records we've already seen
func (p *LevelDBPersister) PersistReceivedRecords(comp StreamID, records []*Record) error {
batch := new(leveldb.Batch)
for _, r := range records {
batch.Put([]byte(fmt.Sprintf(receivedKeyFormat, comp, r.ID)), nil)
}
return p.db.Write(batch, nil)
}
示例7: PutReceipts
// PutReceipts stores the receipts in the current database
func PutReceipts(db common.Database, receipts types.Receipts) error {
batch := new(leveldb.Batch)
_, batchWrite := db.(*ethdb.LDBDatabase)
for _, receipt := range receipts {
storageReceipt := (*types.ReceiptForStorage)(receipt)
bytes, err := rlp.EncodeToBytes(storageReceipt)
if err != nil {
return err
}
if batchWrite {
batch.Put(append(receiptsPre, receipt.TxHash[:]...), bytes)
} else {
err = db.Put(append(receiptsPre, receipt.TxHash[:]...), bytes)
if err != nil {
return err
}
}
}
if db, ok := db.(*ethdb.LDBDatabase); ok {
if err := db.LDB().Write(batch, nil); err != nil {
return err
}
}
return nil
}
示例8: childFileIds
// childFileIds returns a map containing IDs of all Files that have parent
// refs to the given file. The returned map keys are IDs, and the map values
// indicate if the child is a directory.
func (d *DriveDB) childFileIds(fileId string) (map[string]bool, error) {
ids := make(map[string]bool)
d.iters.Add(1)
batch := new(leveldb.Batch)
iter := d.db.NewIterator(util.BytesPrefix(childKeyPrefix(fileId)), nil)
for iter.Next() {
pidcid := deKey(string(iter.Key()))
cid := pidcid[len(fileId)+1:]
if gdriveFile, err := d.FileById(cid); err != nil {
log.Printf("unknown fileId %v: %v", fileId, err)
batch.Delete(iter.Key())
} else {
ids[cid] = gdriveFile.MimeType == driveFolderMimeType
}
}
iter.Release()
d.iters.Done()
if batch.Len() > 0 {
err := d.db.Write(batch, nil)
if err != nil {
log.Printf("error writing to db: %v", err)
}
}
return ids, iter.Error()
}
示例9: Put
func (l *LevelDb) Put(id DbKey, aliases []DbKey, value []byte) error {
// Lazy Open
if err := l.open(); err != nil {
return err
}
batch := new(leveldb.Batch)
idb := id.ToBytes("kv")
batch.Put(idb, value)
if aliases != nil {
for _, alias := range aliases {
batch.Put(alias.ToBytes("lo"), idb)
}
}
err := l.db.Write(batch, nil)
// If the file is corrupt, just nuke and act like we didn't find anything
if l.nukeIfCorrupt(err) {
err = nil
}
return err
}
示例10: clearItems
func clearItems(db *leveldb.DB) error {
snap, err := db.GetSnapshot()
if err != nil {
return err
}
defer snap.Release()
// Iterate over k2
it := snap.NewIterator(util.BytesPrefix([]byte{1}), nil)
defer it.Release()
batch := new(leveldb.Batch)
for it.Next() {
k1 := it.Key()
k2 := it.Value()
// k2 should exist
_, err := snap.Get(k2, nil)
if err != nil {
return err
}
// Delete the k1 => k2 mapping first
batch.Delete(k1)
// Then the k2 => data mapping
batch.Delete(k2)
}
if testing.Verbose() {
log.Printf("batch write (clear) %p", batch)
}
return db.Write(batch, nil)
}
示例11: cacheFlush
// flush a leveldb batch to database and reset batch to 0
func cacheFlush(db *leveldb.DB, batch *leveldb.Batch) {
err := db.Write(batch, nil)
if err != nil {
log.Fatal(err)
}
batch.Reset()
}
示例12: DeleteData
func (ds *LevelDBStorage) DeleteData(id ...string) error {
wb := new(leveldb.Batch)
for _, i := range id {
wb.Delete(enc.UnsafeStringToBytes(i))
}
return ds.db.Write(wb, nil)
}
示例13: deleteMessages
func (server *Server) deleteMessages(uid *[32]byte, messageList []*[32]byte) error {
batch := new(leveldb.Batch)
for _, messageID := range messageList {
key := append(append([]byte{'m'}, uid[:]...), messageID[:]...)
batch.Delete(key)
}
return server.database.Write(batch, wO_sync)
}
示例14: putBatch
func (l *internalLevelDBStore) putBatch(b *leveldb.Batch, numBytes int) {
l.concurrentWriteLimit <- struct{}{}
err := l.db.Write(b, nil)
d.Chk.NoError(err)
l.putCount += int64(b.Len())
l.putBytes += int64(numBytes)
<-l.concurrentWriteLimit
}
示例15: ldbCheckGlobals
func ldbCheckGlobals(db *leveldb.DB, folder []byte) {
defer runtime.GC()
snap, err := db.GetSnapshot()
if err != nil {
panic(err)
}
l.Debugf("created snapshot %p", snap)
defer func() {
l.Debugf("close snapshot %p", snap)
snap.Release()
}()
start := globalKey(folder, nil)
limit := globalKey(folder, []byte{0xff, 0xff, 0xff, 0xff})
dbi := snap.NewIterator(&util.Range{Start: start, Limit: limit}, nil)
defer dbi.Release()
batch := new(leveldb.Batch)
l.Debugf("new batch %p", batch)
var fk []byte
for dbi.Next() {
gk := dbi.Key()
var vl versionList
err := vl.UnmarshalXDR(dbi.Value())
if err != nil {
panic(err)
}
// Check the global version list for consistency. An issue in previous
// versions of goleveldb could result in reordered writes so that
// there are global entries pointing to no longer existing files. Here
// we find those and clear them out.
name := globalKeyName(gk)
var newVL versionList
for _, version := range vl.versions {
fk = deviceKeyInto(fk[:cap(fk)], folder, version.device, name)
l.Debugf("snap.Get %p %x", snap, fk)
_, err := snap.Get(fk, nil)
if err == leveldb.ErrNotFound {
continue
}
if err != nil {
panic(err)
}
newVL.versions = append(newVL.versions, version)
}
if len(newVL.versions) != len(vl.versions) {
l.Infof("db repair: rewriting global version list for %x %x", gk[1:1+64], gk[1+64:])
batch.Put(dbi.Key(), newVL.MustMarshalXDR())
}
}
l.Debugf("db check completed for %q", folder)
db.Write(batch, nil)
}