Class: Isomorfeus::Hamster::Environment
- Inherits:
-
Object
- Object
- Isomorfeus::Hamster::Environment
- Defined in:
- ext/isomorfeus_hamster_ext/isomorfeus_hamster.c
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.
-
#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
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 482
static VALUE environment_new(int argc, VALUE *argv, VALUE klass) {
VALUE path, option_hash;
rb_scan_args(argc, argv, "1:", &path, &option_hash);
EnvironmentOptions options = {
.flags = MDB_NOTLS,
.maxreaders = -1,
.maxdbs = 128,
.mapsize = 0,
.mode = 0755,
};
if (!NIL_P(option_hash))
rb_hash_foreach(option_hash, 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
624 625 626 627 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 624
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
610 611 612 613 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 610
static VALUE environment_clear_flags(int argc, VALUE* argv, VALUE self) {
environment_change_flags(argc, argv, self, 0);
return Qnil;
}
|
#close ⇒ Object
301 302 303 304 305 306 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 301
static VALUE environment_close(VALUE self) {
ENVIRONMENT(self, environment);
mdb_env_close(environment->env);
environment->env = 0;
return Qnil;
}
|
#copy(path) ⇒ Object
394 395 396 397 398 399 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 394
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
753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 753
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;
rb_scan_args(argc, argv, "02", &name, &option_hash);
int flags = 0;
if (!NIL_P(option_hash))
rb_hash_foreach(option_hash, 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;
}
|
#flags ⇒ Array
537 538 539 540 541 542 543 544 545 546 547 548 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 537
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
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 362
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
562 563 564 565 566 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 562
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
555 556 557 558 559 560 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 555
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
595 596 597 598 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 595
static VALUE environment_set_flags(int argc, VALUE* argv, VALUE self) {
environment_change_flags(argc, argv, self, 1);
return Qnil;
}
|
#stat ⇒ Hash
344 345 346 347 348 349 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 344
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
414 415 416 417 418 419 420 421 422 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 414
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
696 697 698 699 700 701 702 703 704 |
# File 'ext/isomorfeus_hamster_ext/isomorfeus_hamster.c', line 696
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);
}
|