Class: LMDB::Environment
- Inherits:
-
Object
- Object
- LMDB::Environment
- Defined in:
- ext/lmdb_ext/lmdb_ext.c,
ext/lmdb_ext/lmdb_ext.c
Overview
The Environment is the root object for all LMDB operations.
An LMDB “environment” is a collection of one or more “databases” (key-value tables), along with transactions to modify those databases and cursors to iterate through them.
An environment – and its collection of databases – is normally stored in a directory. That directory will contain two files:
-
data.mdb: all the records in all the databases in the environment -
lock.mdb: state of transactions that may be going on in the environment.
An environment can contain multiple databases. Each of the databases has a string name (“mydatabase”, “db.3.1982”). You use the database name to open the database within the environment.
Class Method Summary collapse
-
.new(path, opts) {|env| ... } ⇒ Environment
Open an LMDB database environment.
Instance Method Summary collapse
- #active_txn ⇒ Transaction
-
#clear_flags(flags) ⇒ Object
Clear one or more flags in the environment.
-
#close ⇒ Object
Close an environment, completing all IOs and cleaning up database state if needed.
-
#copy(path) ⇒ Object
Create a copy (snapshot) of an environment.
-
#database(name, options) ⇒ Database
Opens a database within the environment.
-
#databases ⇒ Array
Returns a list of the names of all databases in the environment, or an empty list if there are no named databases but only the defaut database.
-
#flags ⇒ Array
Return the flags that are set in this environment.
-
#info ⇒ Hash
Return useful information about an environment.
- #mapsize=(size) ⇒ Object
-
#path ⇒ String
Return the path to the database environment files.
-
#set_flags(flags) ⇒ Object
Set one or more flags in the environment.
-
#stat ⇒ Hash
Return useful statistics about an environment.
-
#sync(force) ⇒ Object
Flush the data buffers to disk.
-
#transaction(readonly) {|txn| ... } ⇒ Object
Begin a transaction.
Class Method Details
.new(path, opts) {|env| ... } ⇒ Environment
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 620 static VALUE environment_new(int argc, VALUE *argv, VALUE klass) { VALUE path, option_hash; #ifdef RB_SCAN_ARGS_KEYWORDS rb_scan_args_kw(RB_SCAN_ARGS_LAST_HASH_KEYWORDS, argc, argv, "1:", &path, &option_hash); #else rb_scan_args(argc, argv, "1:", &path, &option_hash); #endif EnvironmentOptions = { .flags = MDB_NOTLS, .maxreaders = -1, .maxdbs = 128, .mapsize = 0, .mode = 0755, }; if (!NIL_P(option_hash)) rb_hash_foreach(option_hash, (int (*)(ANYARGS)), (VALUE)&); MDB_env* env; check(mdb_env_create(&env)); Environment* environment; VALUE venv = Data_Make_Struct(cEnvironment, Environment, environment_mark, environment_free, environment); environment->env = env; environment->thread_txn_hash = rb_hash_new(); environment->txn_thread_hash = rb_hash_new(); if (.maxreaders > 0) check(mdb_env_set_maxreaders(env, .maxreaders)); if (.mapsize > 0) check(mdb_env_set_mapsize(env, .mapsize)); check(mdb_env_set_maxdbs(env, .maxdbs <= 0 ? 1 : .maxdbs)); VALUE = (path, Qnil); check(mdb_env_open(env, StringValueCStr(), .flags, .mode)); if (rb_block_given_p()) return rb_ensure(rb_yield, venv, environment_close, venv); return venv; } |
Instance Method Details
#active_txn ⇒ Transaction
771 772 773 774 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 771 static VALUE environment_active_txn(VALUE self) { ENVIRONMENT(self, environment); return rb_hash_aref(environment->thread_txn_hash, rb_thread_current()); } |
#clear_flags(flags) ⇒ Object
757 758 759 760 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 757 static VALUE environment_clear_flags(int argc, VALUE* argv, VALUE self) { environment_change_flags(argc, argv, self, 0); return Qnil; } |
#close ⇒ Object
439 440 441 442 443 444 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 439 static VALUE environment_close(VALUE self) { ENVIRONMENT(self, environment); mdb_env_close(environment->env); environment->env = 0; return Qnil; } |
#copy(path) ⇒ Object
532 533 534 535 536 537 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 532 static VALUE environment_copy(VALUE self, VALUE path) { ENVIRONMENT(self, environment); VALUE = (path, Qnil); check(mdb_env_copy(environment->env, StringValueCStr())); return Qnil; } |
#database(name, options) ⇒ Database
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 901 static VALUE environment_database(int argc, VALUE *argv, VALUE self) { ENVIRONMENT(self, environment); if (!active_txn(self)) return call_with_transaction(self, self, "database", argc, argv, 0); VALUE name, option_hash; #ifdef RB_SCAN_ARGS_KEYWORDS rb_scan_args_kw(RB_SCAN_ARGS_KEYWORDS, argc, argv, "01:", &name, &option_hash); #else rb_scan_args(argc, argv, "01:", &name, &option_hash); #endif int flags = 0; if (!NIL_P(option_hash)) rb_hash_foreach(option_hash, (int (*)(ANYARGS))database_flags, (VALUE)&flags); MDB_dbi dbi; check(mdb_dbi_open(need_txn(self), NIL_P(name) ? 0 : StringValueCStr(name), flags, &dbi)); Database* database; VALUE vdb = Data_Make_Struct(cDatabase, Database, database_mark, free, database); database->dbi = dbi; database->env = self; return vdb; } |
#databases ⇒ Array
Returns The names of all databases in the environment.
941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 941 static VALUE environment_databases(VALUE self) { ENVIRONMENT(self, environment); if (!active_txn(self)) return call_with_transaction(self, self, "databases", 0, 0, MDB_RDONLY); MDB_dbi dbi; MDB_cursor *cursor; MDB_txn *txn = need_txn(self); MDB_val key; check(mdb_dbi_open(txn, NULL, 0, &dbi)); check(mdb_cursor_open(txn, dbi, &cursor)); VALUE ret = rb_ary_new(); while (mdb_cursor_get(cursor, &key, NULL, MDB_NEXT_NODUP) == MDB_SUCCESS) { char *intern_db_name; MDB_dbi db; VALUE db_name; if (memchr(key.mv_data, '\0', key.mv_size)) continue; intern_db_name = malloc(key.mv_size + 1); memcpy(intern_db_name, key.mv_data, key.mv_size); intern_db_name[key.mv_size] = '\0'; if (mdb_dbi_open(txn, intern_db_name, 0, &db) == MDB_SUCCESS) { mdb_dbi_close(environment->env, db); db_name = rb_str_new(key.mv_data, key.mv_size); rb_ary_push(ret, db_name); } free(intern_db_name); } mdb_cursor_close(cursor); return ret; } |
#flags ⇒ Array
684 685 686 687 688 689 690 691 692 693 694 695 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 684 static VALUE environment_flags(VALUE self) { unsigned int flags; ENVIRONMENT(self, environment); check(mdb_env_get_flags(environment->env, &flags)); VALUE ret = rb_ary_new(); #define FLAG(const, name) if (flags & MDB_##const) rb_ary_push(ret, ID2SYM(rb_intern(#name))); #include "env_flags.h" #undef FLAG return ret; } |
#info ⇒ Hash
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 500 static VALUE environment_info(VALUE self) { MDB_envinfo info; ENVIRONMENT(self, environment); check(mdb_env_info(environment->env, &info)); VALUE ret = rb_hash_new(); #define INFO_SET(name) rb_hash_aset(ret, ID2SYM(rb_intern(#name)), SIZET2NUM((size_t)info.me_##name)); INFO_SET(mapaddr); INFO_SET(mapsize); INFO_SET(last_pgno); INFO_SET(last_txnid); INFO_SET(maxreaders); INFO_SET(numreaders); #undef INFO_SET return ret; } |
#mapsize=(size) ⇒ Object
709 710 711 712 713 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 709 static VALUE environment_set_mapsize(VALUE self, VALUE size) { ENVIRONMENT(self, environment); check(mdb_env_set_mapsize(environment->env, NUM2LONG(size))); return Qnil; } |
#path ⇒ String
702 703 704 705 706 707 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 702 static VALUE environment_path(VALUE self) { const char* path; ENVIRONMENT(self, environment); check(mdb_env_get_path(environment->env, &path)); return rb_str_new2(path); } |
#set_flags(flags) ⇒ Object
742 743 744 745 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 742 static VALUE environment_set_flags(int argc, VALUE* argv, VALUE self) { environment_change_flags(argc, argv, self, 1); return Qnil; } |
#stat ⇒ Hash
482 483 484 485 486 487 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 482 static VALUE environment_stat(VALUE self) { ENVIRONMENT(self, environment); MDB_stat stat; check(mdb_env_stat(environment->env, &stat)); return stat2hash(&stat); } |
#sync(force) ⇒ Object
552 553 554 555 556 557 558 559 560 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 552 static VALUE environment_sync(int argc, VALUE *argv, VALUE self) { ENVIRONMENT(self, environment); VALUE force; rb_scan_args(argc, argv, "01", &force); check(mdb_env_sync(environment->env, RTEST(force))); return Qnil; } |
#transaction(readonly) {|txn| ... } ⇒ Object
844 845 846 847 848 849 850 851 852 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 844 static VALUE environment_transaction(int argc, VALUE *argv, VALUE self) { rb_need_block(); VALUE readonly; rb_scan_args(argc, argv, "01", &readonly); unsigned int flags = RTEST(readonly) ? MDB_RDONLY : 0; return with_transaction(self, rb_yield, Qnil, flags); } |