github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/capi.go (about)

     1  // Copyright 2013 <chaishushan{AT}gmail.com>. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package leveldb
     6  
     7  /*
     8  #include "capi_helper.h"
     9  
    10  #cgo windows CFLAGS: -I. -I./include -I./capi -fno-stack-check -fno-stack-protector -mno-stack-arg-probe
    11  #cgo windows CXXFLAGS: -I. -I./include -I./capi -fno-stack-check -fno-stack-protector -mno-stack-arg-probe
    12  #cgo windows LDFLAGS: -L./capi -lleveldb_c
    13  // -static -static-libgcc -static-libstdc++
    14  
    15  #cgo linux CFLAGS: -I. -I./include -I./capi
    16  #cgo linux CXXFLAGS: -I. -I./include -I./capi
    17  #cgo linux LDFLAGS: -static
    18  */
    19  import "C"
    20  import "unsafe"
    21  import "reflect"
    22  
    23  // ----------------------------------------------------------------------------
    24  // Exported types
    25  // ----------------------------------------------------------------------------
    26  
    27  type (
    28  	leveldb_t              C.leveldb_t
    29  	leveldb_snapshot_t     C.leveldb_snapshot_t
    30  	leveldb_options_t      C.leveldb_options_t
    31  	leveldb_readoptions_t  C.leveldb_readoptions_t
    32  	leveldb_writeoptions_t C.leveldb_writeoptions_t
    33  	leveldb_writebatch_t   C.leveldb_writebatch_t
    34  	leveldb_iterator_t     C.leveldb_iterator_t
    35  	leveldb_comparator_t   C.leveldb_comparator_t
    36  	leveldb_filterpolicy_t C.leveldb_filterpolicy_t
    37  	leveldb_cache_t        C.leveldb_cache_t
    38  	leveldb_slice_t        C.leveldb_slice_t
    39  	leveldb_value_t        C.leveldb_value_t
    40  	leveldb_compression_t  C.leveldb_compression_t
    41  	leveldb_status_t       C.leveldb_status_t
    42  	leveldb_bool_t         C.leveldb_bool_t
    43  )
    44  
    45  // --------------------------------------------------------
    46  
    47  // leveldb_status_t
    48  const (
    49  	leveldb_status_ok               = C.leveldb_status_ok
    50  	leveldb_status_invalid_argument = C.leveldb_status_invalid_argument
    51  	leveldb_status_not_found        = C.leveldb_status_not_found
    52  	leveldb_status_corruption       = C.leveldb_status_corruption
    53  	leveldb_status_io_error         = C.leveldb_status_io_error
    54  	leveldb_status_unknown          = C.leveldb_status_unknown
    55  	leveldb_status_max              = C.leveldb_status_max
    56  )
    57  
    58  // leveldb_compression_t
    59  const (
    60  	leveldb_compression_nil    = C.leveldb_compression_nil
    61  	leveldb_compression_snappy = C.leveldb_compression_snappy
    62  	leveldb_compression_max    = C.leveldb_compression_max
    63  )
    64  
    65  // ----------------------------------------------------------------------------
    66  // Version
    67  // ----------------------------------------------------------------------------
    68  
    69  func leveldb_major_version() int {
    70  	v := C.leveldb_major_version()
    71  	return int(v)
    72  }
    73  func leveldb_minor_version() int {
    74  	v := C.leveldb_minor_version()
    75  	return int(v)
    76  }
    77  
    78  // ----------------------------------------------------------------------------
    79  // Slice
    80  // ----------------------------------------------------------------------------
    81  
    82  func leveldb_slice_new(data []byte) *leveldb_slice_t {
    83  	if len(data) != 0 {
    84  		return &leveldb_slice_t{
    85  			data: (*C.char)(unsafe.Pointer(&data[0])),
    86  			size: C.int32_t(len(data)),
    87  		}
    88  	} else {
    89  		return &leveldb_slice_t{
    90  			data: (*C.char)(unsafe.Pointer(nil)),
    91  			size: C.int32_t(0),
    92  		}
    93  	}
    94  }
    95  
    96  func leveldb_slice_data(p *leveldb_slice_t) (data []byte) {
    97  	h := (*reflect.SliceHeader)((unsafe.Pointer(&data)))
    98  	h.Data = uintptr(unsafe.Pointer(p.data))
    99  	h.Cap = int(p.size)
   100  	h.Len = h.Cap
   101  	return
   102  }
   103  
   104  // ----------------------------------------------------------------------------
   105  // Value
   106  // ----------------------------------------------------------------------------
   107  
   108  func leveldb_value_create(data []byte) *leveldb_value_t {
   109  	p := C.leveldb_value_create(
   110  		(*C.char)(unsafe.Pointer(&data[0])),
   111  		C.int32_t(len(data)),
   112  	)
   113  	return (*leveldb_value_t)(p)
   114  }
   115  func leveldb_value_create_copy(v *leveldb_value_t) *leveldb_value_t {
   116  	p := C.leveldb_value_create_copy((*C.leveldb_value_t)(v))
   117  	return (*leveldb_value_t)(p)
   118  }
   119  func leveldb_value_destroy(p *leveldb_value_t) {
   120  	C.leveldb_value_destroy((*C.leveldb_value_t)(p))
   121  }
   122  
   123  func leveldb_value_data(p *leveldb_value_t) (data []byte) {
   124  	h := (*reflect.SliceHeader)((unsafe.Pointer(&data)))
   125  	h.Data = uintptr(unsafe.Pointer(C.leveldb_value_data((*C.leveldb_value_t)(p))))
   126  	h.Cap = int(C.leveldb_value_size((*C.leveldb_value_t)(p)))
   127  	h.Len = h.Cap
   128  	return
   129  }
   130  func leveldb_value_cstr(p *leveldb_value_t) string {
   131  	var data []byte
   132  	h := (*reflect.SliceHeader)((unsafe.Pointer(&data)))
   133  	h.Data = uintptr(unsafe.Pointer(C.leveldb_value_data((*C.leveldb_value_t)(p))))
   134  	h.Cap = int(C.leveldb_value_size((*C.leveldb_value_t)(p)))
   135  	h.Len = h.Cap
   136  	return string(data)
   137  }
   138  
   139  // ----------------------------------------------------------------------------
   140  // Error
   141  // ----------------------------------------------------------------------------
   142  
   143  func leveldb_error(e C.leveldb_status_t, errStr *C.leveldb_value_t) *Error {
   144  	switch leveldb_status_t(e) {
   145  	case leveldb_status_ok:
   146  		return nil
   147  	case leveldb_status_invalid_argument:
   148  		return newError(errInvalidArgument, "")
   149  	case leveldb_status_not_found:
   150  		return newError(errNotFound, "")
   151  	case leveldb_status_corruption:
   152  		return newError(errCorruption, "")
   153  	case leveldb_status_io_error:
   154  		return newError(errIOError, "")
   155  	}
   156  	return newError(errUnknown, leveldb_value_cstr((*leveldb_value_t)(errStr)))
   157  }
   158  
   159  // ----------------------------------------------------------------------------
   160  // Options
   161  // ----------------------------------------------------------------------------
   162  
   163  func leveldb_options_create() *leveldb_options_t {
   164  	p := C.leveldb_options_create()
   165  	return (*leveldb_options_t)(p)
   166  }
   167  func leveldb_options_destroy(p *leveldb_options_t) {
   168  	C.leveldb_options_destroy((*C.leveldb_options_t)(p))
   169  }
   170  
   171  func leveldb_options_set_comparator(p *leveldb_options_t, v *leveldb_comparator_t) {
   172  	C.leveldb_options_set_comparator((*C.leveldb_options_t)(p), (*C.leveldb_comparator_t)(v))
   173  }
   174  func leveldb_options_get_comparator(p *leveldb_options_t) *leveldb_comparator_t {
   175  	v := C.leveldb_options_get_comparator((*C.leveldb_options_t)(p))
   176  	return (*leveldb_comparator_t)(v)
   177  }
   178  
   179  func leveldb_options_set_filter_policy(p *leveldb_options_t, v *leveldb_filterpolicy_t) {
   180  	C.leveldb_options_set_filter_policy((*C.leveldb_options_t)(p), (*C.leveldb_filterpolicy_t)(v))
   181  }
   182  func leveldb_options_get_filter_policy(p *leveldb_options_t) *leveldb_filterpolicy_t {
   183  	v := C.leveldb_options_get_filter_policy((*C.leveldb_options_t)(p))
   184  	return (*leveldb_filterpolicy_t)(v)
   185  }
   186  
   187  func leveldb_options_set_create_if_missing(p *leveldb_options_t, v bool) {
   188  	if v {
   189  		C.leveldb_options_set_create_if_missing((*C.leveldb_options_t)(p), 1)
   190  	} else {
   191  		C.leveldb_options_set_create_if_missing((*C.leveldb_options_t)(p), 0)
   192  	}
   193  }
   194  func leveldb_options_get_create_if_missing(p *leveldb_options_t) bool {
   195  	v := C.leveldb_options_get_create_if_missing((*C.leveldb_options_t)(p))
   196  	return (v != 0)
   197  }
   198  
   199  func leveldb_options_set_error_if_exists(p *leveldb_options_t, v bool) {
   200  	if v {
   201  		C.leveldb_options_set_error_if_exists((*C.leveldb_options_t)(p), 1)
   202  	} else {
   203  		C.leveldb_options_set_error_if_exists((*C.leveldb_options_t)(p), 0)
   204  	}
   205  }
   206  func leveldb_options_get_error_if_exists(p *leveldb_options_t) bool {
   207  	v := C.leveldb_options_get_error_if_exists((*C.leveldb_options_t)(p))
   208  	return (v != 0)
   209  }
   210  
   211  func leveldb_options_set_paranoid_checks(p *leveldb_options_t, v bool) {
   212  	if v {
   213  		C.leveldb_options_set_paranoid_checks((*C.leveldb_options_t)(p), 1)
   214  	} else {
   215  		C.leveldb_options_set_paranoid_checks((*C.leveldb_options_t)(p), 0)
   216  	}
   217  }
   218  func leveldb_options_get_paranoid_checks(p *leveldb_options_t) bool {
   219  	v := C.leveldb_options_get_paranoid_checks((*C.leveldb_options_t)(p))
   220  	return (v != 0)
   221  }
   222  
   223  func leveldb_options_set_write_buffer_size(p *leveldb_options_t, v int) {
   224  	C.leveldb_options_set_write_buffer_size((*C.leveldb_options_t)(p), C.int32_t(v))
   225  }
   226  func leveldb_options_get_write_buffer_size(p *leveldb_options_t) int {
   227  	v := C.leveldb_options_get_write_buffer_size((*C.leveldb_options_t)(p))
   228  	return int(v)
   229  }
   230  
   231  func leveldb_options_set_max_open_files(p *leveldb_options_t, v int) {
   232  	C.leveldb_options_set_max_open_files((*C.leveldb_options_t)(p), C.int32_t(v))
   233  }
   234  func leveldb_options_get_max_open_files(p *leveldb_options_t) int {
   235  	v := C.leveldb_options_get_max_open_files((*C.leveldb_options_t)(p))
   236  	return int(v)
   237  }
   238  
   239  func leveldb_options_set_cache(p *leveldb_options_t, v *leveldb_cache_t) {
   240  	C.leveldb_options_set_cache((*C.leveldb_options_t)(p), (*C.leveldb_cache_t)(v))
   241  }
   242  func leveldb_options_get_cache(p *leveldb_options_t) *leveldb_cache_t {
   243  	v := C.leveldb_options_get_cache((*C.leveldb_options_t)(p))
   244  	return (*leveldb_cache_t)(v)
   245  }
   246  
   247  func leveldb_options_set_block_size(p *leveldb_options_t, v int) {
   248  	C.leveldb_options_set_block_size((*C.leveldb_options_t)(p), C.int32_t(v))
   249  }
   250  func leveldb_options_get_block_size(p *leveldb_options_t) int {
   251  	v := C.leveldb_options_get_block_size((*C.leveldb_options_t)(p))
   252  	return int(v)
   253  }
   254  
   255  func leveldb_options_set_block_restart_interval(p *leveldb_options_t, v int) {
   256  	C.leveldb_options_set_block_restart_interval((*C.leveldb_options_t)(p), C.int32_t(v))
   257  }
   258  func leveldb_options_get_block_restart_interval(p *leveldb_options_t) int {
   259  	v := C.leveldb_options_get_block_restart_interval((*C.leveldb_options_t)(p))
   260  	return int(v)
   261  }
   262  
   263  func leveldb_options_set_compression(p *leveldb_options_t, v int) {
   264  	C.leveldb_options_set_compression((*C.leveldb_options_t)(p), C.leveldb_compression_t(v))
   265  }
   266  func leveldb_options_get_compression(p *leveldb_options_t) leveldb_compression_t {
   267  	v := C.leveldb_options_get_compression((*C.leveldb_options_t)(p))
   268  	return leveldb_compression_t(v)
   269  }
   270  
   271  // ----------------------------------------------------------------------------
   272  // ReadOptions
   273  // ----------------------------------------------------------------------------
   274  
   275  func leveldb_readoptions_create() *leveldb_readoptions_t {
   276  	p := C.leveldb_readoptions_create()
   277  	return (*leveldb_readoptions_t)(p)
   278  }
   279  func leveldb_readoptions_destroy(p *leveldb_readoptions_t) {
   280  	C.leveldb_readoptions_destroy((*C.leveldb_readoptions_t)(p))
   281  }
   282  
   283  func leveldb_readoptions_set_verify_checksums(p *leveldb_readoptions_t, v bool) {
   284  	if v {
   285  		C.leveldb_readoptions_set_verify_checksums((*C.leveldb_readoptions_t)(p), 1)
   286  	} else {
   287  		C.leveldb_readoptions_set_verify_checksums((*C.leveldb_readoptions_t)(p), 0)
   288  	}
   289  }
   290  func leveldb_readoptions_get_verify_checksums(p *leveldb_readoptions_t) bool {
   291  	v := C.leveldb_readoptions_get_verify_checksums((*C.leveldb_readoptions_t)(p))
   292  	return (v != 0)
   293  }
   294  
   295  func leveldb_readoptions_set_fill_cache(p *leveldb_readoptions_t, v bool) {
   296  	if v {
   297  		C.leveldb_readoptions_set_fill_cache((*C.leveldb_readoptions_t)(p), 1)
   298  	} else {
   299  		C.leveldb_readoptions_set_fill_cache((*C.leveldb_readoptions_t)(p), 0)
   300  	}
   301  }
   302  func leveldb_readoptions_get_fill_cache(p *leveldb_readoptions_t) bool {
   303  	v := C.leveldb_readoptions_get_fill_cache((*C.leveldb_readoptions_t)(p))
   304  	return (v != 0)
   305  }
   306  
   307  func leveldb_readoptions_set_snapshot(p *leveldb_readoptions_t, v *leveldb_snapshot_t) {
   308  	C.leveldb_readoptions_set_snapshot((*C.leveldb_readoptions_t)(p), (*C.leveldb_snapshot_t)(v))
   309  }
   310  func leveldb_readoptions_get_snapshot(p *leveldb_readoptions_t) *leveldb_snapshot_t {
   311  	v := C.leveldb_readoptions_get_snapshot((*C.leveldb_readoptions_t)(p))
   312  	return (*leveldb_snapshot_t)(v)
   313  }
   314  
   315  // ----------------------------------------------------------------------------
   316  // WriteOptions
   317  // ----------------------------------------------------------------------------
   318  
   319  func leveldb_writeoptions_create() *leveldb_writeoptions_t {
   320  	p := C.leveldb_writeoptions_create()
   321  	return (*leveldb_writeoptions_t)(p)
   322  }
   323  func leveldb_writeoptions_destroy(p *leveldb_writeoptions_t) {
   324  	C.leveldb_writeoptions_destroy((*C.leveldb_writeoptions_t)(p))
   325  }
   326  
   327  func leveldb_writeoptions_set_sync(p *leveldb_writeoptions_t, v bool) {
   328  	if v {
   329  		C.leveldb_writeoptions_set_sync((*C.leveldb_writeoptions_t)(p), 1)
   330  	} else {
   331  		C.leveldb_writeoptions_set_sync((*C.leveldb_writeoptions_t)(p), 0)
   332  	}
   333  }
   334  func leveldb_writeoptions_get_sync(p *leveldb_writeoptions_t) bool {
   335  	v := C.leveldb_writeoptions_get_sync((*C.leveldb_writeoptions_t)(p))
   336  	return (v != 0)
   337  }
   338  
   339  // ----------------------------------------------------------------------------
   340  // DB
   341  // ----------------------------------------------------------------------------
   342  
   343  func leveldb_repair_db(name string, opt *leveldb_options_t) error {
   344  	cname := C.CString(name)
   345  	defer C.free(unsafe.Pointer(cname))
   346  
   347  	var errStr *C.leveldb_value_t
   348  	status := C.leveldb_repair_db((*C.leveldb_options_t)(opt), cname, &errStr)
   349  	if errStr != nil {
   350  		defer C.leveldb_value_destroy(errStr)
   351  	}
   352  	return leveldb_error(status, errStr)
   353  }
   354  func leveldb_destroy_db(name string, opt *leveldb_options_t) error {
   355  	cname := C.CString(name)
   356  	defer C.free(unsafe.Pointer(cname))
   357  
   358  	var errStr *C.leveldb_value_t
   359  	status := C.leveldb_destroy_db((*C.leveldb_options_t)(opt), cname, &errStr)
   360  	if errStr != nil {
   361  		defer C.leveldb_value_destroy(errStr)
   362  	}
   363  	return leveldb_error(status, errStr)
   364  }
   365  
   366  func leveldb_open(name string, opt *leveldb_options_t) (*leveldb_t, error) {
   367  	cname := C.CString(name)
   368  	defer C.free(unsafe.Pointer(cname))
   369  
   370  	var db *C.leveldb_t
   371  	var errStr *C.leveldb_value_t
   372  	status := C.leveldb_open((*C.leveldb_options_t)(opt), cname, &db, &errStr)
   373  	if errStr != nil {
   374  		defer C.leveldb_value_destroy(errStr)
   375  	}
   376  	return (*leveldb_t)(db), leveldb_error(status, errStr)
   377  }
   378  func leveldb_close(db *leveldb_t) {
   379  	C.leveldb_close((*C.leveldb_t)(db))
   380  }
   381  
   382  func leveldb_get(db *leveldb_t, key []byte, opt *leveldb_readoptions_t) (*leveldb_value_t, error) {
   383  	var data *C.leveldb_value_t
   384  	var errStr *C.leveldb_value_t
   385  	var status = C.leveldb_get(
   386  		(*C.leveldb_t)(db),
   387  		(*C.leveldb_readoptions_t)(opt),
   388  		(*C.leveldb_slice_t)(leveldb_slice_new(key)), &data,
   389  		&errStr,
   390  	)
   391  	if errStr != nil {
   392  		defer C.leveldb_value_destroy(errStr)
   393  	}
   394  	return (*leveldb_value_t)(data), leveldb_error(status, errStr)
   395  }
   396  func leveldb_put(db *leveldb_t, key, val []byte, opt *leveldb_writeoptions_t) error {
   397  	var errStr *C.leveldb_value_t
   398  	var status = C.leveldb_put(
   399  		(*C.leveldb_t)(db),
   400  		(*C.leveldb_writeoptions_t)(opt),
   401  		(*C.leveldb_slice_t)(leveldb_slice_new(key)),
   402  		(*C.leveldb_slice_t)(leveldb_slice_new(val)),
   403  		&errStr,
   404  	)
   405  	if errStr != nil {
   406  		defer C.leveldb_value_destroy(errStr)
   407  	}
   408  	return leveldb_error(status, errStr)
   409  }
   410  func leveldb_delete(db *leveldb_t, key []byte, opt *leveldb_writeoptions_t) error {
   411  	var errStr *C.leveldb_value_t
   412  	var status = C.leveldb_delete(
   413  		(*C.leveldb_t)(db),
   414  		(*C.leveldb_writeoptions_t)(opt),
   415  		(*C.leveldb_slice_t)(leveldb_slice_new(key)),
   416  		&errStr,
   417  	)
   418  	if errStr != nil {
   419  		defer C.leveldb_value_destroy(errStr)
   420  	}
   421  	return leveldb_error(status, errStr)
   422  }
   423  
   424  func leveldb_write(db *leveldb_t, batch *leveldb_writebatch_t, opt *leveldb_writeoptions_t) error {
   425  	var errStr *C.leveldb_value_t
   426  	var status = C.leveldb_write(
   427  		(*C.leveldb_t)(db),
   428  		(*C.leveldb_writeoptions_t)(opt),
   429  		(*C.leveldb_writebatch_t)(batch),
   430  		&errStr,
   431  	)
   432  	if errStr != nil {
   433  		defer C.leveldb_value_destroy(errStr)
   434  	}
   435  	return leveldb_error(status, errStr)
   436  }
   437  
   438  func leveldb_property_value(db *leveldb_t, name string) *leveldb_value_t {
   439  	cname := C.CString(name)
   440  	defer C.free(unsafe.Pointer(cname))
   441  
   442  	var value *C.leveldb_value_t
   443  	C.leveldb_property_value(
   444  		(*C.leveldb_t)(db),
   445  		cname, &value,
   446  	)
   447  	return (*leveldb_value_t)(value)
   448  }
   449  
   450  func leveldb_approximate_sizes(db *leveldb_t, rangeStartKey, rangeLimitKey [][]byte) []uint64 {
   451  	if len(rangeStartKey) != len(rangeLimitKey) {
   452  		panic("leveldb/capi.go: invalid argument")
   453  	}
   454  
   455  	range_start_key := make([]*C.leveldb_slice_t, len(rangeStartKey))
   456  	range_limit_key := make([]*C.leveldb_slice_t, len(rangeStartKey))
   457  	for i := 0; i < len(rangeStartKey); i++ {
   458  		range_start_key[i] = (*C.leveldb_slice_t)(leveldb_slice_new(rangeStartKey[i]))
   459  		range_limit_key[i] = (*C.leveldb_slice_t)(leveldb_slice_new(rangeLimitKey[i]))
   460  	}
   461  
   462  	sizes := make([]uint64, len(rangeStartKey))
   463  	C.leveldb_approximate_sizes(
   464  		(*C.leveldb_t)(db),
   465  		(C.int32_t)(len(rangeStartKey)),
   466  		(**C.leveldb_slice_t)(&range_start_key[0]),
   467  		(**C.leveldb_slice_t)(&range_limit_key[0]),
   468  		(*C.uint64_t)(&sizes[0]),
   469  	)
   470  	return sizes
   471  }
   472  
   473  func leveldb_compact_range(db *leveldb_t, rangeStartKey, rangeLimitKey []byte) {
   474  	C.leveldb_compact_range(
   475  		(*C.leveldb_t)(db),
   476  		(*C.leveldb_slice_t)(leveldb_slice_new(rangeStartKey)),
   477  		(*C.leveldb_slice_t)(leveldb_slice_new(rangeLimitKey)),
   478  	)
   479  }
   480  
   481  func leveldb_create_snapshot(db *leveldb_t) *leveldb_snapshot_t {
   482  	p := C.leveldb_create_snapshot((*C.leveldb_t)(db))
   483  	return (*leveldb_snapshot_t)(p)
   484  }
   485  func leveldb_release_snapshot(db *leveldb_t, p *leveldb_snapshot_t) {
   486  	C.leveldb_release_snapshot((*C.leveldb_t)(db), (*C.leveldb_snapshot_t)(p))
   487  }
   488  
   489  // ----------------------------------------------------------------------------
   490  // Iterator
   491  // ----------------------------------------------------------------------------
   492  
   493  func leveldb_create_iterator(db *leveldb_t, opt *leveldb_readoptions_t) *leveldb_iterator_t {
   494  	p := C.leveldb_create_iterator((*C.leveldb_t)(db), (*C.leveldb_readoptions_t)(opt))
   495  	return (*leveldb_iterator_t)(p)
   496  }
   497  func leveldb_iter_destroy(it *leveldb_iterator_t) {
   498  	C.leveldb_iter_destroy((*C.leveldb_iterator_t)(it))
   499  }
   500  
   501  func leveldb_iter_valid(it *leveldb_iterator_t) bool {
   502  	v := C.leveldb_iter_valid((*C.leveldb_iterator_t)(it))
   503  	return (v != 0)
   504  }
   505  
   506  func leveldb_iter_seek_to_first(it *leveldb_iterator_t) {
   507  	C.leveldb_iter_seek_to_first((*C.leveldb_iterator_t)(it))
   508  }
   509  func leveldb_iter_seek_to_last(it *leveldb_iterator_t) {
   510  	C.leveldb_iter_seek_to_last((*C.leveldb_iterator_t)(it))
   511  }
   512  func leveldb_iter_seek(it *leveldb_iterator_t, key []byte) {
   513  	C.leveldb_iter_seek(
   514  		(*C.leveldb_iterator_t)(it),
   515  		(*C.leveldb_slice_t)(leveldb_slice_new(key)),
   516  	)
   517  }
   518  
   519  func leveldb_iter_next(it *leveldb_iterator_t) {
   520  	C.leveldb_iter_next((*C.leveldb_iterator_t)(it))
   521  }
   522  func leveldb_iter_prev(it *leveldb_iterator_t) {
   523  	C.leveldb_iter_prev((*C.leveldb_iterator_t)(it))
   524  }
   525  
   526  func leveldb_iter_key(it *leveldb_iterator_t) *leveldb_slice_t {
   527  	v := C.leveldb_iter_key((*C.leveldb_iterator_t)(it))
   528  	return (*leveldb_slice_t)(&v)
   529  }
   530  func leveldb_iter_value(it *leveldb_iterator_t) *leveldb_slice_t {
   531  	v := C.leveldb_iter_value((*C.leveldb_iterator_t)(it))
   532  	return (*leveldb_slice_t)(&v)
   533  }
   534  
   535  func leveldb_iter_get_error(it *leveldb_iterator_t) error {
   536  	var errStr *C.leveldb_value_t
   537  	var status = C.leveldb_iter_get_error(
   538  		(*C.leveldb_iterator_t)(it),
   539  		&errStr,
   540  	)
   541  	if errStr != nil {
   542  		defer C.leveldb_value_destroy(errStr)
   543  	}
   544  	return leveldb_error(status, errStr)
   545  }
   546  
   547  // ----------------------------------------------------------------------------
   548  // WriteBatch
   549  // ----------------------------------------------------------------------------
   550  
   551  func leveldb_writebatch_create() *leveldb_writebatch_t {
   552  	p := C.leveldb_writebatch_create()
   553  	return (*leveldb_writebatch_t)(p)
   554  }
   555  func leveldb_writebatch_destroy(p *leveldb_writebatch_t) {
   556  	C.leveldb_writebatch_destroy((*C.leveldb_writebatch_t)(p))
   557  }
   558  
   559  func leveldb_writebatch_put(p *leveldb_writebatch_t, key, val []byte) {
   560  	C.leveldb_writebatch_put(
   561  		(*C.leveldb_writebatch_t)(p),
   562  		(*C.leveldb_slice_t)(leveldb_slice_new(key)),
   563  		(*C.leveldb_slice_t)(leveldb_slice_new(val)),
   564  	)
   565  }
   566  func leveldb_writebatch_delete(p *leveldb_writebatch_t, key []byte) {
   567  	C.leveldb_writebatch_delete(
   568  		(*C.leveldb_writebatch_t)(p),
   569  		(*C.leveldb_slice_t)(leveldb_slice_new(key)),
   570  	)
   571  }
   572  func leveldb_writebatch_clear(p *leveldb_writebatch_t) {
   573  	C.leveldb_writebatch_clear((*C.leveldb_writebatch_t)(p))
   574  }
   575  
   576  func leveldb_writebatch_iterate(p *leveldb_writebatch_t, it *stateWriteBatchIterater) {
   577  	C.leveldb_writebatch_iterate_helper(
   578  		(*C.leveldb_writebatch_t)(p),
   579  		unsafe.Pointer(it),
   580  	)
   581  }
   582  
   583  //export go_leveldb_writebatch_iterater_put
   584  func go_leveldb_writebatch_iterater_put(it unsafe.Pointer, key, val *C.leveldb_slice_t) {
   585  	(*stateWriteBatchIterater)(it).Put(
   586  		leveldb_slice_data((*leveldb_slice_t)(key)),
   587  		leveldb_slice_data((*leveldb_slice_t)(val)),
   588  	)
   589  }
   590  
   591  //export go_leveldb_writebatch_iterater_delete
   592  func go_leveldb_writebatch_iterater_delete(it unsafe.Pointer, key *C.leveldb_slice_t) {
   593  	(*stateWriteBatchIterater)(it).Delete(
   594  		leveldb_slice_data((*leveldb_slice_t)(key)),
   595  	)
   596  }
   597  
   598  // ----------------------------------------------------------------------------
   599  // Comparator
   600  // ----------------------------------------------------------------------------
   601  
   602  func leveldb_comparator_create(cmp *stateComparator) *leveldb_comparator_t {
   603  	p := C.leveldb_comparator_create_helper(unsafe.Pointer(cmp))
   604  	return (*leveldb_comparator_t)(p)
   605  }
   606  func leveldb_comparator_destroy(cmp *leveldb_comparator_t) {
   607  	C.leveldb_comparator_destroy((*C.leveldb_comparator_t)(cmp))
   608  }
   609  
   610  func leveldb_comparator_compare(cmp *leveldb_comparator_t, a, b []byte) int {
   611  	v := C.leveldb_comparator_compare(
   612  		(*C.leveldb_comparator_t)(cmp),
   613  		(*C.leveldb_slice_t)(leveldb_slice_new(a)),
   614  		(*C.leveldb_slice_t)(leveldb_slice_new(b)),
   615  	)
   616  	return int(v)
   617  }
   618  func leveldb_comparator_name(cmp *leveldb_comparator_t) string {
   619  	p := C.leveldb_comparator_name(
   620  		(*C.leveldb_comparator_t)(cmp),
   621  	)
   622  	return C.GoString(p)
   623  }
   624  
   625  //export go_leveldb_comparator_compare
   626  func go_leveldb_comparator_compare(state unsafe.Pointer, a, b *C.leveldb_slice_t) C.int32_t {
   627  	cmp := (*stateComparator)(state)
   628  	v := cmp.Compare(
   629  		leveldb_slice_data((*leveldb_slice_t)(a)),
   630  		leveldb_slice_data((*leveldb_slice_t)(b)),
   631  	)
   632  	return C.int32_t(v)
   633  }
   634  
   635  //export go_leveldb_comparator_name
   636  func go_leveldb_comparator_name(state unsafe.Pointer) *C.char {
   637  	cmp := (*stateComparator)(state)
   638  	if cmp.cname == nil {
   639  		name := cmp.Name()
   640  		cmp.cname = make([]byte, len(name)+1)
   641  		copy(cmp.cname, name)
   642  	}
   643  	return (*C.char)(unsafe.Pointer(&cmp.cname[0]))
   644  }
   645  
   646  // ----------------------------------------------------------------------------
   647  // FilterPolicy
   648  // ----------------------------------------------------------------------------
   649  
   650  func leveldb_filterpolicy_create(filterPolicy *stateFilter) *leveldb_filterpolicy_t {
   651  	if p, ok := filterPolicy.Filter.(*BloomFilter); ok {
   652  		return p.filter
   653  	} else {
   654  		p := C.leveldb_filterpolicy_create_helper(unsafe.Pointer(filterPolicy))
   655  		return (*leveldb_filterpolicy_t)(p)
   656  	}
   657  }
   658  func leveldb_filterpolicy_create_bloom(bitsPerKey int) *leveldb_filterpolicy_t {
   659  	p := C.leveldb_filterpolicy_create_bloom(C.int32_t(bitsPerKey))
   660  	return (*leveldb_filterpolicy_t)(p)
   661  }
   662  func leveldb_filterpolicy_destroy(p *leveldb_filterpolicy_t) {
   663  	C.leveldb_filterpolicy_destroy((*C.leveldb_filterpolicy_t)(p))
   664  }
   665  
   666  func leveldb_filterpolicy_create_filter(
   667  	p *leveldb_filterpolicy_t,
   668  	keys [][]byte,
   669  ) *leveldb_value_t {
   670  	keys_ := make([]*leveldb_slice_t, len(keys))
   671  	for i := 0; i < len(keys); i++ {
   672  		keys_[i] = leveldb_slice_new(keys[i])
   673  	}
   674  	v := C.leveldb_filterpolicy_create_filter(
   675  		(*C.leveldb_filterpolicy_t)(p),
   676  		(**C.leveldb_slice_t)(unsafe.Pointer(&keys_[0])),
   677  		C.int32_t(len(keys)),
   678  	)
   679  	return (*leveldb_value_t)(v)
   680  }
   681  func leveldb_filterpolicy_key_may_match(p *leveldb_filterpolicy_t, a, b []byte) bool {
   682  	v := C.leveldb_filterpolicy_key_may_match(
   683  		(*C.leveldb_filterpolicy_t)(p),
   684  		(*C.leveldb_slice_t)(leveldb_slice_new(a)),
   685  		(*C.leveldb_slice_t)(leveldb_slice_new(b)),
   686  	)
   687  	return (v != 0)
   688  }
   689  func leveldb_filterpolicy_name(p *leveldb_filterpolicy_t) string {
   690  	v := C.leveldb_filterpolicy_name((*C.leveldb_filterpolicy_t)(p))
   691  	return C.GoString(v)
   692  }
   693  
   694  //export go_leveldb_filterpolicy_create_filter
   695  func go_leveldb_filterpolicy_create_filter(
   696  	state unsafe.Pointer,
   697  	keys **C.leveldb_slice_t,
   698  	num_keys C.int32_t,
   699  ) unsafe.Pointer /* (*C.leveldb_value_t) */ {
   700  	var keysArray []*C.leveldb_slice_t
   701  	hKeysArray := (*reflect.SliceHeader)((unsafe.Pointer(&keysArray)))
   702  	hKeysArray.Data = uintptr(unsafe.Pointer(keys))
   703  	hKeysArray.Cap = int(num_keys)
   704  	hKeysArray.Len = int(num_keys)
   705  
   706  	keys_ := make([][]byte, int(num_keys))
   707  	for i := 0; i < int(num_keys); i++ {
   708  		keys_[i] = leveldb_slice_data((*leveldb_slice_t)(keysArray[i]))
   709  	}
   710  	filterPolicy := (*stateFilter)(state)
   711  	data := filterPolicy.CreateFilter(keys_)
   712  	return unsafe.Pointer(leveldb_value_create(data))
   713  }
   714  
   715  //export go_leveldb_filterpolicy_key_may_match
   716  func go_leveldb_filterpolicy_key_may_match(
   717  	state unsafe.Pointer,
   718  	key *C.leveldb_slice_t,
   719  	filter *C.leveldb_slice_t,
   720  ) C.leveldb_bool_t {
   721  	filterPolicy := (*stateFilter)(state)
   722  	rv := filterPolicy.KeyMayMatch(
   723  		leveldb_slice_data((*leveldb_slice_t)(key)),
   724  		leveldb_slice_data((*leveldb_slice_t)(filter)),
   725  	)
   726  	if rv {
   727  		return 1
   728  	} else {
   729  		return 0
   730  	}
   731  }
   732  
   733  //export go_leveldb_filterpolicy_name
   734  func go_leveldb_filterpolicy_name(state unsafe.Pointer) *C.char {
   735  	filterPolicy := (*stateFilter)(state)
   736  	if filterPolicy.cname == nil {
   737  		name := filterPolicy.Name()
   738  		filterPolicy.cname = make([]byte, len(name)+1)
   739  		copy(filterPolicy.cname, name)
   740  	}
   741  	return (*C.char)(unsafe.Pointer(&filterPolicy.cname[0]))
   742  }
   743  
   744  // ----------------------------------------------------------------------------
   745  // Cache
   746  // ----------------------------------------------------------------------------
   747  
   748  func leveldb_cache_create_lru(capacity int64) *leveldb_cache_t {
   749  	p := C.leveldb_cache_create_lru(C.int64_t(capacity))
   750  	return (*leveldb_cache_t)(p)
   751  }
   752  func leveldb_cache_destroy(p *leveldb_cache_t) {
   753  	C.leveldb_cache_destroy((*C.leveldb_cache_t)(p))
   754  }
   755  
   756  func leveldb_cache_insert(cache *leveldb_cache_t, key, val []byte) {
   757  	C.leveldb_cache_insert(
   758  		(*C.leveldb_cache_t)(cache),
   759  		(*C.leveldb_slice_t)(leveldb_slice_new(key)),
   760  		(*C.leveldb_slice_t)(leveldb_slice_new(val)),
   761  	)
   762  }
   763  func leveldb_cache_lookup(cache *leveldb_cache_t, key []byte) *leveldb_value_t {
   764  	p := C.leveldb_cache_lookup(
   765  		(*C.leveldb_cache_t)(cache),
   766  		(*C.leveldb_slice_t)(leveldb_slice_new(key)),
   767  	)
   768  	return (*leveldb_value_t)(p)
   769  }
   770  func leveldb_cache_erase(cache *leveldb_cache_t, key []byte) {
   771  	C.leveldb_cache_erase(
   772  		(*C.leveldb_cache_t)(cache),
   773  		(*C.leveldb_slice_t)(leveldb_slice_new(key)),
   774  	)
   775  }
   776  
   777  // ----------------------------------------------------------------------------
   778  // END
   779  // ----------------------------------------------------------------------------