示例#1
0
文件: core.py 项目: lazerhawk/acid
    def __init__(self, engine, txn_context=None, prefix=''):
        self.engine = engine
        self.prefix = prefix
        self._txn_context = txn_context or TxnContext(engine)
        self._on_commit = []
        self._after_commit = []
        self._after_abort = []
        # TODO HACK
        self._txn_context._on_commit = self._on_commit
        self._txn_context._after_commit = self._after_commit
        self._txn_context._after_abort = self._after_abort
        self.begin = self._txn_context.begin
        self._counter_key_cache = {}
        self._encoder_prefix = dict((e, keylib.pack_int(1 + i))
                                    for i, e in enumerate(encoders._ENCODERS))
        self._prefix_encoder = dict((keylib.pack_int(1 + i), e)
                                    for i, e in enumerate(encoders._ENCODERS))

        # ((kind, name, attr), value)
        meta_info = {'name': '\x00meta', 'idx': 9, 'strategy': 'basic'}
        self._meta = Collection(self,
                                meta_info,
                                encoder=encoders.KEY,
                                key_func=lambda t: t[:3])
        self._objs = {}
示例#2
0
文件: core.py 项目: prologic/acid
 def __init__(self, engine, txn_context=None, prefix=''):
     self.engine = engine
     self.prefix = prefix
     self._txn_context = txn_context or TxnContext(engine)
     self.begin = self._txn_context.begin
     self._counter_key_cache = {}
     self._encoder_prefix = dict((e, keylib.pack_int('', 1 + i))
                                 for i, e in enumerate(encoders._ENCODERS))
     self._prefix_encoder = dict((keylib.pack_int('', 1 + i), e)
                                 for i, e in enumerate(encoders._ENCODERS))
     # ((kind, name, attr), value)
     self._meta = Collection(self, {'name': '\x00meta', 'idx': 9},
         encoder=encoders.KEY, key_func=lambda t: t[:3])
     self._colls = {}
示例#3
0
文件: core.py 项目: prologic/acid
 def add_encoder(self, encoder):
     """Register an :py:class:`acid.encoders.Encoder` so that
     :py:class:`Collection` can find it during decompression/unpacking."""
     try:
         return self._encoder_prefix[encoder]
     except KeyError:
         dct = self.get_info2(KIND_ENCODER, encoder.name)
         idx = dct.get('idx')
         if not dct:
             idx = self.count('\x00encoder_idx', init=10)
             assert idx <= 240
             self.set_info2(KIND_ENCODER, encoder.name, {'idx': idx})
         self._encoder_prefix[encoder] = keylib.pack_int('', idx)
         self._prefix_encoder[keylib.pack_int('', idx)] = encoder
         return self._encoder_prefix[encoder]
示例#4
0
文件: core.py 项目: lazerhawk/acid
 def add_encoder(self, encoder):
     """Register an :py:class:`acid.encoders.Encoder` so that
     :py:class:`Collection` can find it during decompression/unpacking."""
     try:
         return self._encoder_prefix[encoder]
     except KeyError:
         dct = self.get_meta(KIND_ENCODER, encoder.name)
         idx = dct.get('idx')
         if not dct:
             idx = self.count('\x00encoder_idx', init=10)
             assert idx <= 240
             self.set_meta(KIND_ENCODER, encoder.name, {'idx': idx})
         self._encoder_prefix[encoder] = keylib.pack_int(idx)
         self._prefix_encoder[keylib.pack_int(idx)] = encoder
         return self._encoder_prefix[encoder]
示例#5
0
文件: core.py 项目: prologic/acid
    def __init__(self, store, info, key_func=None, encoder=None,
                 counter_name=None):
        """Create an instance; see class docstring."""
        self.store = store
        self.engine = store.engine
        self.info = info
        self.prefix = keylib.pack_int(self.store.prefix, info['idx'])
        if not key_func:
            counter_name = counter_name or ('key:%(name)s' % self.info)
            key_func = lambda _: store.count(counter_name)
            info['blind'] = True
        else:
            info.setdefault('blind', False)

        self.key_func = key_func

        self.encoder = encoder or encoders.PICKLE
        self.encoder_prefix = self.store.add_encoder(self.encoder)
        #: Dict mapping indices added using :py:meth:`Collection.add_index` to
        #: :py:class:`Index` instances representing them.
        #:
        #: ::
        #:
        #:      idx = coll.add_index('some index', lambda v: v[0])
        #:      assert coll.indices['some index'] is idx
        self.indices = {}
示例#6
0
文件: core.py 项目: prologic/acid
 def __init__(self, coll, info, func):
     self.coll = coll
     self.store = coll.store
     self.engine = self.store.engine
     self.info = info
     #: The index function.
     self.func = func
     self.prefix = keylib.pack_int(self.store.prefix, info['idx'])
示例#7
0
文件: core.py 项目: lazerhawk/acid
    def __init__(self, coll, info, func):
        self.coll = coll
        self.store = coll.store
        self.info = info
        #: The index function.
        self.func = func
        self.prefix = keylib.pack_int(info['idx'], self.store.prefix)

        events.after_delete(self._coll_after_delete, coll)
        events.after_create(self._coll_after_create, coll)
        events.after_replace(self._coll_after_replace, coll)
示例#8
0
文件: core.py 项目: lazerhawk/acid
    def __init__(self,
                 store,
                 info,
                 key_func=None,
                 encoder=None,
                 compressor=None,
                 counter_name=None):
        """Create an instance; see class docstring."""
        self.store = store
        self.engine = store.engine
        self.info = info

        prefix = keylib.pack_int(info['idx'], self.store.prefix)
        if info.get('strategy', 'batch') == 'batch':
            compressor = compressor or encoders.PLAIN
            self.strategy = BatchV2Strategy(prefix, store, compressor)
        else:
            assert info['strategy'] == 'basic'
            self.strategy = BasicStrategy(prefix)

        if key_func:
            self.key_func = key_func
        else:
            counter_name = counter_name or ('key:%(name)s' % self.info)
            self.key_func = lambda _: store.count(counter_name)

        self.encoder = encoder or encoders.JSON
        self._on_update = []
        self._after_create = []
        self._after_replace = []
        self._after_delete = []
        self._after_update = []
        # Copied verbatim to allow proxying.
        self._on_commit = store._on_commit
        self._after_commit = store._after_commit
        self._after_abort = store._after_abort
示例#9
0
 def testInts(self):
     for i in self.INTS:
         s = keylib.pack_int('', i)
         j = keylib.unpack_int(s)
         assert j == i, (i, j, s)
示例#10
0
 def testInts(self):
     for i in self.INTS:
         s = keylib.pack_int(i)
         j = keylib.unpack_int(s)
         assert j == i, (i, j, s)
示例#11
0
def pack_sizes(cur):
    s = pack_int('', len(cur))
    s += 
    return pack_int('', len(cur)) + ''.join('   ' + pack_int('', len(l)) for l in cur)