do_postgres 0.10.5-x86-mingw32 → 0.10.6-x86-mingw32
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/ChangeLog.markdown +5 -0
- data/Rakefile +1 -0
- data/ext/do_postgres/do_common.c +60 -55
- data/ext/do_postgres/do_common.h +39 -76
- data/ext/do_postgres/do_postgres.c +72 -65
- data/ext/do_postgres/error.h +1 -1
- data/lib/do_postgres/1.8/do_postgres.so +0 -0
- data/lib/do_postgres/1.9/do_postgres.so +0 -0
- data/lib/do_postgres/version.rb +1 -1
- data/tasks/compile.rake +1 -1
- metadata +14 -14
data/ChangeLog.markdown
CHANGED
data/Rakefile
CHANGED
data/ext/do_postgres/do_common.c
CHANGED
@@ -45,6 +45,11 @@ VALUE rb_cBigDecimal;
|
|
45
45
|
* Common Functions
|
46
46
|
*/
|
47
47
|
|
48
|
+
|
49
|
+
VALUE data_objects_const_get(VALUE scope, const char *constant) {
|
50
|
+
return rb_funcall(scope, ID_CONST_GET, 1, rb_str_new2(constant));
|
51
|
+
}
|
52
|
+
|
48
53
|
void data_objects_debug(VALUE connection, VALUE string, struct timeval *start) {
|
49
54
|
struct timeval stop;
|
50
55
|
VALUE message;
|
@@ -57,7 +62,7 @@ void data_objects_debug(VALUE connection, VALUE string, struct timeval *start) {
|
|
57
62
|
rb_funcall(connection, ID_LOG, 1, message);
|
58
63
|
}
|
59
64
|
|
60
|
-
void
|
65
|
+
void data_objects_raise_error(VALUE self, const struct errcodes *errors, int errnum, const char *message, VALUE query, VALUE state) {
|
61
66
|
const char *exception_type = "SQLError";
|
62
67
|
const struct errcodes *e;
|
63
68
|
|
@@ -72,7 +77,7 @@ void do_raise_error(VALUE self, const struct errcodes *errors, int errnum, const
|
|
72
77
|
VALUE uri = rb_funcall(rb_iv_get(self, "@connection"), rb_intern("to_s"), 0);
|
73
78
|
|
74
79
|
VALUE exception = rb_funcall(
|
75
|
-
|
80
|
+
data_objects_const_get(mDO, exception_type),
|
76
81
|
ID_NEW,
|
77
82
|
5,
|
78
83
|
rb_str_new2(message),
|
@@ -85,7 +90,7 @@ void do_raise_error(VALUE self, const struct errcodes *errors, int errnum, const
|
|
85
90
|
rb_exc_raise(exception);
|
86
91
|
}
|
87
92
|
|
88
|
-
char *
|
93
|
+
char *data_objects_get_uri_option(VALUE query_hash, const char *key) {
|
89
94
|
VALUE query_value;
|
90
95
|
char *value = NULL;
|
91
96
|
|
@@ -102,7 +107,7 @@ char *get_uri_option(VALUE query_hash, const char *key) {
|
|
102
107
|
return value;
|
103
108
|
}
|
104
109
|
|
105
|
-
void
|
110
|
+
void data_objects_assert_file_exists(char *file, const char *message) {
|
106
111
|
if (file) {
|
107
112
|
if (rb_funcall(rb_cFile, rb_intern("exist?"), 1, rb_str_new2(file)) == Qfalse) {
|
108
113
|
rb_raise(rb_eArgError, "%s", message);
|
@@ -110,7 +115,7 @@ void assert_file_exists(char *file, const char *message) {
|
|
110
115
|
}
|
111
116
|
}
|
112
117
|
|
113
|
-
VALUE
|
118
|
+
VALUE data_objects_build_query_from_args(VALUE klass, int count, VALUE *args) {
|
114
119
|
VALUE array = rb_ary_new();
|
115
120
|
int i;
|
116
121
|
|
@@ -123,7 +128,7 @@ VALUE build_query_from_args(VALUE klass, int count, VALUE *args) {
|
|
123
128
|
|
124
129
|
// Find the greatest common denominator and reduce the provided numerator and denominator.
|
125
130
|
// This replaces calles to Rational.reduce! which does the same thing, but really slowly.
|
126
|
-
void
|
131
|
+
void data_objects_reduce(do_int64 *numerator, do_int64 *denominator) {
|
127
132
|
do_int64 a = *numerator, b = *denominator, c;
|
128
133
|
|
129
134
|
while (a != 0) {
|
@@ -137,7 +142,7 @@ void reduce(do_int64 *numerator, do_int64 *denominator) {
|
|
137
142
|
}
|
138
143
|
|
139
144
|
// Generate the date integer which Date.civil_to_jd returns
|
140
|
-
int
|
145
|
+
int data_objects_jd_from_date(int year, int month, int day) {
|
141
146
|
int a, b;
|
142
147
|
|
143
148
|
if (month <= 2) {
|
@@ -151,24 +156,24 @@ int jd_from_date(int year, int month, int day) {
|
|
151
156
|
return (int)(floor(365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524);
|
152
157
|
}
|
153
158
|
|
154
|
-
VALUE
|
159
|
+
VALUE data_objects_seconds_to_offset(long seconds_offset) {
|
155
160
|
do_int64 num = seconds_offset;
|
156
161
|
do_int64 den = 86400;
|
157
162
|
|
158
|
-
|
163
|
+
data_objects_reduce(&num, &den);
|
159
164
|
return rb_funcall(rb_mKernel, ID_RATIONAL, 2, rb_ll2inum(num), rb_ll2inum(den));
|
160
165
|
}
|
161
166
|
|
162
|
-
VALUE
|
167
|
+
VALUE data_objects_timezone_to_offset(int hour_offset, int minute_offset) {
|
163
168
|
do_int64 seconds = 0;
|
164
169
|
|
165
170
|
seconds += hour_offset * 3600;
|
166
171
|
seconds += minute_offset * 60;
|
167
172
|
|
168
|
-
return
|
173
|
+
return data_objects_seconds_to_offset(seconds);
|
169
174
|
}
|
170
175
|
|
171
|
-
VALUE
|
176
|
+
VALUE data_objects_parse_date(const char *date) {
|
172
177
|
static char const *const _fmt_date = "%4d-%2d-%2d";
|
173
178
|
int year = 0, month = 0, day = 0;
|
174
179
|
int jd, ajd;
|
@@ -180,14 +185,14 @@ VALUE parse_date(const char *date) {
|
|
180
185
|
return Qnil;
|
181
186
|
}
|
182
187
|
|
183
|
-
jd =
|
188
|
+
jd = data_objects_jd_from_date(year, month, day);
|
184
189
|
ajd = (jd * 2) - 1; // Math from Date.jd_to_ajd
|
185
190
|
rational = rb_funcall(rb_mKernel, ID_RATIONAL, 2, INT2NUM(ajd), INT2NUM(2));
|
186
191
|
|
187
192
|
return rb_funcall(rb_cDate, ID_NEW_DATE, 3, rational, INT2NUM(0), INT2NUM(2299161));
|
188
193
|
}
|
189
194
|
|
190
|
-
VALUE
|
195
|
+
VALUE data_objects_parse_time(const char *date) {
|
191
196
|
static char const* const _fmt_datetime = "%4d-%2d-%2d %2d:%2d:%2d%7lf";
|
192
197
|
int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0, usec = 0;
|
193
198
|
double subsec = 0;
|
@@ -208,7 +213,7 @@ VALUE parse_time(const char *date) {
|
|
208
213
|
return rb_funcall(rb_cTime, rb_intern("local"), 7, INT2NUM(year), INT2NUM(month), INT2NUM(day), INT2NUM(hour), INT2NUM(min), INT2NUM(sec), INT2NUM(usec));
|
209
214
|
}
|
210
215
|
|
211
|
-
VALUE
|
216
|
+
VALUE data_objects_parse_date_time(const char *date) {
|
212
217
|
static char const* const _fmt_datetime_tz_normal = "%4d-%2d-%2d%*c%2d:%2d:%2d%3d:%2d";
|
213
218
|
static char const* const _fmt_datetime_tz_subsec = "%4d-%2d-%2d%*c%2d:%2d:%2d.%*d%3d:%2d";
|
214
219
|
int tokens_read;
|
@@ -294,7 +299,7 @@ VALUE parse_date_time(const char *date) {
|
|
294
299
|
rb_raise(eDataError, "Couldn't parse date: %s", date);
|
295
300
|
}
|
296
301
|
|
297
|
-
jd =
|
302
|
+
jd = data_objects_jd_from_date(year, month, day);
|
298
303
|
|
299
304
|
/*
|
300
305
|
* Generate ajd with fractional days for the time.
|
@@ -306,47 +311,47 @@ VALUE parse_date_time(const char *date) {
|
|
306
311
|
num = (hour * 1440) + (min * 24);
|
307
312
|
num -= (hour_offset * 1440) + (minute_offset * 24);
|
308
313
|
den = (24 * 1440);
|
309
|
-
|
314
|
+
data_objects_reduce(&num, &den);
|
310
315
|
|
311
316
|
num = (num * 86400) + (sec * den);
|
312
317
|
den = den * 86400;
|
313
|
-
|
318
|
+
data_objects_reduce(&num, &den);
|
314
319
|
|
315
320
|
num += jd * den;
|
316
321
|
|
317
322
|
num = (num * 2) - den;
|
318
323
|
den *= 2;
|
319
|
-
|
324
|
+
data_objects_reduce(&num, &den);
|
320
325
|
|
321
326
|
ajd = rb_funcall(rb_mKernel, ID_RATIONAL, 2, rb_ull2inum(num), rb_ull2inum(den));
|
322
|
-
offset =
|
327
|
+
offset = data_objects_timezone_to_offset(hour_offset, minute_offset);
|
323
328
|
|
324
329
|
return rb_funcall(rb_cDateTime, ID_NEW_DATE, 3, ajd, offset, INT2NUM(2299161));
|
325
330
|
}
|
326
331
|
|
327
|
-
VALUE
|
332
|
+
VALUE data_objects_cConnection_character_set(VALUE self) {
|
328
333
|
return rb_iv_get(self, "@encoding");
|
329
334
|
}
|
330
335
|
|
331
|
-
VALUE
|
336
|
+
VALUE data_objects_cConnection_is_using_socket(VALUE self) {
|
332
337
|
return rb_iv_get(self, "@using_socket");
|
333
338
|
}
|
334
339
|
|
335
|
-
VALUE
|
340
|
+
VALUE data_objects_cConnection_ssl_cipher(VALUE self) {
|
336
341
|
return rb_iv_get(self, "@ssl_cipher");
|
337
342
|
}
|
338
343
|
|
339
|
-
VALUE
|
344
|
+
VALUE data_objects_cConnection_quote_time(VALUE self, VALUE value) {
|
340
345
|
return rb_funcall(value, ID_STRFTIME, 1, rb_str_new2("'%Y-%m-%d %H:%M:%S'"));
|
341
346
|
}
|
342
347
|
|
343
|
-
VALUE
|
348
|
+
VALUE data_objects_cConnection_quote_date_time(VALUE self, VALUE value) {
|
344
349
|
// TODO: Support non-local dates. we need to call #new_offset on the date to be
|
345
350
|
// quoted and pass in the current locale's date offset (self.new_offset((hours * 3600).to_r / 86400)
|
346
351
|
return rb_funcall(value, ID_STRFTIME, 1, rb_str_new2("'%Y-%m-%d %H:%M:%S'"));
|
347
352
|
}
|
348
353
|
|
349
|
-
VALUE
|
354
|
+
VALUE data_objects_cConnection_quote_date(VALUE self, VALUE value) {
|
350
355
|
return rb_funcall(value, ID_STRFTIME, 1, rb_str_new2("'%Y-%m-%d'"));
|
351
356
|
}
|
352
357
|
|
@@ -354,7 +359,7 @@ VALUE cConnection_quote_date(VALUE self, VALUE value) {
|
|
354
359
|
* Accepts an array of Ruby types (Fixnum, Float, String, etc...) and turns them
|
355
360
|
* into Ruby-strings so we can easily typecast later
|
356
361
|
*/
|
357
|
-
VALUE
|
362
|
+
VALUE data_objects_cCommand_set_types(int argc, VALUE *argv, VALUE self) {
|
358
363
|
VALUE type_strings = rb_ary_new();
|
359
364
|
VALUE array = rb_ary_new();
|
360
365
|
|
@@ -393,7 +398,7 @@ VALUE cCommand_set_types(int argc, VALUE *argv, VALUE self) {
|
|
393
398
|
return array;
|
394
399
|
}
|
395
400
|
|
396
|
-
VALUE
|
401
|
+
VALUE data_objects_cReader_values(VALUE self) {
|
397
402
|
VALUE state = rb_iv_get(self, "@opened");
|
398
403
|
VALUE values = rb_iv_get(self, "@values");
|
399
404
|
|
@@ -404,27 +409,27 @@ VALUE cReader_values(VALUE self) {
|
|
404
409
|
return rb_iv_get(self, "@values");
|
405
410
|
}
|
406
411
|
|
407
|
-
VALUE
|
412
|
+
VALUE data_objects_cReader_fields(VALUE self) {
|
408
413
|
return rb_iv_get(self, "@fields");
|
409
414
|
}
|
410
415
|
|
411
|
-
VALUE
|
416
|
+
VALUE data_objects_cReader_field_count(VALUE self) {
|
412
417
|
return rb_iv_get(self, "@field_count");
|
413
418
|
}
|
414
419
|
|
415
|
-
void
|
420
|
+
void data_objects_common_init(void) {
|
416
421
|
rb_require("bigdecimal");
|
417
422
|
rb_require("rational");
|
418
423
|
rb_require("date");
|
419
424
|
rb_require("data_objects");
|
420
425
|
|
421
|
-
// Needed by
|
426
|
+
// Needed by data_objects_const_get
|
422
427
|
ID_CONST_GET = rb_intern("const_get");
|
423
428
|
|
424
429
|
// Get references classes needed for Date/Time parsing
|
425
|
-
rb_cDate =
|
426
|
-
rb_cDateTime =
|
427
|
-
rb_cBigDecimal =
|
430
|
+
rb_cDate = data_objects_const_get(rb_mKernel, "Date");
|
431
|
+
rb_cDateTime = data_objects_const_get(rb_mKernel, "DateTime");
|
432
|
+
rb_cBigDecimal = data_objects_const_get(rb_mKernel, "BigDecimal");
|
428
433
|
|
429
434
|
ID_NEW = rb_intern("new");
|
430
435
|
#ifdef RUBY_LESS_THAN_186
|
@@ -439,22 +444,22 @@ void common_init(void) {
|
|
439
444
|
ID_LOG = rb_intern("log");
|
440
445
|
|
441
446
|
// Get references to the Extlib module
|
442
|
-
mExtlib =
|
443
|
-
rb_cByteArray =
|
447
|
+
mExtlib = data_objects_const_get(rb_mKernel, "Extlib");
|
448
|
+
rb_cByteArray = data_objects_const_get(mExtlib, "ByteArray");
|
444
449
|
|
445
450
|
// Get references to the DataObjects module and its classes
|
446
|
-
mDO =
|
447
|
-
cDO_Quoting =
|
448
|
-
cDO_Connection =
|
449
|
-
cDO_Command =
|
450
|
-
cDO_Result =
|
451
|
-
cDO_Reader =
|
452
|
-
cDO_Logger =
|
453
|
-
cDO_Logger_Message =
|
454
|
-
cDO_Extension =
|
455
|
-
|
456
|
-
eConnectionError =
|
457
|
-
eDataError =
|
451
|
+
mDO = data_objects_const_get(rb_mKernel, "DataObjects");
|
452
|
+
cDO_Quoting = data_objects_const_get(mDO, "Quoting");
|
453
|
+
cDO_Connection = data_objects_const_get(mDO, "Connection");
|
454
|
+
cDO_Command = data_objects_const_get(mDO, "Command");
|
455
|
+
cDO_Result = data_objects_const_get(mDO, "Result");
|
456
|
+
cDO_Reader = data_objects_const_get(mDO, "Reader");
|
457
|
+
cDO_Logger = data_objects_const_get(mDO, "Logger");
|
458
|
+
cDO_Logger_Message = data_objects_const_get(cDO_Logger, "Message");
|
459
|
+
cDO_Extension = data_objects_const_get(mDO, "Extension");
|
460
|
+
|
461
|
+
eConnectionError = data_objects_const_get(mDO, "ConnectionError");
|
462
|
+
eDataError = data_objects_const_get(mDO, "DataError");
|
458
463
|
|
459
464
|
rb_global_variable(&ID_NEW_DATE);
|
460
465
|
rb_global_variable(&ID_RATIONAL);
|
@@ -480,7 +485,7 @@ void common_init(void) {
|
|
480
485
|
/*
|
481
486
|
* Common typecasting logic that can be used or overriden by Adapters.
|
482
487
|
*/
|
483
|
-
extern VALUE
|
488
|
+
extern VALUE data_objects_typecast(const char *value, long length, const VALUE type, int encoding) {
|
484
489
|
#ifdef HAVE_RUBY_ENCODING_H
|
485
490
|
rb_encoding *internal_encoding = rb_default_internal_encoding();
|
486
491
|
#else
|
@@ -491,7 +496,7 @@ extern VALUE do_typecast(const char *value, long length, const VALUE type, int e
|
|
491
496
|
return rb_cstr2inum(value, 10);
|
492
497
|
}
|
493
498
|
else if (type == rb_cString) {
|
494
|
-
return
|
499
|
+
return DATA_OBJECTS_STR_NEW(value, length, encoding, internal_encoding);
|
495
500
|
}
|
496
501
|
else if (type == rb_cFloat) {
|
497
502
|
return rb_float_new(rb_cstr_to_dbl(value, Qfalse));
|
@@ -500,13 +505,13 @@ extern VALUE do_typecast(const char *value, long length, const VALUE type, int e
|
|
500
505
|
return rb_funcall(rb_cBigDecimal, ID_NEW, 1, rb_str_new(value, length));
|
501
506
|
}
|
502
507
|
else if (type == rb_cDate) {
|
503
|
-
return
|
508
|
+
return data_objects_parse_date(value);
|
504
509
|
}
|
505
510
|
else if (type == rb_cDateTime) {
|
506
|
-
return
|
511
|
+
return data_objects_parse_date_time(value);
|
507
512
|
}
|
508
513
|
else if (type == rb_cTime) {
|
509
|
-
return
|
514
|
+
return data_objects_parse_time(value);
|
510
515
|
}
|
511
516
|
else if (type == rb_cTrueClass) {
|
512
517
|
return (!value || strcmp("0", value) == 0) ? Qfalse : Qtrue;
|
@@ -521,6 +526,6 @@ extern VALUE do_typecast(const char *value, long length, const VALUE type, int e
|
|
521
526
|
return Qnil;
|
522
527
|
}
|
523
528
|
else {
|
524
|
-
return
|
529
|
+
return DATA_OBJECTS_STR_NEW(value, length, encoding, internal_encoding);
|
525
530
|
}
|
526
531
|
}
|
data/ext/do_postgres/do_common.h
CHANGED
@@ -3,18 +3,24 @@
|
|
3
3
|
|
4
4
|
#include <ruby.h>
|
5
5
|
|
6
|
+
// Needed for defining error.h
|
7
|
+
struct errcodes {
|
8
|
+
int error_no;
|
9
|
+
const char *error_name;
|
10
|
+
const char *exception;
|
11
|
+
};
|
12
|
+
|
13
|
+
#define ERRCODE(name,message) {name, #name, message}
|
14
|
+
|
6
15
|
#ifdef _WIN32
|
7
|
-
#define cCommand_execute cCommand_execute_sync
|
8
16
|
typedef signed __int64 do_int64;
|
9
17
|
#else
|
10
|
-
#define cCommand_execute cCommand_execute_async
|
11
18
|
typedef signed long long int do_int64;
|
12
19
|
#endif
|
13
20
|
|
14
21
|
#ifdef HAVE_RUBY_ENCODING_H
|
15
22
|
#include <ruby/encoding.h>
|
16
|
-
|
17
|
-
#define DO_STR_NEW2(str, encoding, internal_encoding) \
|
23
|
+
#define DATA_OBJECTS_STR_NEW2(str, encoding, internal_encoding) \
|
18
24
|
({ \
|
19
25
|
VALUE _string = rb_str_new2((const char *)str); \
|
20
26
|
if(encoding != -1) { \
|
@@ -26,7 +32,7 @@ typedef signed long long int do_int64;
|
|
26
32
|
_string; \
|
27
33
|
})
|
28
34
|
|
29
|
-
#define
|
35
|
+
#define DATA_OBJECTS_STR_NEW(str, len, encoding, internal_encoding) \
|
30
36
|
({ \
|
31
37
|
VALUE _string = rb_str_new((const char *)str, (long)len); \
|
32
38
|
if(encoding != -1) { \
|
@@ -38,24 +44,15 @@ typedef signed long long int do_int64;
|
|
38
44
|
_string; \
|
39
45
|
})
|
40
46
|
|
41
|
-
#
|
47
|
+
#else
|
42
48
|
|
43
|
-
#define
|
49
|
+
#define DATA_OBJECTS_STR_NEW2(str, encoding, internal_encoding) \
|
44
50
|
rb_str_new2((const char *)str)
|
45
51
|
|
46
|
-
#define
|
52
|
+
#define DATA_OBJECTS_STR_NEW(str, len, encoding, internal_encoding) \
|
47
53
|
rb_str_new((const char *)str, (long)len)
|
48
54
|
#endif
|
49
55
|
|
50
|
-
// Needed for defining error.h
|
51
|
-
struct errcodes {
|
52
|
-
int error_no;
|
53
|
-
const char *error_name;
|
54
|
-
const char *exception;
|
55
|
-
};
|
56
|
-
|
57
|
-
#define ERRCODE(name,message) {name, #name, message}
|
58
|
-
|
59
56
|
// To store rb_intern values
|
60
57
|
extern ID ID_NEW;
|
61
58
|
extern ID ID_NEW_DATE;
|
@@ -89,71 +86,37 @@ extern VALUE rb_cDateTime;
|
|
89
86
|
extern VALUE rb_cBigDecimal;
|
90
87
|
|
91
88
|
extern void data_objects_debug(VALUE connection, VALUE string, struct timeval *start);
|
92
|
-
extern char *
|
93
|
-
extern void
|
94
|
-
extern VALUE
|
95
|
-
|
96
|
-
extern void reduce(do_int64 *numerator, do_int64 *denominator);
|
97
|
-
extern int jd_from_date(int year, int month, int day);
|
98
|
-
extern VALUE seconds_to_offset(long seconds_offset);
|
99
|
-
extern VALUE timezone_to_offset(int hour_offset, int minute_offset);
|
100
|
-
|
101
|
-
extern VALUE parse_date(const char *date);
|
102
|
-
extern VALUE parse_time(const char *date);
|
103
|
-
extern VALUE parse_date_time(const char *date);
|
104
|
-
|
105
|
-
extern VALUE cConnection_character_set(VALUE self);
|
106
|
-
extern VALUE cConnection_is_using_socket(VALUE self);
|
107
|
-
extern VALUE cConnection_ssl_cipher(VALUE self);
|
108
|
-
extern VALUE cConnection_quote_time(VALUE self, VALUE value);
|
109
|
-
extern VALUE cConnection_quote_date_time(VALUE self, VALUE value);
|
110
|
-
extern VALUE cConnection_quote_date(VALUE self, VALUE value);
|
111
|
-
|
112
|
-
extern VALUE cCommand_set_types(int argc, VALUE *argv, VALUE self);
|
113
|
-
|
114
|
-
extern VALUE cReader_values(VALUE self);
|
115
|
-
extern VALUE cReader_fields(VALUE self);
|
116
|
-
extern VALUE cReader_field_count(VALUE self);
|
117
|
-
|
118
|
-
extern void common_init(void);
|
119
|
-
|
120
|
-
static inline VALUE do_const_get(VALUE scope, const char *constant) {
|
121
|
-
return rb_funcall(scope, ID_CONST_GET, 1, rb_str_new2(constant));
|
122
|
-
}
|
89
|
+
extern char *data_objects_get_uri_option(VALUE query_hash, const char *key);
|
90
|
+
extern void data_objects_assert_file_exists(char *file, const char *message);
|
91
|
+
extern VALUE data_objects_build_query_from_args(VALUE klass, int count, VALUE *args);
|
123
92
|
|
124
|
-
|
125
|
-
|
93
|
+
extern void data_objects_reduce(do_int64 *numerator, do_int64 *denominator);
|
94
|
+
extern int data_objects_jd_from_date(int year, int month, int day);
|
95
|
+
extern VALUE data_objects_seconds_to_offset(long seconds_offset);
|
96
|
+
extern VALUE data_objects_timezone_to_offset(int hour_offset, int minute_offset);
|
126
97
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
}
|
98
|
+
extern VALUE data_objects_parse_date(const char *date);
|
99
|
+
extern VALUE data_objects_parse_time(const char *date);
|
100
|
+
extern VALUE data_objects_parse_date_time(const char *date);
|
131
101
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
102
|
+
extern VALUE data_objects_cConnection_character_set(VALUE self);
|
103
|
+
extern VALUE data_objects_cConnection_is_using_socket(VALUE self);
|
104
|
+
extern VALUE data_objects_cConnection_ssl_cipher(VALUE self);
|
105
|
+
extern VALUE data_objects_cConnection_quote_time(VALUE self, VALUE value);
|
106
|
+
extern VALUE data_objects_cConnection_quote_date_time(VALUE self, VALUE value);
|
107
|
+
extern VALUE data_objects_cConnection_quote_date(VALUE self, VALUE value);
|
136
108
|
|
137
|
-
|
138
|
-
}
|
109
|
+
extern VALUE data_objects_cCommand_set_types(int argc, VALUE *argv, VALUE self);
|
139
110
|
|
140
|
-
|
141
|
-
|
111
|
+
extern VALUE data_objects_cReader_values(VALUE self);
|
112
|
+
extern VALUE data_objects_cReader_fields(VALUE self);
|
113
|
+
extern VALUE data_objects_cReader_field_count(VALUE self);
|
142
114
|
|
143
|
-
|
144
|
-
if(encoding != -1) {
|
145
|
-
rb_enc_associate_index(new_string, encoding);
|
146
|
-
}
|
147
|
-
|
148
|
-
if(internal_encoding) {
|
149
|
-
new_string = rb_str_export_to_enc(new_string, internal_encoding);
|
150
|
-
}
|
151
|
-
#endif
|
115
|
+
extern void data_objects_common_init(void);
|
152
116
|
|
153
|
-
|
154
|
-
}
|
117
|
+
extern VALUE data_objects_const_get(VALUE scope, const char *constant);
|
155
118
|
|
156
|
-
static inline void
|
119
|
+
static inline void data_objects_define_errors(VALUE scope, const struct errcodes *errors) {
|
157
120
|
const struct errcodes *e;
|
158
121
|
|
159
122
|
for (e = errors; e->error_name; e++) {
|
@@ -161,9 +124,9 @@ static inline void do_define_errors(VALUE scope, const struct errcodes *errors)
|
|
161
124
|
}
|
162
125
|
}
|
163
126
|
|
164
|
-
extern void
|
127
|
+
extern void data_objects_raise_error(VALUE self, const struct errcodes *errors, int errnum, const char *message, VALUE query, VALUE state);
|
165
128
|
|
166
|
-
extern VALUE
|
129
|
+
extern VALUE data_objects_typecast(const char *value, long length, const VALUE type, int encoding);
|
167
130
|
|
168
131
|
#define RSTRING_NOT_MODIFIED
|
169
132
|
|
@@ -25,6 +25,13 @@
|
|
25
25
|
#undef printf
|
26
26
|
#endif
|
27
27
|
|
28
|
+
#ifdef _WIN32
|
29
|
+
#define do_postgres_cCommand_execute do_postgres_cCommand_execute_sync
|
30
|
+
#else
|
31
|
+
#define do_postgres_cCommand_execute do_postgres_cCommand_execute_async
|
32
|
+
#endif
|
33
|
+
|
34
|
+
|
28
35
|
#include <ruby.h>
|
29
36
|
#include <string.h>
|
30
37
|
#include <math.h>
|
@@ -37,16 +44,16 @@
|
|
37
44
|
|
38
45
|
VALUE mPostgres;
|
39
46
|
VALUE mEncoding;
|
40
|
-
VALUE
|
41
|
-
VALUE
|
42
|
-
VALUE
|
43
|
-
VALUE
|
47
|
+
VALUE cPostgresConnection;
|
48
|
+
VALUE cPostgresCommand;
|
49
|
+
VALUE cPostgresResult;
|
50
|
+
VALUE cPostgresReader;
|
44
51
|
|
45
|
-
void
|
52
|
+
void do_postgres_full_connect(VALUE self, PGconn *db);
|
46
53
|
|
47
54
|
/* ===== Typecasting Functions ===== */
|
48
55
|
|
49
|
-
VALUE
|
56
|
+
VALUE do_postgres_infer_ruby_type(Oid type) {
|
50
57
|
switch(type) {
|
51
58
|
case BITOID:
|
52
59
|
case VARBITOID:
|
@@ -74,7 +81,7 @@ VALUE infer_ruby_type(Oid type) {
|
|
74
81
|
}
|
75
82
|
}
|
76
83
|
|
77
|
-
VALUE
|
84
|
+
VALUE do_postgres_typecast(const char *value, long length, const VALUE type, int encoding) {
|
78
85
|
if (type == rb_cTrueClass) {
|
79
86
|
return *value == 't' ? Qtrue : Qfalse;
|
80
87
|
}
|
@@ -87,23 +94,23 @@ VALUE typecast(const char *value, long length, const VALUE type, int encoding) {
|
|
87
94
|
return byte_array;
|
88
95
|
}
|
89
96
|
else {
|
90
|
-
return
|
97
|
+
return data_objects_typecast(value, length, type, encoding);
|
91
98
|
}
|
92
99
|
}
|
93
100
|
|
94
|
-
void
|
101
|
+
void do_postgres_raise_error(VALUE self, PGresult *result, VALUE query) {
|
95
102
|
const char *message = PQresultErrorMessage(result);
|
96
103
|
char *sql_state = PQresultErrorField(result, PG_DIAG_SQLSTATE);
|
97
104
|
int postgres_errno = MAKE_SQLSTATE(sql_state[0], sql_state[1], sql_state[2], sql_state[3], sql_state[4]);
|
98
105
|
|
99
106
|
PQclear(result);
|
100
107
|
|
101
|
-
|
108
|
+
data_objects_raise_error(self, do_postgres_errors, postgres_errno, message, query, rb_str_new2(sql_state));
|
102
109
|
}
|
103
110
|
|
104
111
|
/* ====== Public API ======= */
|
105
112
|
|
106
|
-
VALUE
|
113
|
+
VALUE do_postgres_cConnection_dispose(VALUE self) {
|
107
114
|
VALUE connection_container = rb_iv_get(self, "@connection");
|
108
115
|
|
109
116
|
if (connection_container == Qnil) {
|
@@ -121,7 +128,7 @@ VALUE cConnection_dispose(VALUE self) {
|
|
121
128
|
return Qtrue;
|
122
129
|
}
|
123
130
|
|
124
|
-
VALUE
|
131
|
+
VALUE do_postgres_cConnection_quote_string(VALUE self, VALUE string) {
|
125
132
|
PGconn *db = DATA_PTR(rb_iv_get(self, "@connection"));
|
126
133
|
const char *source = rb_str_ptr_readonly(string);
|
127
134
|
int error = 0;
|
@@ -154,13 +161,13 @@ VALUE cConnection_quote_string(VALUE self, VALUE string) {
|
|
154
161
|
// Wrap the escaped string in single-quotes, this is DO's convention
|
155
162
|
escaped[0] = escaped[quoted_length + 1] = '\'';
|
156
163
|
|
157
|
-
result =
|
164
|
+
result = DATA_OBJECTS_STR_NEW(escaped, quoted_length + 2, FIX2INT(rb_iv_get(self, "@encoding_id")), NULL);
|
158
165
|
|
159
166
|
free(escaped);
|
160
167
|
return result;
|
161
168
|
}
|
162
169
|
|
163
|
-
VALUE
|
170
|
+
VALUE do_postgres_cConnection_quote_byte_array(VALUE self, VALUE string) {
|
164
171
|
PGconn *db = DATA_PTR(rb_iv_get(self, "@connection"));
|
165
172
|
const unsigned char *source = (unsigned char *)rb_str_ptr_readonly(string);
|
166
173
|
size_t source_len = rb_str_len(string);
|
@@ -194,7 +201,7 @@ VALUE cConnection_quote_byte_array(VALUE self, VALUE string) {
|
|
194
201
|
}
|
195
202
|
|
196
203
|
#ifdef _WIN32
|
197
|
-
PGresult *
|
204
|
+
PGresult * do_postgres_cCommand_execute_sync(VALUE self, VALUE connection, PGconn *db, VALUE query) {
|
198
205
|
char *str = StringValuePtr(query);
|
199
206
|
PGresult *response;
|
200
207
|
|
@@ -215,7 +222,7 @@ PGresult * cCommand_execute_sync(VALUE self, VALUE connection, PGconn *db, VALUE
|
|
215
222
|
response = PQexec(db, str);
|
216
223
|
}
|
217
224
|
else {
|
218
|
-
|
225
|
+
do_postgres_full_connect(connection, db);
|
219
226
|
response = PQexec(db, str);
|
220
227
|
}
|
221
228
|
}
|
@@ -229,7 +236,7 @@ PGresult * cCommand_execute_sync(VALUE self, VALUE connection, PGconn *db, VALUE
|
|
229
236
|
return response;
|
230
237
|
}
|
231
238
|
#else
|
232
|
-
PGresult *
|
239
|
+
PGresult * do_postgres_cCommand_execute_async(VALUE self, VALUE connection, PGconn *db, VALUE query) {
|
233
240
|
PGresult *response;
|
234
241
|
char* str = StringValuePtr(query);
|
235
242
|
|
@@ -251,7 +258,7 @@ PGresult * cCommand_execute_async(VALUE self, VALUE connection, PGconn *db, VALU
|
|
251
258
|
retval = PQsendQuery(db, str);
|
252
259
|
}
|
253
260
|
else {
|
254
|
-
|
261
|
+
do_postgres_full_connect(connection, db);
|
255
262
|
retval = PQsendQuery(db, str);
|
256
263
|
}
|
257
264
|
}
|
@@ -291,7 +298,7 @@ PGresult * cCommand_execute_async(VALUE self, VALUE connection, PGconn *db, VALU
|
|
291
298
|
}
|
292
299
|
#endif
|
293
300
|
|
294
|
-
VALUE
|
301
|
+
VALUE do_postgres_cConnection_initialize(VALUE self, VALUE uri) {
|
295
302
|
rb_iv_set(self, "@using_socket", Qfalse);
|
296
303
|
|
297
304
|
VALUE r_host = rb_funcall(uri, rb_intern("host"), 0);
|
@@ -330,10 +337,10 @@ VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
330
337
|
|
331
338
|
rb_iv_set(self, "@query", r_query);
|
332
339
|
|
333
|
-
const char *encoding =
|
340
|
+
const char *encoding = data_objects_get_uri_option(r_query, "encoding");
|
334
341
|
|
335
342
|
if (!encoding) {
|
336
|
-
encoding =
|
343
|
+
encoding = data_objects_get_uri_option(r_query, "charset");
|
337
344
|
|
338
345
|
if (!encoding) {
|
339
346
|
encoding = "UTF-8";
|
@@ -344,12 +351,12 @@ VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
344
351
|
|
345
352
|
PGconn *db = NULL;
|
346
353
|
|
347
|
-
|
354
|
+
do_postgres_full_connect(self, db);
|
348
355
|
rb_iv_set(self, "@uri", uri);
|
349
356
|
return Qtrue;
|
350
357
|
}
|
351
358
|
|
352
|
-
void
|
359
|
+
void do_postgres_full_connect(VALUE self, PGconn *db) {
|
353
360
|
VALUE r_host;
|
354
361
|
char *host = NULL;
|
355
362
|
|
@@ -392,7 +399,7 @@ void full_connect(VALUE self, PGconn *db) {
|
|
392
399
|
}
|
393
400
|
|
394
401
|
VALUE r_query = rb_iv_get(self, "@query");
|
395
|
-
const char *search_path =
|
402
|
+
const char *search_path = data_objects_get_uri_option(r_query, "search_path");
|
396
403
|
|
397
404
|
db = PQsetdbLogin(
|
398
405
|
host,
|
@@ -420,11 +427,11 @@ void full_connect(VALUE self, PGconn *db) {
|
|
420
427
|
snprintf(search_path_query, 256, "set search_path to %s;", search_path);
|
421
428
|
|
422
429
|
r_query = rb_str_new2(search_path_query);
|
423
|
-
result =
|
430
|
+
result = do_postgres_cCommand_execute(Qnil, self, db, r_query);
|
424
431
|
|
425
432
|
if (PQresultStatus(result) != PGRES_COMMAND_OK) {
|
426
433
|
free(search_path_query);
|
427
|
-
|
434
|
+
do_postgres_raise_error(self, result, r_query);
|
428
435
|
}
|
429
436
|
|
430
437
|
free(search_path_query);
|
@@ -436,21 +443,21 @@ void full_connect(VALUE self, PGconn *db) {
|
|
436
443
|
VALUE r_options;
|
437
444
|
|
438
445
|
r_options = rb_str_new2(backslash_off);
|
439
|
-
result =
|
446
|
+
result = do_postgres_cCommand_execute(Qnil, self, db, r_options);
|
440
447
|
|
441
448
|
if (PQresultStatus(result) != PGRES_COMMAND_OK) {
|
442
449
|
rb_warn("%s", PQresultErrorMessage(result));
|
443
450
|
}
|
444
451
|
|
445
452
|
r_options = rb_str_new2(standard_strings_on);
|
446
|
-
result =
|
453
|
+
result = do_postgres_cCommand_execute(Qnil, self, db, r_options);
|
447
454
|
|
448
455
|
if (PQresultStatus(result) != PGRES_COMMAND_OK) {
|
449
456
|
rb_warn("%s", PQresultErrorMessage(result));
|
450
457
|
}
|
451
458
|
|
452
459
|
r_options = rb_str_new2(warning_messages);
|
453
|
-
result =
|
460
|
+
result = do_postgres_cCommand_execute(Qnil, self, db, r_options);
|
454
461
|
|
455
462
|
if (PQresultStatus(result) != PGRES_COMMAND_OK) {
|
456
463
|
rb_warn("%s", PQresultErrorMessage(result));
|
@@ -458,7 +465,7 @@ void full_connect(VALUE self, PGconn *db) {
|
|
458
465
|
|
459
466
|
VALUE encoding = rb_iv_get(self, "@encoding");
|
460
467
|
#ifdef HAVE_PQSETCLIENTENCODING
|
461
|
-
VALUE pg_encoding = rb_hash_aref(
|
468
|
+
VALUE pg_encoding = rb_hash_aref(data_objects_const_get(mEncoding, "MAP"), encoding);
|
462
469
|
|
463
470
|
if (pg_encoding != Qnil) {
|
464
471
|
if (PQsetClientEncoding(db, rb_str_ptr_readonly(pg_encoding))) {
|
@@ -485,7 +492,7 @@ void full_connect(VALUE self, PGconn *db) {
|
|
485
492
|
rb_iv_set(self, "@connection", Data_Wrap_Struct(rb_cObject, 0, 0, db));
|
486
493
|
}
|
487
494
|
|
488
|
-
VALUE
|
495
|
+
VALUE do_postgres_cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
|
489
496
|
VALUE connection = rb_iv_get(self, "@connection");
|
490
497
|
VALUE postgres_connection = rb_iv_get(connection, "@connection");
|
491
498
|
|
@@ -493,12 +500,12 @@ VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
|
|
493
500
|
rb_raise(eConnectionError, "This connection has already been closed.");
|
494
501
|
}
|
495
502
|
|
496
|
-
VALUE query =
|
503
|
+
VALUE query = data_objects_build_query_from_args(self, argc, argv);
|
497
504
|
PGconn *db = DATA_PTR(postgres_connection);
|
498
505
|
PGresult *response;
|
499
506
|
int status;
|
500
507
|
|
501
|
-
response =
|
508
|
+
response = do_postgres_cCommand_execute(self, connection, db, query);
|
502
509
|
status = PQresultStatus(response);
|
503
510
|
|
504
511
|
VALUE affected_rows = Qnil;
|
@@ -519,14 +526,14 @@ VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
|
|
519
526
|
affected_rows = INT2NUM(atoi(PQcmdTuples(response)));
|
520
527
|
}
|
521
528
|
else {
|
522
|
-
|
529
|
+
do_postgres_raise_error(self, response, query);
|
523
530
|
}
|
524
531
|
|
525
532
|
PQclear(response);
|
526
|
-
return rb_funcall(
|
533
|
+
return rb_funcall(cPostgresResult, ID_NEW, 3, self, affected_rows, insert_id);
|
527
534
|
}
|
528
535
|
|
529
|
-
VALUE
|
536
|
+
VALUE do_postgres_cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
530
537
|
VALUE connection = rb_iv_get(self, "@connection");
|
531
538
|
VALUE postgres_connection = rb_iv_get(connection, "@connection");
|
532
539
|
|
@@ -534,16 +541,16 @@ VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
534
541
|
rb_raise(eConnectionError, "This connection has already been closed.");
|
535
542
|
}
|
536
543
|
|
537
|
-
VALUE query =
|
544
|
+
VALUE query = data_objects_build_query_from_args(self, argc, argv);
|
538
545
|
PGconn *db = DATA_PTR(postgres_connection);
|
539
|
-
PGresult *response =
|
546
|
+
PGresult *response = do_postgres_cCommand_execute(self, connection, db, query);
|
540
547
|
|
541
548
|
if (PQresultStatus(response) != PGRES_TUPLES_OK) {
|
542
|
-
|
549
|
+
do_postgres_raise_error(self, response, query);
|
543
550
|
}
|
544
551
|
|
545
552
|
int field_count = PQnfields(response);
|
546
|
-
VALUE reader = rb_funcall(
|
553
|
+
VALUE reader = rb_funcall(cPostgresReader, ID_NEW, 0);
|
547
554
|
|
548
555
|
rb_iv_set(reader, "@connection", connection);
|
549
556
|
rb_iv_set(reader, "@reader", Data_Wrap_Struct(rb_cObject, 0, 0, response));
|
@@ -572,7 +579,7 @@ VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
572
579
|
rb_ary_push(field_names, rb_str_new2(PQfname(response, i)));
|
573
580
|
|
574
581
|
if (infer_types == 1) {
|
575
|
-
rb_ary_push(field_types,
|
582
|
+
rb_ary_push(field_types, do_postgres_infer_ruby_type(PQftype(response, i)));
|
576
583
|
}
|
577
584
|
}
|
578
585
|
|
@@ -582,7 +589,7 @@ VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
582
589
|
return reader;
|
583
590
|
}
|
584
591
|
|
585
|
-
VALUE
|
592
|
+
VALUE do_postgres_cReader_close(VALUE self) {
|
586
593
|
VALUE reader_container = rb_iv_get(self, "@reader");
|
587
594
|
|
588
595
|
if (reader_container == Qnil) {
|
@@ -602,7 +609,7 @@ VALUE cReader_close(VALUE self) {
|
|
602
609
|
return Qtrue;
|
603
610
|
}
|
604
611
|
|
605
|
-
VALUE
|
612
|
+
VALUE do_postgres_cReader_next(VALUE self) {
|
606
613
|
PGresult *reader = DATA_PTR(rb_iv_get(self, "@reader"));
|
607
614
|
|
608
615
|
int row_count = NUM2INT(rb_iv_get(self, "@row_count"));
|
@@ -636,7 +643,7 @@ VALUE cReader_next(VALUE self) {
|
|
636
643
|
|
637
644
|
// Always return nil if the value returned from Postgres is null
|
638
645
|
if (!PQgetisnull(reader, position, i)) {
|
639
|
-
value =
|
646
|
+
value = do_postgres_typecast(PQgetvalue(reader, position, i), PQgetlength(reader, position, i), field_type, enc);
|
640
647
|
}
|
641
648
|
else {
|
642
649
|
value = Qnil;
|
@@ -651,34 +658,34 @@ VALUE cReader_next(VALUE self) {
|
|
651
658
|
}
|
652
659
|
|
653
660
|
void Init_do_postgres() {
|
654
|
-
|
661
|
+
data_objects_common_init();
|
655
662
|
|
656
663
|
mPostgres = rb_define_module_under(mDO, "Postgres");
|
657
664
|
mEncoding = rb_define_module_under(mPostgres, "Encoding");
|
658
665
|
|
659
|
-
|
660
|
-
rb_define_method(
|
661
|
-
rb_define_method(
|
662
|
-
rb_define_method(
|
663
|
-
rb_define_method(
|
664
|
-
rb_define_method(
|
666
|
+
cPostgresConnection = rb_define_class_under(mPostgres, "Connection", cDO_Connection);
|
667
|
+
rb_define_method(cPostgresConnection, "initialize", do_postgres_cConnection_initialize, 1);
|
668
|
+
rb_define_method(cPostgresConnection, "dispose", do_postgres_cConnection_dispose, 0);
|
669
|
+
rb_define_method(cPostgresConnection, "character_set", data_objects_cConnection_character_set , 0);
|
670
|
+
rb_define_method(cPostgresConnection, "quote_string", do_postgres_cConnection_quote_string, 1);
|
671
|
+
rb_define_method(cPostgresConnection, "quote_byte_array", do_postgres_cConnection_quote_byte_array, 1);
|
665
672
|
|
666
|
-
|
667
|
-
rb_define_method(
|
668
|
-
rb_define_method(
|
669
|
-
rb_define_method(
|
673
|
+
cPostgresCommand = rb_define_class_under(mPostgres, "Command", cDO_Command);
|
674
|
+
rb_define_method(cPostgresCommand, "set_types", data_objects_cCommand_set_types, -1);
|
675
|
+
rb_define_method(cPostgresCommand, "execute_non_query", do_postgres_cCommand_execute_non_query, -1);
|
676
|
+
rb_define_method(cPostgresCommand, "execute_reader", do_postgres_cCommand_execute_reader, -1);
|
670
677
|
|
671
|
-
|
678
|
+
cPostgresResult = rb_define_class_under(mPostgres, "Result", cDO_Result);
|
672
679
|
|
673
|
-
|
674
|
-
rb_define_method(
|
675
|
-
rb_define_method(
|
676
|
-
rb_define_method(
|
677
|
-
rb_define_method(
|
678
|
-
rb_define_method(
|
680
|
+
cPostgresReader = rb_define_class_under(mPostgres, "Reader", cDO_Reader);
|
681
|
+
rb_define_method(cPostgresReader, "close", do_postgres_cReader_close, 0);
|
682
|
+
rb_define_method(cPostgresReader, "next!", do_postgres_cReader_next, 0);
|
683
|
+
rb_define_method(cPostgresReader, "values", data_objects_cReader_values, 0);
|
684
|
+
rb_define_method(cPostgresReader, "fields", data_objects_cReader_fields, 0);
|
685
|
+
rb_define_method(cPostgresReader, "field_count", data_objects_cReader_field_count, 0);
|
679
686
|
|
680
|
-
rb_global_variable(&
|
681
|
-
rb_global_variable(&
|
687
|
+
rb_global_variable(&cPostgresResult);
|
688
|
+
rb_global_variable(&cPostgresReader);
|
682
689
|
|
683
|
-
|
690
|
+
data_objects_define_errors(mPostgres, do_postgres_errors);
|
684
691
|
}
|
data/ext/do_postgres/error.h
CHANGED
Binary file
|
Binary file
|
data/lib/do_postgres/version.rb
CHANGED
data/tasks/compile.rake
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: do_postgres
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 59
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 10
|
9
|
-
-
|
10
|
-
version: 0.10.
|
9
|
+
- 6
|
10
|
+
version: 0.10.6
|
11
11
|
platform: x86-mingw32
|
12
12
|
authors:
|
13
13
|
- Dirkjan Bussink
|
@@ -19,22 +19,23 @@ date: 2011-03-29 00:00:00 +02:00
|
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
+
type: :runtime
|
22
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
24
|
none: false
|
24
25
|
requirements:
|
25
26
|
- - "="
|
26
27
|
- !ruby/object:Gem::Version
|
27
|
-
hash:
|
28
|
+
hash: 59
|
28
29
|
segments:
|
29
30
|
- 0
|
30
31
|
- 10
|
31
|
-
-
|
32
|
-
version: 0.10.
|
33
|
-
type: :runtime
|
32
|
+
- 6
|
33
|
+
version: 0.10.6
|
34
34
|
name: data_objects
|
35
|
-
prerelease: false
|
36
35
|
version_requirements: *id001
|
36
|
+
prerelease: false
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
+
type: :development
|
38
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
41
|
requirements:
|
@@ -45,11 +46,11 @@ dependencies:
|
|
45
46
|
- 2
|
46
47
|
- 5
|
47
48
|
version: "2.5"
|
48
|
-
type: :development
|
49
49
|
name: rspec
|
50
|
-
prerelease: false
|
51
50
|
version_requirements: *id002
|
51
|
+
prerelease: false
|
52
52
|
- !ruby/object:Gem::Dependency
|
53
|
+
type: :development
|
53
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
55
|
none: false
|
55
56
|
requirements:
|
@@ -60,10 +61,9 @@ dependencies:
|
|
60
61
|
- 0
|
61
62
|
- 7
|
62
63
|
version: "0.7"
|
63
|
-
type: :development
|
64
64
|
name: rake-compiler
|
65
|
-
prerelease: false
|
66
65
|
version_requirements: *id003
|
66
|
+
prerelease: false
|
67
67
|
description: Implements the DataObjects API for PostgreSQL
|
68
68
|
email: d.bussink@gmail.com
|
69
69
|
executables: []
|
@@ -174,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
174
|
requirements: []
|
175
175
|
|
176
176
|
rubyforge_project: dorb
|
177
|
-
rubygems_version: 1.
|
177
|
+
rubygems_version: 1.5.2
|
178
178
|
signing_key:
|
179
179
|
specification_version: 3
|
180
180
|
summary: DataObjects PostgreSQL Driver
|