mirror of
https://github.com/borgbackup/borg.git
synced 2025-03-12 07:08:47 +00:00
FuseVersionsIndex: use borghash.HashTableNT
Also: - have a small wrapper class FuseVersionsIndex around HashTableNT to adapt API difference and add some special methods.
This commit is contained in:
parent
ad5b18008d
commit
ca582b640c
2 changed files with 31 additions and 45 deletions
|
@ -875,12 +875,3 @@ hashindex_size(HashIndex *index)
|
||||||
{
|
{
|
||||||
return sizeof(HashHeader) + index->num_buckets * index->bucket_size;
|
return sizeof(HashHeader) + index->num_buckets * index->bucket_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Used by the FuseVersionsIndex.
|
|
||||||
*/
|
|
||||||
BORG_PACKED(
|
|
||||||
typedef struct {
|
|
||||||
uint32_t version;
|
|
||||||
char hash[16];
|
|
||||||
} ) FuseVersionsElement;
|
|
||||||
|
|
|
@ -2,8 +2,6 @@ from collections import namedtuple
|
||||||
|
|
||||||
cimport cython
|
cimport cython
|
||||||
from libc.stdint cimport uint32_t, UINT32_MAX, uint64_t
|
from libc.stdint cimport uint32_t, UINT32_MAX, uint64_t
|
||||||
from libc.string cimport memcpy
|
|
||||||
from cpython.bytes cimport PyBytes_FromStringAndSize, PyBytes_CheckExact, PyBytes_GET_SIZE, PyBytes_AS_STRING
|
|
||||||
|
|
||||||
from borghash cimport _borghash
|
from borghash cimport _borghash
|
||||||
|
|
||||||
|
@ -14,10 +12,6 @@ cdef extern from "_hashindex.c":
|
||||||
ctypedef struct HashIndex:
|
ctypedef struct HashIndex:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
ctypedef struct FuseVersionsElement:
|
|
||||||
uint32_t version
|
|
||||||
char hash[16]
|
|
||||||
|
|
||||||
HashIndex *hashindex_read(object file_py, int permit_compact, int legacy) except *
|
HashIndex *hashindex_read(object file_py, int permit_compact, int legacy) except *
|
||||||
HashIndex *hashindex_init(int capacity, int key_size, int value_size)
|
HashIndex *hashindex_init(int capacity, int key_size, int value_size)
|
||||||
void hashindex_free(HashIndex *index)
|
void hashindex_free(HashIndex *index)
|
||||||
|
@ -162,36 +156,6 @@ cdef class IndexBase:
|
||||||
return hashindex_compact(self.index)
|
return hashindex_compact(self.index)
|
||||||
|
|
||||||
|
|
||||||
cdef class FuseVersionsIndex(IndexBase):
|
|
||||||
# 4 byte version + 16 byte file contents hash
|
|
||||||
value_size = 20
|
|
||||||
_key_size = 16
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
|
||||||
cdef FuseVersionsElement *data
|
|
||||||
assert len(key) == self.key_size
|
|
||||||
data = <FuseVersionsElement *>hashindex_get(self.index, <unsigned char *>key)
|
|
||||||
if data == NULL:
|
|
||||||
raise KeyError(key)
|
|
||||||
return _le32toh(data.version), PyBytes_FromStringAndSize(data.hash, 16)
|
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
|
||||||
cdef FuseVersionsElement data
|
|
||||||
assert len(key) == self.key_size
|
|
||||||
data.version = value[0]
|
|
||||||
assert data.version <= _MAX_VALUE, "maximum number of versions reached"
|
|
||||||
if not PyBytes_CheckExact(value[1]) or PyBytes_GET_SIZE(value[1]) != 16:
|
|
||||||
raise TypeError("Expected bytes of length 16 for second value")
|
|
||||||
memcpy(data.hash, PyBytes_AS_STRING(value[1]), 16)
|
|
||||||
data.version = _htole32(data.version)
|
|
||||||
if not hashindex_set(self.index, <unsigned char *>key, <void *> &data):
|
|
||||||
raise Exception('hashindex_set failed')
|
|
||||||
|
|
||||||
def __contains__(self, key):
|
|
||||||
assert len(key) == self.key_size
|
|
||||||
return hashindex_get(self.index, <unsigned char *>key) != NULL
|
|
||||||
|
|
||||||
|
|
||||||
NSIndexEntry = namedtuple('NSIndexEntry', 'segment offset size')
|
NSIndexEntry = namedtuple('NSIndexEntry', 'segment offset size')
|
||||||
|
|
||||||
|
|
||||||
|
@ -410,3 +374,34 @@ class ChunkIndex:
|
||||||
|
|
||||||
def size(self):
|
def size(self):
|
||||||
return self.ht.size()
|
return self.ht.size()
|
||||||
|
|
||||||
|
|
||||||
|
FuseVersionsIndexEntry = namedtuple('FuseVersionsEntry', 'version hash')
|
||||||
|
|
||||||
|
|
||||||
|
class FuseVersionsIndex:
|
||||||
|
# key: 16 bytes, value: 4 byte version + 16 bytes file contents hash
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.ht = _borghash.HashTableNT(key_size=16, value_format="<I16s", namedtuple_type=FuseVersionsIndexEntry)
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self.ht[key] = value
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self.ht[key]
|
||||||
|
|
||||||
|
def __delitem__(self, key):
|
||||||
|
del self.ht[key]
|
||||||
|
|
||||||
|
def __contains__(self, key):
|
||||||
|
return key in self.ht
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.ht)
|
||||||
|
|
||||||
|
def get(self, key, default=None):
|
||||||
|
try:
|
||||||
|
return self[key]
|
||||||
|
except KeyError:
|
||||||
|
return default
|
||||||
|
|
Loading…
Add table
Reference in a new issue