bdb 0.2.2 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/AUTHORS +2 -0
- data/README.md +92 -0
- data/VERSION +1 -1
- data/ext/bdb.c +250 -67
- data/ext/bdb.h +1 -1
- data/ext/extconf.rb +17 -11
- metadata +33 -48
- data/README.textile +0 -95
- data/examples/replication.rb +0 -29
data/AUTHORS
ADDED
data/README.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
Description
|
2
|
+
===
|
3
|
+
|
4
|
+
Ruby bindings for Berkeley DB versions 4.2-4.8.
|
5
|
+
|
6
|
+
Installation
|
7
|
+
============
|
8
|
+
|
9
|
+
From Git
|
10
|
+
--------
|
11
|
+
|
12
|
+
You can check out the latest source from git:
|
13
|
+
|
14
|
+
git clone git://github.com/DenisKnauf/bdb.git
|
15
|
+
|
16
|
+
As a Gem
|
17
|
+
========
|
18
|
+
|
19
|
+
At the moment this library is not available on Rubyforge. To install it as a
|
20
|
+
gem, do the following:
|
21
|
+
|
22
|
+
sudo gem install dk-bdb
|
23
|
+
|
24
|
+
For Berkeley DB v4.7 installed from MacPorts do the following:
|
25
|
+
|
26
|
+
sudo env ARCHFLAGS="-arch i386" gem install dk-bdb
|
27
|
+
|
28
|
+
This assumes you're on OS X and BerkeleyDB wasn't compiled as a universal binary.
|
29
|
+
|
30
|
+
Sample Usage
|
31
|
+
============
|
32
|
+
|
33
|
+
env = Bdb::Env.new(0)
|
34
|
+
env_flags = Bdb::DB_CREATE | # Create the environment if it does not already exist.
|
35
|
+
Bdb::DB_INIT_TXN | # Initialize transactions
|
36
|
+
Bdb::DB_INIT_LOCK | # Initialize locking.
|
37
|
+
Bdb::DB_INIT_LOG | # Initialize logging
|
38
|
+
Bdb::DB_INIT_MPOOL # Initialize the in-memory cache.
|
39
|
+
env.open(File.join(File.dirname(__FILE__), 'tmp'), env_flags, 0);
|
40
|
+
|
41
|
+
db = env.db
|
42
|
+
db.open(nil, 'db1.db', nil, Bdb::Db::BTREE, Bdb::DB_CREATE | Bdb::DB_AUTO_COMMIT, 0)
|
43
|
+
|
44
|
+
txn = env.txn_begin(nil, 0)
|
45
|
+
db.put(txn, 'key', 'value', 0)
|
46
|
+
txn.commit(0)
|
47
|
+
|
48
|
+
value = db.get(nil, 'key', nil, 0)
|
49
|
+
|
50
|
+
db.close(0)
|
51
|
+
env.close
|
52
|
+
|
53
|
+
API
|
54
|
+
===
|
55
|
+
|
56
|
+
This interface is most closely based on the DB4 C api and tries to maintain close
|
57
|
+
interface proximity.
|
58
|
+
[That API is published by Oracle](http://www.oracle.com/technology/documentation/berkeley-db/db/api_reference/C/frame_main.html).
|
59
|
+
|
60
|
+
All function arguments systematically omit the leading DB handles and TXN handles.
|
61
|
+
A few calls omit the flags parameter when the documentation indicates that no
|
62
|
+
flag values are used - cursor.close is one.
|
63
|
+
|
64
|
+
Alternative API
|
65
|
+
---------------
|
66
|
+
|
67
|
+
You can use [SBDB](http://github.com/DenisKnauf/sbdb), too. It is easier to use, but base on this library.
|
68
|
+
|
69
|
+
Notes
|
70
|
+
=====
|
71
|
+
|
72
|
+
The defines generator is imperfect and includes some defines that are not
|
73
|
+
flags. While it could be improved, it is easier to delete the incorrect ones.
|
74
|
+
Thus, if you decide to rebuild the defines, you will need to edit the resulting
|
75
|
+
file. This may be necessary if using a different release of DB4 than the ones
|
76
|
+
the authors developed against. In nearly every case the defines generator works
|
77
|
+
flawlessly.
|
78
|
+
|
79
|
+
The authors have put all possible caution into ensuring that DB and Ruby cooperate.
|
80
|
+
The memory access was one aspect carefully considered. Since Ruby copies
|
81
|
+
when doing String#new, all key/data retrieval from DB is done with a 0 flag,
|
82
|
+
meaning that DB will be responsible. See [*this* news group posting](http://groups.google.com/group/comp.databases.berkeley-db/browse_frm/thread/4f70a9999b64ce6a/c06b94692e3cbc41?tvc=1&q=dbt+malloc#c06b94692e3cbc41)
|
83
|
+
about the effect of that.
|
84
|
+
|
85
|
+
The only other design consideration of consequence was associate. The prior
|
86
|
+
version used a Ruby thread local variable and kept track of the current
|
87
|
+
database in use. The authors decided to take a simpler approach since Ruby is green
|
88
|
+
threads. A global array stores the VALUE of the Proc for a given association
|
89
|
+
by the file descriptor number of the underlying database. This is looked
|
90
|
+
up when the first layer callback is made. It would have been better considered
|
91
|
+
if DB allowed the passing of a (void *) user data into the alloc that would
|
92
|
+
be supplied during callback. So far this design has not produced any problems.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.5
|
data/ext/bdb.c
CHANGED
@@ -32,6 +32,24 @@ VALUE eDbError;
|
|
32
32
|
|
33
33
|
static ID fv_call,fv_uniq,fv_err_new,fv_err_code,fv_err_msg;
|
34
34
|
|
35
|
+
#define EXCEPTIONS_CREATE \
|
36
|
+
eDbE_create(BUFFER_SMALL, BufferSmall)\
|
37
|
+
eDbE_create(LOCK_DEADLOCK, LockDeadlock)\
|
38
|
+
eDbE_create(LOCK_NOTGRANTED, LockNotgranted)\
|
39
|
+
eDbE_create(REP_HANDLE_DEAD, RepHandleDead)\
|
40
|
+
eDbE_create(REP_LEASE_EXPIRED, RepLeaseExpired)\
|
41
|
+
eDbE_create(REP_LOCKOUT, RepLockout)\
|
42
|
+
eDbE_create(SECONDARY_BAD, SecondaryBad) \
|
43
|
+
eDbE_create(FOREIGN_CONFLICT, ForeignConflict) \
|
44
|
+
eDbE_create(OLD_VERSION, OldVersion) \
|
45
|
+
eDbE_create(KEYEXIST, KeyExist) \
|
46
|
+
eDbE_create(KEYEMPTY, KeyEmpty) \
|
47
|
+
eDbE_create(RUNRECOVERY, RunRecovery) \
|
48
|
+
eDbE_create(VERSION_MISMATCH, VersionMismatch)
|
49
|
+
|
50
|
+
#define eDbE_create(n,c) VALUE eDbE_##c;
|
51
|
+
EXCEPTIONS_CREATE
|
52
|
+
|
35
53
|
/*
|
36
54
|
* Document-class: Bdb::DbError
|
37
55
|
*
|
@@ -61,8 +79,14 @@ raise_error(int code, const char *fmt, ...)
|
|
61
79
|
|
62
80
|
argv[0]=rb_str_new2(buf);
|
63
81
|
argv[1]=INT2NUM(code);
|
82
|
+
VALUE cl;
|
83
|
+
switch( code) {
|
84
|
+
#define eDbE_create(n,c) case DB_##n: cl = eDbE_##c; break;
|
85
|
+
EXCEPTIONS_CREATE
|
86
|
+
default: cl = eDbError; break;
|
87
|
+
}
|
64
88
|
|
65
|
-
exc=rb_class_new_instance(2,argv,
|
89
|
+
exc=rb_class_new_instance(2,argv,cl);
|
66
90
|
rb_exc_raise(exc);
|
67
91
|
}
|
68
92
|
|
@@ -100,7 +124,7 @@ static void db_free(t_dbh *dbh)
|
|
100
124
|
dbh->db->close(dbh->db,NOFLAGS);
|
101
125
|
if ( RTEST(ruby_debug) && dbh->filename[0] != '\0')
|
102
126
|
fprintf(stderr,"%s/%d %s %p %s\n",__FILE__,__LINE__,
|
103
|
-
"db_free database was still open!",dbh->db,dbh->filename);
|
127
|
+
"db_free database was still open!",(void*)dbh->db,dbh->filename);
|
104
128
|
dbh->db=NULL;
|
105
129
|
}
|
106
130
|
free(dbh);
|
@@ -230,7 +254,7 @@ VALUE db_open(VALUE obj, VALUE vtxn, VALUE vdisk_file,
|
|
230
254
|
u_int32_t flags=0;
|
231
255
|
DBTYPE dbtype=DB_UNKNOWN;
|
232
256
|
char *logical_db=NULL;
|
233
|
-
long len;
|
257
|
+
//long len;
|
234
258
|
int mode=0;
|
235
259
|
|
236
260
|
if ( ! NIL_P(vflags) )
|
@@ -279,6 +303,36 @@ VALUE db_open(VALUE obj, VALUE vtxn, VALUE vdisk_file,
|
|
279
303
|
return obj;
|
280
304
|
}
|
281
305
|
|
306
|
+
/**
|
307
|
+
* call-seq:
|
308
|
+
* db.set_re_len( db, re_len)
|
309
|
+
*
|
310
|
+
* Set record-length
|
311
|
+
*/
|
312
|
+
VALUE db_set_re_len(VALUE obj, VALUE re_len) {
|
313
|
+
int rv;
|
314
|
+
t_dbh *dbh;
|
315
|
+
Data_Get_Struct(obj,t_dbh,dbh);
|
316
|
+
if (!dbh->db)
|
317
|
+
raise_error(0,"db isn't created");
|
318
|
+
rv = dbh->db->set_re_len(dbh->db,NUM2UINT(re_len));
|
319
|
+
if ( rv != 0 )
|
320
|
+
raise_error(rv, "set_re_len failure: %s",db_strerror(rv));
|
321
|
+
return re_len;
|
322
|
+
}
|
323
|
+
|
324
|
+
VALUE db_get_re_len( VALUE obj) {
|
325
|
+
u_int32_t re_len;
|
326
|
+
t_dbh *dbh;
|
327
|
+
Data_Get_Struct(obj,t_dbh,dbh);
|
328
|
+
if (!dbh->db)
|
329
|
+
raise_error(0,"db isn't created");
|
330
|
+
int rv = dbh->db->get_re_len(dbh->db,&re_len);
|
331
|
+
if ( rv != 0 )
|
332
|
+
raise_error(rv, "db_get_re_len failure: %s",db_strerror(rv));
|
333
|
+
return UINT2NUM(re_len);
|
334
|
+
}
|
335
|
+
|
282
336
|
/*
|
283
337
|
* call-seq:
|
284
338
|
* db.flags=value
|
@@ -498,7 +552,7 @@ VALUE db_close(VALUE obj, VALUE vflags)
|
|
498
552
|
if ( dbh->db==NULL )
|
499
553
|
return Qnil;
|
500
554
|
|
501
|
-
if (! NIL_P(dbh->adbc) &&
|
555
|
+
if (! NIL_P(dbh->adbc) && RARRAY_LEN(dbh->adbc) > 0 ) {
|
502
556
|
rb_warning("%s/%d %s",__FILE__,__LINE__,
|
503
557
|
"cursor handles still open");
|
504
558
|
while ( (cur=rb_ary_pop(dbh->adbc)) != Qnil ) {
|
@@ -507,8 +561,8 @@ VALUE db_close(VALUE obj, VALUE vflags)
|
|
507
561
|
}
|
508
562
|
|
509
563
|
if ( RTEST(ruby_debug) )
|
510
|
-
rb_warning("%s/%d %s 0x%
|
511
|
-
(dbh->filename==NULL||*(dbh->filename)=='0') ? "unknown" : dbh->filename);
|
564
|
+
rb_warning("%s/%d %s 0x%p %s",__FILE__,__LINE__,"db_close!", (void*)dbh,
|
565
|
+
(dbh->filename==NULL||*(dbh->filename)=='0') ? (char*)"unknown" : dbh->filename);
|
512
566
|
|
513
567
|
rv = dbh->db->close(dbh->db,flags);
|
514
568
|
dbh->db=NULL;
|
@@ -516,7 +570,7 @@ VALUE db_close(VALUE obj, VALUE vflags)
|
|
516
570
|
dbh->sproc=Qnil;
|
517
571
|
if ( dbh->env ) {
|
518
572
|
if ( RTEST(ruby_debug) )
|
519
|
-
rb_warning("%s/%d %s 0x%
|
573
|
+
rb_warning("%s/%d %s 0x%p",__FILE__,__LINE__,"db_close! removing",(void*)obj);
|
520
574
|
rb_ary_delete(dbh->env->adb,obj);
|
521
575
|
dbh->env = NULL;
|
522
576
|
}
|
@@ -559,10 +613,9 @@ VALUE db_put(VALUE obj, VALUE vtxn, VALUE vkey, VALUE vdata, VALUE vflags)
|
|
559
613
|
if (!dbh->db)
|
560
614
|
raise_error(0,"db is closed");
|
561
615
|
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
key.flags = LMEMFLAG;
|
616
|
+
key.data = RSTRING_PTR(vkey);
|
617
|
+
key.size = RSTRING_LEN(vkey);
|
618
|
+
key.flags = LMEMFLAG;
|
566
619
|
|
567
620
|
StringValue(vdata);
|
568
621
|
data.data = RSTRING_PTR(vdata);
|
@@ -577,6 +630,13 @@ VALUE db_put(VALUE obj, VALUE vtxn, VALUE vkey, VALUE vdata, VALUE vflags)
|
|
577
630
|
if (rv != 0) {
|
578
631
|
raise_error(rv, "db_put fails: %s",db_strerror(rv));
|
579
632
|
}
|
633
|
+
|
634
|
+
if ( flags & DB_APPEND == DB_APPEND ) {
|
635
|
+
VALUE str = rb_str_new(key.data,key.size);
|
636
|
+
if (key.data) free(key.data);
|
637
|
+
return str;
|
638
|
+
}
|
639
|
+
|
580
640
|
return obj;
|
581
641
|
}
|
582
642
|
|
@@ -654,7 +714,7 @@ VALUE db_pget(VALUE obj, VALUE vtxn, VALUE vkey, VALUE vdata, VALUE vflags)
|
|
654
714
|
int rv;
|
655
715
|
u_int32_t flags=0;
|
656
716
|
DBT key,data,pkey;
|
657
|
-
VALUE str;
|
717
|
+
//VALUE str;
|
658
718
|
t_txnh *txn=NULL;
|
659
719
|
|
660
720
|
memset(&key,0,sizeof(DBT));
|
@@ -749,9 +809,9 @@ VALUE db_join(VALUE obj, VALUE vacurs, VALUE vflags)
|
|
749
809
|
if (!dbh->db)
|
750
810
|
raise(0, "db is closed");
|
751
811
|
|
752
|
-
curs = ALLOCA_N(DBC *,
|
753
|
-
for (i=0; i<
|
754
|
-
Data_Get_Struct(
|
812
|
+
curs = ALLOCA_N(DBC *,RARRAY_LEN(vacurs));
|
813
|
+
for (i=0; i<RARRAY_LEN(vacurs); i++) {
|
814
|
+
Data_Get_Struct(RARRAY_PTR(vacurs)[i],t_dbch,dbch);
|
755
815
|
/* cursor is closed? */
|
756
816
|
curs[i]=dbch->dbc;
|
757
817
|
}
|
@@ -767,7 +827,7 @@ VALUE db_join(VALUE obj, VALUE vacurs, VALUE vflags)
|
|
767
827
|
return jcurs;
|
768
828
|
}
|
769
829
|
|
770
|
-
#if DB_VERSION_MINOR > 3
|
830
|
+
#if DB_VERSION_MAJOR == 5 || DB_VERSION_MINOR > 3
|
771
831
|
/*
|
772
832
|
* call-seq:
|
773
833
|
* db.compact(txn,start_key,stop_key,compact_opts,flags) -> end_key
|
@@ -890,7 +950,7 @@ VALUE db_remove(VALUE obj, VALUE vdisk_file,
|
|
890
950
|
t_dbh *dbh;
|
891
951
|
int rv;
|
892
952
|
u_int32_t flags=0;
|
893
|
-
char *logical_db=NULL;
|
953
|
+
//char *logical_db=NULL;
|
894
954
|
|
895
955
|
if ( ! NIL_P(vflags) )
|
896
956
|
flags=NUM2UINT(vflags);
|
@@ -921,8 +981,8 @@ VALUE db_rename(VALUE obj, VALUE vdisk_file,
|
|
921
981
|
t_dbh *dbh;
|
922
982
|
int rv;
|
923
983
|
u_int32_t flags=0;
|
924
|
-
char *disk_file=NULL;
|
925
|
-
char *logical_db=NULL;
|
984
|
+
//char *disk_file=NULL;
|
985
|
+
//char *logical_db=NULL;
|
926
986
|
|
927
987
|
if ( ! NIL_P(vflags) )
|
928
988
|
flags=NUM2UINT(vflags);
|
@@ -978,7 +1038,7 @@ VALUE db_truncate(VALUE obj, VALUE vtxn)
|
|
978
1038
|
t_dbh *dbh;
|
979
1039
|
t_txnh *txn=NULL;
|
980
1040
|
int rv;
|
981
|
-
VALUE result;
|
1041
|
+
//VALUE result;
|
982
1042
|
u_int32_t count;
|
983
1043
|
|
984
1044
|
if ( ! NIL_P(vtxn) ) {
|
@@ -1011,7 +1071,7 @@ VALUE db_key_range(VALUE obj, VALUE vtxn, VALUE vkey, VALUE vflags)
|
|
1011
1071
|
t_dbh *dbh;
|
1012
1072
|
t_txnh *txn=NULL;
|
1013
1073
|
DBT key;
|
1014
|
-
u_int32_t flags;
|
1074
|
+
u_int32_t flags = 0;
|
1015
1075
|
int rv;
|
1016
1076
|
DB_KEY_RANGE key_range;
|
1017
1077
|
VALUE result;
|
@@ -1062,7 +1122,7 @@ VALUE db_del(VALUE obj, VALUE vtxn, VALUE vkey, VALUE vflags)
|
|
1062
1122
|
int rv;
|
1063
1123
|
u_int32_t flags;
|
1064
1124
|
DBT key;
|
1065
|
-
VALUE str;
|
1125
|
+
//VALUE str;
|
1066
1126
|
t_txnh *txn=NULL;
|
1067
1127
|
|
1068
1128
|
memset(&key,0,sizeof(DBT));
|
@@ -1117,12 +1177,13 @@ VALUE assoc_rescue(VALUE *error, VALUE e)
|
|
1117
1177
|
VALUE message = StringValue(e);
|
1118
1178
|
rb_warn(RSTRING_PTR(message));
|
1119
1179
|
*error = e;
|
1180
|
+
return Qnil;
|
1120
1181
|
}
|
1121
1182
|
|
1122
1183
|
int assoc_callback(DB *secdb, const DBT* pkey, const DBT* data, DBT* skey)
|
1123
1184
|
{
|
1124
1185
|
t_dbh *dbh;
|
1125
|
-
VALUE proc;
|
1186
|
+
//VALUE proc;
|
1126
1187
|
VALUE error = Qnil;
|
1127
1188
|
VALUE retv;
|
1128
1189
|
VALUE args[4];
|
@@ -1150,20 +1211,20 @@ int assoc_callback(DB *secdb, const DBT* pkey, const DBT* data, DBT* skey)
|
|
1150
1211
|
keys = rb_check_array_type(retv);
|
1151
1212
|
if (!NIL_P(keys)) {
|
1152
1213
|
keys = rb_funcall(keys,fv_uniq,0); /* secondary keys must be uniq */
|
1153
|
-
switch(
|
1214
|
+
switch(RARRAY_LEN(keys)) {
|
1154
1215
|
case 0:
|
1155
1216
|
return DB_DONOTINDEX;
|
1156
1217
|
case 1:
|
1157
|
-
retv=
|
1218
|
+
retv=RARRAY_PTR(keys)[0];
|
1158
1219
|
break;
|
1159
1220
|
default:
|
1160
|
-
skey->size =
|
1221
|
+
skey->size = RARRAY_LEN(keys);
|
1161
1222
|
skey->flags = LMEMFLAG | DB_DBT_MULTIPLE | DB_DBT_APPMALLOC;
|
1162
1223
|
skey->data = malloc(skey->size * sizeof(DBT));
|
1163
1224
|
memset(skey->data, 0, skey->size * sizeof(DBT));
|
1164
1225
|
|
1165
1226
|
for (i=0; i<skey->size; i++) {
|
1166
|
-
assoc_key(skey->data + i * sizeof(DBT), (VALUE)
|
1227
|
+
assoc_key(skey->data + i * sizeof(DBT), (VALUE)RARRAY_PTR(keys)[i]);
|
1167
1228
|
}
|
1168
1229
|
return 0;
|
1169
1230
|
}
|
@@ -1190,7 +1251,7 @@ VALUE db_associate(VALUE obj, VALUE vtxn, VALUE osecdb,
|
|
1190
1251
|
t_dbh *sdbh,*pdbh;
|
1191
1252
|
int rv;
|
1192
1253
|
u_int32_t flags,flagsp,flagss;
|
1193
|
-
int fdp;
|
1254
|
+
//int fdp;
|
1194
1255
|
t_txnh *txn=NOTXN;
|
1195
1256
|
|
1196
1257
|
flags=NUM2UINT(vflags);
|
@@ -1246,7 +1307,7 @@ bt_compare_callback2(VALUE *args)
|
|
1246
1307
|
int bt_compare_callback(DB *db, const DBT* key1, const DBT* key2)
|
1247
1308
|
{
|
1248
1309
|
t_dbh *dbh;
|
1249
|
-
VALUE proc;
|
1310
|
+
//VALUE proc;
|
1250
1311
|
int cmp;
|
1251
1312
|
VALUE retv;
|
1252
1313
|
|
@@ -1313,7 +1374,7 @@ VALUE db_cursor(VALUE obj, VALUE vtxn, VALUE vflags)
|
|
1313
1374
|
t_dbh *dbh;
|
1314
1375
|
int rv;
|
1315
1376
|
u_int32_t flags;
|
1316
|
-
DBC *dbc;
|
1377
|
+
//DBC *dbc;
|
1317
1378
|
t_txnh *txn=NOTXN;
|
1318
1379
|
VALUE c_obj;
|
1319
1380
|
t_dbch *dbch;
|
@@ -1671,18 +1732,18 @@ VALUE env_close(VALUE obj)
|
|
1671
1732
|
if ( eh->env==NULL )
|
1672
1733
|
return Qnil;
|
1673
1734
|
|
1674
|
-
if (
|
1675
|
-
rb_warning("%s/%d %s %
|
1676
|
-
"database handles still open",
|
1677
|
-
while (
|
1735
|
+
if (RARRAY_LEN(eh->adb) > 0) {
|
1736
|
+
rb_warning("%s/%d %s %li",__FILE__,__LINE__,
|
1737
|
+
"database handles still open",RARRAY_LEN(eh->adb));
|
1738
|
+
while (RARRAY_LEN(eh->adb) > 0)
|
1678
1739
|
if ((db=rb_ary_pop(eh->adb)) != Qnil ) {
|
1679
|
-
rb_warning("%s/%d %s 0x%
|
1680
|
-
"closing",db);
|
1740
|
+
rb_warning("%s/%d %s 0x%p",__FILE__,__LINE__,
|
1741
|
+
"closing",(void*)db);
|
1681
1742
|
/* this could raise! needs rb_protect */
|
1682
1743
|
db_close(db,INT2FIX(0));
|
1683
1744
|
}
|
1684
1745
|
}
|
1685
|
-
if (
|
1746
|
+
if (RARRAY_LEN(eh->atxn) > 0) {
|
1686
1747
|
rb_warning("%s/%d %s",__FILE__,__LINE__,
|
1687
1748
|
"database transactions still open");
|
1688
1749
|
while ( (db=rb_ary_pop(eh->atxn)) != Qnil ) {
|
@@ -1692,7 +1753,7 @@ VALUE env_close(VALUE obj)
|
|
1692
1753
|
}
|
1693
1754
|
|
1694
1755
|
if ( RTEST(ruby_debug) )
|
1695
|
-
rb_warning("%s/%d %s 0x%
|
1756
|
+
rb_warning("%s/%d %s 0x%p",__FILE__,__LINE__,"env_close!",(void*)eh);
|
1696
1757
|
|
1697
1758
|
rv = eh->env->close(eh->env,NOFLAGS);
|
1698
1759
|
eh->env=NULL;
|
@@ -1773,7 +1834,7 @@ VALUE env_set_cachesize(VALUE obj, VALUE size)
|
|
1773
1834
|
VALUE env_get_cachesize(VALUE obj)
|
1774
1835
|
{
|
1775
1836
|
t_envh *eh;
|
1776
|
-
unsigned long long ln;
|
1837
|
+
//unsigned long long ln;
|
1777
1838
|
u_int32_t bytes=0,gbytes=0;
|
1778
1839
|
int ncache;
|
1779
1840
|
int rv;
|
@@ -2044,7 +2105,7 @@ VALUE db_stat(VALUE obj, VALUE vtxn, VALUE vflags)
|
|
2044
2105
|
rv=dbh->db->get_type(dbh->db,&dbtype);
|
2045
2106
|
if (rv)
|
2046
2107
|
raise_error(rv,"db_stat %s",db_strerror(rv));
|
2047
|
-
#if DB_VERSION_MINOR > 2
|
2108
|
+
#if DB_VERSION_MAJOR == 5 || DB_VERSION_MINOR > 2
|
2048
2109
|
rv=dbh->db->stat(dbh->db,txn?txn->txn:NULL,&(su.stat),flags);
|
2049
2110
|
#else
|
2050
2111
|
rv=dbh->db->stat(dbh->db,&(su.stat),flags);
|
@@ -2090,7 +2151,7 @@ VALUE db_stat(VALUE obj, VALUE vtxn, VALUE vflags)
|
|
2090
2151
|
bs_int(bt_nkeys); /* Number of unique keys. */
|
2091
2152
|
bs_int(bt_ndata); /* Number of data items. */
|
2092
2153
|
bs_int(bt_pagesize); /* Page size. */
|
2093
|
-
#if DB_VERSION_MINOR < 4
|
2154
|
+
#if DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR < 4
|
2094
2155
|
bs_int(bt_maxkey); /* Maxkey value. */
|
2095
2156
|
#endif
|
2096
2157
|
bs_int(bt_minkey); /* Minkey value. */
|
@@ -2101,7 +2162,7 @@ VALUE db_stat(VALUE obj, VALUE vtxn, VALUE vflags)
|
|
2101
2162
|
bs_int(bt_leaf_pg); /* Leaf pages. */
|
2102
2163
|
bs_int(bt_dup_pg); /* Duplicate pages. */
|
2103
2164
|
bs_int(bt_over_pg); /* Overflow pages. */
|
2104
|
-
#if DB_VERSION_MINOR > 2
|
2165
|
+
#if DB_VERSION_MAJOR == 5 || DB_VERSION_MINOR > 2
|
2105
2166
|
bs_int(bt_empty_pg); /* Empty pages. */
|
2106
2167
|
#endif
|
2107
2168
|
bs_int(bt_free); /* Pages on the free list. */
|
@@ -2131,6 +2192,8 @@ VALUE db_stat(VALUE obj, VALUE vtxn, VALUE vflags)
|
|
2131
2192
|
qs_int(qs_cur_recno); /* Next available record number. */
|
2132
2193
|
|
2133
2194
|
break;
|
2195
|
+
case DB_UNKNOWN:
|
2196
|
+
break;
|
2134
2197
|
}
|
2135
2198
|
|
2136
2199
|
free(su.stat);
|
@@ -2145,7 +2208,7 @@ VALUE db_stat(VALUE obj, VALUE vtxn, VALUE vflags)
|
|
2145
2208
|
*/
|
2146
2209
|
VALUE stat_aref(VALUE obj, VALUE vname)
|
2147
2210
|
{
|
2148
|
-
rb_iv_get(obj,RSTRING_PTR(rb_str_concat(rb_str_new2("@"),vname)));
|
2211
|
+
return rb_iv_get(obj,RSTRING_PTR(rb_str_concat(rb_str_new2("@"),vname)));
|
2149
2212
|
}
|
2150
2213
|
|
2151
2214
|
/*
|
@@ -2418,6 +2481,46 @@ VALUE env_get_shm_key(VALUE obj)
|
|
2418
2481
|
return INT2FIX(key);
|
2419
2482
|
}
|
2420
2483
|
|
2484
|
+
VALUE env_log_set_config_h(VALUE obj, u_int32_t flags, VALUE onoff) {
|
2485
|
+
t_envh *eh;
|
2486
|
+
int rv;
|
2487
|
+
Data_Get_Struct(obj,t_envh, eh);
|
2488
|
+
rv=eh->env->log_set_config(eh->env, flags, Qnil != flags && Qfalse != onoff);
|
2489
|
+
if(rv != 0)
|
2490
|
+
raise_error(rv, "log_set_config: %s", db_strerror(rv));
|
2491
|
+
return flags;
|
2492
|
+
}
|
2493
|
+
|
2494
|
+
VALUE env_log_get_config_h( VALUE obj, u_int32_t flags) {
|
2495
|
+
t_envh *eh;
|
2496
|
+
int rv, onoff;
|
2497
|
+
Data_Get_Struct(obj,t_envh, eh);
|
2498
|
+
rv=eh->env->log_get_config(eh->env, flags, &onoff);
|
2499
|
+
if(rv != 0)
|
2500
|
+
raise_error(rv, "log_set_config: %s", db_strerror(rv));
|
2501
|
+
return onoff ? Qtrue : Qfalse;
|
2502
|
+
}
|
2503
|
+
|
2504
|
+
#define ENV_LOG_CONFIG_FUNCS \
|
2505
|
+
ENV_LOG_CONFIG_FUNC(direct,DIRECT) \
|
2506
|
+
ENV_LOG_CONFIG_FUNC(dsync,DSYNC) \
|
2507
|
+
ENV_LOG_CONFIG_FUNC(auto_remove,AUTO_REMOVE) \
|
2508
|
+
ENV_LOG_CONFIG_FUNC(in_memory,IN_MEMORY) \
|
2509
|
+
ENV_LOG_CONFIG_FUNC(zero,ZERO)
|
2510
|
+
|
2511
|
+
#define ENV_LOG_CONFIG_FUNC( name, cnst) \
|
2512
|
+
VALUE env_log_set_##cnst( VALUE obj, VALUE flags) { \
|
2513
|
+
return env_log_set_config_h( obj, DB_LOG_##cnst, flags); \
|
2514
|
+
} \
|
2515
|
+
VALUE env_log_get_##cnst( VALUE obj, VALUE flags) { \
|
2516
|
+
return env_log_get_config_h( obj, DB_LOG_##cnst); \
|
2517
|
+
}
|
2518
|
+
ENV_LOG_CONFIG_FUNCS
|
2519
|
+
|
2520
|
+
VALUE env_log_set_config( VALUE obj, VALUE flags, VALUE onoff) {
|
2521
|
+
return env_log_set_config_h( obj, NUM2UINT(flags), onoff);
|
2522
|
+
}
|
2523
|
+
|
2421
2524
|
/*
|
2422
2525
|
* call-seq:
|
2423
2526
|
* env.set_lk_detect(detect) -> detect
|
@@ -2565,8 +2668,8 @@ VALUE env_get_lk_max_objects(VALUE obj)
|
|
2565
2668
|
VALUE env_report_stderr(VALUE obj)
|
2566
2669
|
{
|
2567
2670
|
t_envh *eh;
|
2568
|
-
u_int32_t max;
|
2569
|
-
int rv;
|
2671
|
+
//u_int32_t max;
|
2672
|
+
//int rv;
|
2570
2673
|
|
2571
2674
|
Data_Get_Struct(obj,t_envh,eh);
|
2572
2675
|
if (!eh->env)
|
@@ -2949,11 +3052,74 @@ VALUE env_repmgr_stat_print(VALUE obj, VALUE flags)
|
|
2949
3052
|
return Qtrue;
|
2950
3053
|
}
|
2951
3054
|
|
3055
|
+
VALUE env_set_lg_bsize( VALUE obj, VALUE size) {
|
3056
|
+
t_envh *eh;
|
3057
|
+
int rv;
|
3058
|
+
Data_Get_Struct(obj, t_envh, eh);
|
3059
|
+
rv = eh->env->set_lg_bsize( eh->env, NUM2UINT( size));
|
3060
|
+
if ( rv != 0 )
|
3061
|
+
raise_error(rv, "env_set_lg_bsize: %s", db_strerror(rv));
|
3062
|
+
return size;
|
3063
|
+
}
|
3064
|
+
|
3065
|
+
VALUE env_get_lg_bsize( VALUE obj) {
|
3066
|
+
t_envh *eh;
|
3067
|
+
int rv;
|
3068
|
+
u_int32_t size;
|
3069
|
+
Data_Get_Struct( obj, t_envh, eh);
|
3070
|
+
rv = eh->env->get_lg_bsize( eh->env, &size);
|
3071
|
+
if ( rv != 0 )
|
3072
|
+
raise_error(rv, "env_get_lg_bsize: %s", db_strerror(rv));
|
3073
|
+
return UINT2FIX(size);
|
3074
|
+
}
|
3075
|
+
|
3076
|
+
VALUE env_set_lg_max( VALUE obj, VALUE size) {
|
3077
|
+
t_envh *eh;
|
3078
|
+
int rv;
|
3079
|
+
Data_Get_Struct(obj, t_envh, eh);
|
3080
|
+
rv = eh->env->set_lg_max( eh->env, NUM2UINT( size));
|
3081
|
+
if ( rv != 0 )
|
3082
|
+
raise_error(rv, "env_set_lg_max: %s", db_strerror(rv));
|
3083
|
+
return size;
|
3084
|
+
}
|
3085
|
+
|
3086
|
+
VALUE env_get_lg_max( VALUE obj) {
|
3087
|
+
t_envh *eh;
|
3088
|
+
int rv;
|
3089
|
+
u_int32_t size;
|
3090
|
+
Data_Get_Struct( obj, t_envh, eh);
|
3091
|
+
rv = eh->env->get_lg_max( eh->env, &size);
|
3092
|
+
if ( rv != 0 )
|
3093
|
+
raise_error(rv, "env_get_lg_max: %s", db_strerror(rv));
|
3094
|
+
return UINT2FIX(size);
|
3095
|
+
}
|
3096
|
+
|
3097
|
+
VALUE env_set_lg_regionmax( VALUE obj, VALUE size) {
|
3098
|
+
t_envh *eh;
|
3099
|
+
int rv;
|
3100
|
+
Data_Get_Struct(obj, t_envh, eh);
|
3101
|
+
rv = eh->env->set_lg_regionmax( eh->env, NUM2UINT( size));
|
3102
|
+
if ( rv != 0 )
|
3103
|
+
raise_error(rv, "env_set_lg_regionmax: %s", db_strerror(rv));
|
3104
|
+
return size;
|
3105
|
+
}
|
3106
|
+
|
3107
|
+
VALUE env_get_lg_regionmax( VALUE obj) {
|
3108
|
+
t_envh *eh;
|
3109
|
+
int rv;
|
3110
|
+
u_int32_t size;
|
3111
|
+
Data_Get_Struct( obj, t_envh, eh);
|
3112
|
+
rv = eh->env->get_lg_regionmax( eh->env, &size);
|
3113
|
+
if ( rv != 0 )
|
3114
|
+
raise_error(rv, "env_get_lg_regionmax: %s", db_strerror(rv));
|
3115
|
+
return UINT2FIX(size);
|
3116
|
+
}
|
3117
|
+
|
2952
3118
|
|
2953
3119
|
static void txn_finish(t_txnh *txn)
|
2954
3120
|
{
|
2955
3121
|
if ( RTEST(ruby_debug) )
|
2956
|
-
rb_warning("%s/%d %s 0x%
|
3122
|
+
rb_warning("%s/%d %s 0x%p",__FILE__,__LINE__,"txn_finish",(void*)txn);
|
2957
3123
|
|
2958
3124
|
txn->txn=NULL;
|
2959
3125
|
if (txn->env) {
|
@@ -3116,6 +3282,9 @@ void Init_bdb() {
|
|
3116
3282
|
|
3117
3283
|
cDb = rb_define_class_under(mBdb,"Db", rb_cObject);
|
3118
3284
|
eDbError = rb_define_class_under(mBdb,"DbError",rb_eStandardError);
|
3285
|
+
#define eDbE_create(n,c) eDbE_##c = rb_define_class_under(mBdb, #c, eDbError);
|
3286
|
+
EXCEPTIONS_CREATE
|
3287
|
+
|
3119
3288
|
rb_define_method(eDbError,"initialize",err_initialize,2);
|
3120
3289
|
rb_define_method(eDbError,"code",err_code,0);
|
3121
3290
|
|
@@ -3135,6 +3304,8 @@ void Init_bdb() {
|
|
3135
3304
|
rb_define_method(cDb,"cursor",db_cursor,2);
|
3136
3305
|
rb_define_method(cDb,"associate",db_associate,4);
|
3137
3306
|
rb_define_method(cDb,"btree_compare=",db_btree_compare_set,1);
|
3307
|
+
rb_define_method(cDb,"re_len=",db_set_re_len,1);
|
3308
|
+
rb_define_method(cDb,"re_len",db_get_re_len,0);
|
3138
3309
|
rb_define_method(cDb,"flags=",db_flags_set,1);
|
3139
3310
|
rb_define_method(cDb,"flags",db_flags_get,0);
|
3140
3311
|
rb_define_method(cDb,"open",db_open,6);
|
@@ -3160,7 +3331,7 @@ void Init_bdb() {
|
|
3160
3331
|
rb_define_method(cDb,"sync",db_sync,0);
|
3161
3332
|
rb_define_method(cDb,"truncate",db_truncate,1);
|
3162
3333
|
|
3163
|
-
#if DB_VERSION_MINOR > 3
|
3334
|
+
#if DB_VERSION_MAJOR == 5 || DB_VERSION_MINOR > 3
|
3164
3335
|
rb_define_method(cDb,"compact",db_compact,5);
|
3165
3336
|
#endif
|
3166
3337
|
|
@@ -3186,29 +3357,34 @@ void Init_bdb() {
|
|
3186
3357
|
rb_define_method(cEnv,"txn_begin",env_txn_begin,2);
|
3187
3358
|
rb_define_method(cEnv,"txn_checkpoint",env_txn_checkpoint,3);
|
3188
3359
|
rb_define_method(cEnv,"txn_stat",env_txn_stat,1);
|
3189
|
-
|
3190
|
-
|
3191
|
-
rb_define_method(cEnv,"set_tx_max",env_set_tx_max,1);
|
3360
|
+
rb_define_method(cEnv,"timeout",env_set_timeout,2);
|
3361
|
+
rb_define_method(cEnv,"timeout",env_get_timeout,1);
|
3192
3362
|
rb_define_method(cEnv,"mutex_get_max",env_mutex_get_max,0);
|
3193
3363
|
rb_define_method(cEnv,"mutex_set_max",env_mutex_set_max,1);
|
3194
|
-
rb_define_method(cEnv,"
|
3364
|
+
rb_define_method(cEnv,"tx_max=",env_set_tx_max,1);
|
3365
|
+
rb_define_method(cEnv,"tx_max",env_get_tx_max,0);
|
3195
3366
|
rb_define_method(cEnv,"report_stderr",env_report_stderr,0);
|
3196
|
-
rb_define_method(cEnv,"
|
3197
|
-
rb_define_method(cEnv,"
|
3198
|
-
rb_define_method(cEnv,"
|
3199
|
-
rb_define_method(cEnv,"
|
3200
|
-
rb_define_method(cEnv,"
|
3201
|
-
rb_define_method(cEnv,"
|
3202
|
-
rb_define_method(cEnv,"
|
3203
|
-
rb_define_method(cEnv,"
|
3204
|
-
|
3205
|
-
|
3206
|
-
|
3207
|
-
|
3208
|
-
|
3209
|
-
|
3210
|
-
rb_define_method(cEnv,"
|
3211
|
-
rb_define_method(cEnv,"
|
3367
|
+
rb_define_method(cEnv,"lk_detect=",env_set_lk_detect,1);
|
3368
|
+
rb_define_method(cEnv,"lk_detect",env_get_lk_detect,0);
|
3369
|
+
rb_define_method(cEnv,"lk_max_locks=",env_set_lk_max_locks,1);
|
3370
|
+
rb_define_method(cEnv,"lk_max_locks",env_get_lk_max_locks,0);
|
3371
|
+
rb_define_method(cEnv,"lk_max_objects=",env_set_lk_max_objects,1);
|
3372
|
+
rb_define_method(cEnv,"lk_max_objects",env_get_lk_max_objects,0);
|
3373
|
+
rb_define_method(cEnv,"shm_key=",env_set_shm_key,1);
|
3374
|
+
rb_define_method(cEnv,"shm_key",env_get_shm_key,0);
|
3375
|
+
rb_define_method(cEnv,"log_config",env_log_set_config,2);
|
3376
|
+
#define ENV_LOG_CONFIG_FUNC(name,cnst) \
|
3377
|
+
rb_define_method(cEnv,"log_"#name "=",env_log_set_##cnst,1); \
|
3378
|
+
rb_define_method(cEnv,"log_"#name,env_log_get_##cnst,0);
|
3379
|
+
ENV_LOG_CONFIG_FUNCS
|
3380
|
+
|
3381
|
+
rb_define_method(cEnv,"data_dir=",env_set_data_dir,1);
|
3382
|
+
rb_define_method(cEnv,"data_dirs",env_get_data_dirs,0);
|
3383
|
+
rb_define_method(cEnv,"lg_dir=",env_set_lg_dir,1);
|
3384
|
+
rb_define_method(cEnv,"lg_dir",env_get_lg_dir,0);
|
3385
|
+
rb_define_method(cEnv,"tmp_dir=",env_set_tmp_dir,1);
|
3386
|
+
rb_define_method(cEnv,"tmp_dir",env_get_tmp_dir,0);
|
3387
|
+
rb_define_method(cEnv,"home",env_get_home,0);
|
3212
3388
|
rb_define_method(cEnv,"set_verbose",env_set_verbose,2);
|
3213
3389
|
|
3214
3390
|
rb_define_method(cEnv,"rep_priority=", env_rep_set_priority, 1);
|
@@ -3222,6 +3398,13 @@ void Init_bdb() {
|
|
3222
3398
|
rb_define_method(cEnv,"repmgr_start", env_repmgr_start, 2);
|
3223
3399
|
rb_define_method(cEnv,"repmgr_stat_print", env_repmgr_stat_print, 1);
|
3224
3400
|
|
3401
|
+
rb_define_method(cEnv,"lg_bsize=", env_set_lg_bsize, 1);
|
3402
|
+
rb_define_method(cEnv,"lg_bsize", env_get_lg_bsize, 0);
|
3403
|
+
rb_define_method(cEnv,"lg_max=", env_set_lg_max, 1);
|
3404
|
+
rb_define_method(cEnv,"lg_max", env_get_lg_max, 0);
|
3405
|
+
rb_define_method(cEnv,"lg_regionmax=", env_set_lg_regionmax, 1);
|
3406
|
+
rb_define_method(cEnv,"lg_regionmax", env_get_lg_regionmax, 0);
|
3407
|
+
|
3225
3408
|
cTxnStat = rb_define_class_under(mBdb,"TxnStat",rb_cObject);
|
3226
3409
|
rb_define_method(cTxnStat,"[]",stat_aref,1);
|
3227
3410
|
|
data/ext/bdb.h
CHANGED
data/ext/extconf.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'mkmf'
|
3
|
-
default_dir = '/usr/local/BerkeleyDB.4.8'
|
4
|
-
inc, lib = dir_config('db', "#{default_dir}/include", "#{default_dir}/lib")
|
5
3
|
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
# This list is checked in reverse order, so this order allows mkmf on my Mac
|
5
|
+
# to find BDB installed via Homebrew (/usr/local) before system installs
|
6
|
+
%w[/usr / /usr/local /usr/local/db* /usr/local/BerkeleyDB*].each do |pdir|
|
7
|
+
Dir[pdir].each do |dir|
|
8
|
+
dir_config('db', "#{dir}/include", "#{dir}/lib")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
%w(db-5.1 db-5.0 db-4.9 db-4.8 db-4.7 db-4.6 db-4.5 db-4.4 db-4.3 db-4.2).each do |ver|
|
13
|
+
have_library ver, 'db_version', 'db.h'
|
9
14
|
end
|
10
15
|
|
11
16
|
def create_header
|
@@ -15,11 +20,12 @@ def create_header
|
|
15
20
|
end
|
16
21
|
|
17
22
|
message("Writing bdb_aux._c (defines), this takes a while\n")
|
23
|
+
|
18
24
|
db_header = $CPPFLAGS.split.select { |f| f =~ /^-I/ }.map { |e|
|
19
25
|
f = File.join(e[2..-1], 'db.h')
|
20
26
|
File.exists?(f) ? f : nil
|
21
27
|
}.select { |e| e }.first
|
22
|
-
|
28
|
+
|
23
29
|
n=0
|
24
30
|
defines=[]
|
25
31
|
File.open(db_header) {|fd|
|
@@ -50,10 +56,10 @@ def create_header
|
|
50
56
|
}
|
51
57
|
end
|
52
58
|
|
53
|
-
if lib_ok
|
59
|
+
#if lib_ok
|
54
60
|
create_header
|
55
61
|
create_makefile('bdb')
|
56
|
-
else
|
57
|
-
$stderr.puts("cannot create Makefile")
|
58
|
-
exit 1
|
59
|
-
end
|
62
|
+
#else
|
63
|
+
# $stderr.puts("cannot create Makefile")
|
64
|
+
# exit 1
|
65
|
+
#end
|
metadata
CHANGED
@@ -1,32 +1,33 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: bdb
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.5
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Justin Balthrop
|
9
|
+
- Denis Knauf
|
8
10
|
autorequire:
|
9
11
|
bindir: bin
|
10
12
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2009-12-17 00:00:00 -08:00
|
13
|
-
default_executable:
|
13
|
+
date: 2011-08-24 00:00:00.000000000Z
|
14
14
|
dependencies: []
|
15
|
-
|
16
15
|
description: Advanced Ruby Berkeley DB library.
|
17
|
-
email:
|
16
|
+
email:
|
17
|
+
- code@justinbalthrop.com
|
18
|
+
- Denis.Knauf@gmail.com
|
18
19
|
executables: []
|
19
|
-
|
20
|
-
extensions:
|
20
|
+
extensions:
|
21
21
|
- ext/extconf.rb
|
22
|
-
extra_rdoc_files:
|
22
|
+
extra_rdoc_files:
|
23
23
|
- LICENSE
|
24
|
-
- README.
|
25
|
-
files:
|
24
|
+
- README.md
|
25
|
+
files:
|
26
|
+
- AUTHORS
|
27
|
+
- README.md
|
26
28
|
- VERSION
|
27
29
|
- ext/bdb.c
|
28
30
|
- ext/bdb.h
|
29
|
-
- ext/extconf.rb
|
30
31
|
- lib/bdb/base.rb
|
31
32
|
- lib/bdb/database.rb
|
32
33
|
- lib/bdb/environment.rb
|
@@ -45,46 +46,30 @@ files:
|
|
45
46
|
- test/test_helper.rb
|
46
47
|
- test/txn_test.rb
|
47
48
|
- LICENSE
|
48
|
-
-
|
49
|
-
has_rdoc: true
|
49
|
+
- ext/extconf.rb
|
50
50
|
homepage: http://github.com/ninjudd/bdb
|
51
51
|
licenses: []
|
52
|
-
|
53
52
|
post_install_message:
|
54
|
-
rdoc_options:
|
55
|
-
|
56
|
-
require_paths:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
57
55
|
- ext
|
58
56
|
- lib
|
59
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
71
69
|
requirements: []
|
72
|
-
|
73
70
|
rubyforge_project:
|
74
|
-
rubygems_version: 1.
|
71
|
+
rubygems_version: 1.8.9
|
75
72
|
signing_key:
|
76
73
|
specification_version: 3
|
77
74
|
summary: Ruby Berkeley DB
|
78
|
-
test_files:
|
79
|
-
- test/benchmark.rb
|
80
|
-
- test/cursor_test.rb
|
81
|
-
- test/database_test.rb
|
82
|
-
- test/database_test_helper.rb
|
83
|
-
- test/db_test.rb
|
84
|
-
- test/deadlock_test.rb
|
85
|
-
- test/env_test.rb
|
86
|
-
- test/replication_test.rb
|
87
|
-
- test/stat_test.rb
|
88
|
-
- test/test_helper.rb
|
89
|
-
- test/txn_test.rb
|
90
|
-
- examples/replication.rb
|
75
|
+
test_files: []
|
data/README.textile
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
h1. Bdb
|
2
|
-
|
3
|
-
Ruby bindings for Berkeley DB versions 4.2-4.7.
|
4
|
-
|
5
|
-
h2. Download
|
6
|
-
|
7
|
-
Currently this library is available via git at:
|
8
|
-
|
9
|
-
<pre>
|
10
|
-
git://github.com/ninjudd/bdb.git
|
11
|
-
</pre>
|
12
|
-
|
13
|
-
h2. Installation
|
14
|
-
|
15
|
-
h3. From Git
|
16
|
-
|
17
|
-
You can check out the latest source from git:
|
18
|
-
|
19
|
-
<pre>
|
20
|
-
git clone git://github.com/ninjudd/bdb.git
|
21
|
-
</pre>
|
22
|
-
|
23
|
-
h3. As a Gem
|
24
|
-
|
25
|
-
At the moment this library is not available on Rubyforge. To install it as a
|
26
|
-
gem, do the following (for custom compiled version 4.8):
|
27
|
-
|
28
|
-
<pre>
|
29
|
-
sudo env ARCHFLAGS="-arch i386" gem install bdb --source http://gemcutter.org -- --with-db-dir=/usr/local/BerkeleyDB.4.8
|
30
|
-
</pre>
|
31
|
-
|
32
|
-
For Berkeley DB v4.7 installed from MacPorts do the following:
|
33
|
-
|
34
|
-
<pre>
|
35
|
-
sudo env ARCHFLAGS="-arch i386" gem install bdb --source http://gemcutter.org -- --with-db-include=/opt/local/include/db47 --with-db-lib=/opt/local/lib/db47
|
36
|
-
</pre>
|
37
|
-
|
38
|
-
This assumes you're on OS X and BerkeleyDB wasn't compiled as a universal binary.
|
39
|
-
|
40
|
-
h2. Sample Usage
|
41
|
-
|
42
|
-
<pre>
|
43
|
-
env = Bdb::Env.new(0)
|
44
|
-
env_flags = Bdb::DB_CREATE | # Create the environment if it does not already exist.
|
45
|
-
Bdb::DB_INIT_TXN | # Initialize transactions
|
46
|
-
Bdb::DB_INIT_LOCK | # Initialize locking.
|
47
|
-
Bdb::DB_INIT_LOG | # Initialize logging
|
48
|
-
Bdb::DB_INIT_MPOOL # Initialize the in-memory cache.
|
49
|
-
env.open(File.join(File.dirname(__FILE__), 'tmp'), env_flags, 0);
|
50
|
-
|
51
|
-
db = env.db
|
52
|
-
db.open(nil, 'db1.db', nil, Bdb::Db::BTREE, Bdb::DB_CREATE | Bdb::DB_AUTO_COMMIT, 0)
|
53
|
-
|
54
|
-
txn = env.txn_begin(nil, 0)
|
55
|
-
db.put(txn, 'key', 'value', 0)
|
56
|
-
txn.commit(0)
|
57
|
-
|
58
|
-
value = db.get(nil, 'key', nil, 0)
|
59
|
-
|
60
|
-
db.close(0)
|
61
|
-
env.close
|
62
|
-
</pre>
|
63
|
-
|
64
|
-
h2. API
|
65
|
-
|
66
|
-
This interface is most closely based on the DB4 C api and tries to maintain close
|
67
|
-
interface proximity. That API is published by Oracle at "http://www.oracle.com/technology/documentation/berkeley-db/db/api_reference/C/frame_main.html":http://www.oracle.com/technology/documentation/berkeley-db/db/api_reference/C/frame_main.html.
|
68
|
-
|
69
|
-
All function arguments systematically omit the leading DB handles and TXN handles.
|
70
|
-
A few calls omit the flags parameter when the documentation indicates that no
|
71
|
-
flag values are used - cursor.close is one.
|
72
|
-
|
73
|
-
h2. Notes
|
74
|
-
|
75
|
-
The defines generator is imperfect and includes some defines that are not
|
76
|
-
flags. While it could be improved, it is easier to delete the incorrect ones.
|
77
|
-
Thus, if you decide to rebuild the defines, you will need to edit the resulting
|
78
|
-
file. This may be necessary if using a different release of DB4 than the ones
|
79
|
-
the authors developed against. In nearly every case the defines generator works
|
80
|
-
flawlessly.
|
81
|
-
|
82
|
-
The authors have put all possible caution into ensuring that DB and Ruby cooperate.
|
83
|
-
The memory access was one aspect carefully considered. Since Ruby copies
|
84
|
-
when doing String#new, all key/data retrieval from DB is done with a 0 flag,
|
85
|
-
meaning that DB will be responsible. See "this":http://groups.google.com/group/comp.databases.berkeley-db/browse_frm/thread/4f70a9999b64ce6a/c06b94692e3cbc41?tvc=1&q=dbt+malloc#c06b94692e3cbc41
|
86
|
-
news group posting about the effect of that.
|
87
|
-
|
88
|
-
The only other design consideration of consequence was associate. The prior
|
89
|
-
version used a Ruby thread local variable and kept track of the current
|
90
|
-
database in use. The authors decided to take a simpler approach since Ruby is green
|
91
|
-
threads. A global array stores the VALUE of the Proc for a given association
|
92
|
-
by the file descriptor number of the underlying database. This is looked
|
93
|
-
up when the first layer callback is made. It would have been better considered
|
94
|
-
if DB allowed the passing of a (void *) user data into the alloc that would
|
95
|
-
be supplied during callback. So far this design has not produced any problems.
|
data/examples/replication.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bdb/database'
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
|
-
role = ARGV.shift || 'client'
|
6
|
-
|
7
|
-
MASTER = 'localhost:8888'
|
8
|
-
CLIENT = 'localhost:9999'
|
9
|
-
|
10
|
-
DIR = "/tmp/#{role}"
|
11
|
-
FileUtils.rmtree DIR
|
12
|
-
FileUtils.mkdir DIR
|
13
|
-
|
14
|
-
puts "Starting #{role}..."
|
15
|
-
|
16
|
-
Bdb::Environment.replicate DIR, :from => MASTER, :to => CLIENT, :host => role == 'master' ? MASTER : CLIENT
|
17
|
-
db = Bdb::Database.new('foo', :path => DIR)
|
18
|
-
|
19
|
-
loop do
|
20
|
-
100.times do |i|
|
21
|
-
if role == 'master'
|
22
|
-
db.set(i, db[i].to_i + 1)
|
23
|
-
puts "#{i}: #{db[i]}"
|
24
|
-
else
|
25
|
-
puts "#{i}: #{db[i]}"
|
26
|
-
end
|
27
|
-
sleep 0.1
|
28
|
-
end
|
29
|
-
end
|