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
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 656
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 options = {
.flags = MDB_NOTLS,
.maxreaders = -1,
.maxdbs = 128,
.mapsize = 0,
.mode = 0755,
};
if (!NIL_P(option_hash))
rb_hash_foreach(option_hash, (int (*)(ANYARGS))environment_options,
(VALUE)&options);
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 (options.maxreaders > 0)
check(mdb_env_set_maxreaders(env, options.maxreaders));
if (options.mapsize > 0)
check(mdb_env_set_mapsize(env, options.mapsize));
check(mdb_env_set_maxdbs(env, options.maxdbs <= 0 ? 1 : options.maxdbs));
VALUE expanded_path = rb_file_expand_path(path, Qnil);
check(mdb_env_open(env, StringValueCStr(expanded_path), options.flags,
options.mode));
if (rb_block_given_p())
return rb_ensure(rb_yield, venv, environment_close, venv);
return venv;
}
|
Instance Method Details
#active_txn ⇒ Transaction
807 808 809 810 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 807
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
793 794 795 796 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 793
static VALUE environment_clear_flags(int argc, VALUE* argv, VALUE self) {
environment_change_flags(argc, argv, self, 0);
return Qnil;
}
|
#close ⇒ Object
475 476 477 478 479 480 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 475
static VALUE environment_close(VALUE self) {
ENVIRONMENT(self, environment);
mdb_env_close(environment->env);
environment->env = 0;
return Qnil;
}
|
#copy(path) ⇒ Object
568 569 570 571 572 573 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 568
static VALUE environment_copy(VALUE self, VALUE path) {
ENVIRONMENT(self, environment);
VALUE expanded_path = rb_file_expand_path(path, Qnil);
check(mdb_env_copy(environment->env, StringValueCStr(expanded_path)));
return Qnil;
}
|
#database(name, options) ⇒ Database
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 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 942
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.
982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 982
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
720 721 722 723 724 725 726 727 728 729 730 731 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 720
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
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 536
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
745 746 747 748 749 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 745
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
738 739 740 741 742 743 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 738
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
778 779 780 781 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 778
static VALUE environment_set_flags(int argc, VALUE* argv, VALUE self) {
environment_change_flags(argc, argv, self, 1);
return Qnil;
}
|
#stat ⇒ Hash
518 519 520 521 522 523 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 518
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
588 589 590 591 592 593 594 595 596 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 588
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
885 886 887 888 889 890 891 892 893 |
# File 'ext/lmdb_ext/lmdb_ext.c', line 885
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);
}
|