bdb 0.2.2 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|