def open_session(self, config=None):
     session = ffi.new('WT_SESSION **')
     config = charp_or_null(config)
     code = self._connection[0].open_session(
         self._connection[0], ffi.NULL,
         config,
         session
     )
     return check(code, Session(session))
 def open_cursor(self, uri, config=''):
     cursor = ffi.new('WT_CURSOR **')
     uri = charp_or_null(uri)
     config = charp_or_null(config)
     code = self._session[0].open_cursor(
         self._session[0],
         uri,
         ffi.NULL,
         config,
         cursor
     )
     return check(code, Cursor(cursor))
def make_item(x):
    item = ffi.new('WT_ITEM *')
    item[0].data = ffi.new('char[]', x)
    item[0].size = len(x)
    return item
 def __init__(self, home, config):
     wt = ffi.new('WT_CONNECTION **')
     home, config = map(charp_or_null, (home, config))
     code = lib.wiredtiger_open(home, ffi.NULL, config, wt)
     self._connection = check(code, wt)
 def search_near(self):
     out = ffi.new('int *')
     code = self._cursor[0].search_near(self._cursor[0], out)
     return check(code, out[0])
        check(self._session[0].commit_transaction(self._session[0], config))

    def transaction_rollback(self, config=None):
        config = charp_or_null(config)
        check(self._session[0].rollback_transaction(self._session[0], config))


def make_item(x):
    item = ffi.new('WT_ITEM *')
    item[0].data = ffi.new('char[]', x)
    item[0].size = len(x)
    return item


TO_CDATA = {
    'S': lambda x: ffi.new('char[]', x.encode('utf-8')),
    'Q': lambda x: ffi.cast('uint64_t', x),
    'q': lambda x: ffi.cast('int64_t', x),
    'u': make_item
}

INIT_CDATA = {
    'S': lambda: ffi.new('char **'),
    'Q': lambda: ffi.new('uint64_t *'),
    'q': lambda: ffi.new('int64_t *'),
    'u': lambda: ffi.new('WT_ITEM *'),
    'U': lambda: ffi.new('WT_ITEM *'),
}

FROM_CDATA = {
    'S': lambda x: ffi.string(x[0]).decode('utf-8'),