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 // ----------------------------------------------------------------------------