ruby-postgres 0.7.1.2005.11.24 → 0.7.1.2005.11.26
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/Contributors +1 -1
- data/postgres.c +33 -15
- data/ruby-postgres.gemspec +1 -1
- data/test.rb +45 -0
- metadata +3 -2
data/Contributors
CHANGED
data/postgres.c
CHANGED
@@ -75,9 +75,13 @@ static VALUE rb_ePGError;
|
|
75
75
|
static VALUE rb_cPGlarge;
|
76
76
|
static VALUE rb_cPGrow;
|
77
77
|
|
78
|
+
static VALUE pgconn_lastval _((VALUE));
|
79
|
+
|
78
80
|
static VALUE pgresult_result_with_clear _((VALUE));
|
79
81
|
static VALUE pgresult_new _((PGresult*));
|
80
82
|
|
83
|
+
static int translate_results = 1;
|
84
|
+
|
81
85
|
/* Large Object support */
|
82
86
|
typedef struct pglarge_object
|
83
87
|
{
|
@@ -168,10 +172,22 @@ pgconn_connect(argc, argv, self)
|
|
168
172
|
rb_raise(rb_ePGError, StringValuePtr(message));
|
169
173
|
}
|
170
174
|
|
175
|
+
if (PQserverVersion(conn) >= 80100) {
|
176
|
+
rb_define_singleton_method(self, "lastval", pgconn_lastval, 0);
|
177
|
+
}
|
178
|
+
|
171
179
|
Data_Set_Struct(self, conn);
|
172
180
|
return self;
|
173
181
|
}
|
174
182
|
|
183
|
+
static VALUE
|
184
|
+
pgconn_s_translate_results_set(self, fact)
|
185
|
+
VALUE self, fact;
|
186
|
+
{
|
187
|
+
translate_results = (fact == Qfalse || fact == Qnil) ? 0 : 1;
|
188
|
+
return Qnil;
|
189
|
+
}
|
190
|
+
|
175
191
|
/*
|
176
192
|
* See #new.
|
177
193
|
*/
|
@@ -223,7 +239,7 @@ pgconn_s_format(self, obj)
|
|
223
239
|
return result;
|
224
240
|
|
225
241
|
default:
|
226
|
-
if (
|
242
|
+
if (CLASS_OF(obj) == rb_cBigDecimal) {
|
227
243
|
return rb_funcall(obj, rb_intern("to_s"), 1, rb_str_new2("F"));
|
228
244
|
}
|
229
245
|
else if (rb_block_given_p()) {
|
@@ -393,7 +409,6 @@ pgconn_s_unescape_bytea(self, obj)
|
|
393
409
|
return ret;
|
394
410
|
}
|
395
411
|
|
396
|
-
#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
|
397
412
|
/*
|
398
413
|
* call-seq:
|
399
414
|
* PGconn.connect(host, port, options, tty, dbname, login, passwd) => conn
|
@@ -410,6 +425,7 @@ pgconn_s_unescape_bytea(self, obj)
|
|
410
425
|
*
|
411
426
|
* On failure, it raises a PGError exception.
|
412
427
|
*/
|
428
|
+
#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
|
413
429
|
static VALUE
|
414
430
|
pgconn_s_new(argc, argv, klass)
|
415
431
|
int argc;
|
@@ -422,9 +438,6 @@ pgconn_s_new(argc, argv, klass)
|
|
422
438
|
}
|
423
439
|
#endif
|
424
440
|
|
425
|
-
/*
|
426
|
-
* See #new.
|
427
|
-
*/
|
428
441
|
static VALUE
|
429
442
|
pgconn_init(argc, argv, self)
|
430
443
|
int argc;
|
@@ -441,7 +454,7 @@ get_pgconn(obj)
|
|
441
454
|
PGconn *conn;
|
442
455
|
|
443
456
|
Data_Get_Struct(obj, PGconn, conn);
|
444
|
-
if (conn ==
|
457
|
+
if (conn == NULL) rb_raise(rb_ePGError, "closed connection");
|
445
458
|
return conn;
|
446
459
|
}
|
447
460
|
|
@@ -1079,8 +1092,6 @@ pgconn_lastval(obj)
|
|
1079
1092
|
PGresult *result;
|
1080
1093
|
VALUE lastval, error;
|
1081
1094
|
|
1082
|
-
if (PQserverVersion(conn) < 80100) return Qnil;
|
1083
|
-
|
1084
1095
|
result = PQexec(conn, "select lastval()");
|
1085
1096
|
if (!result) rb_raise(rb_ePGError, PQerrorMessage(conn));
|
1086
1097
|
|
@@ -1146,11 +1157,11 @@ free_pgresult(ptr)
|
|
1146
1157
|
#define SCALE_MASK 0xffff
|
1147
1158
|
|
1148
1159
|
static int
|
1149
|
-
|
1160
|
+
has_numeric_scale(typmod)
|
1150
1161
|
int typmod;
|
1151
1162
|
{
|
1152
|
-
if (
|
1153
|
-
return typmod & SCALE_MASK;
|
1163
|
+
if (typmod == -1) return 1;
|
1164
|
+
return (typmod - VARHDRSZ) & SCALE_MASK;
|
1154
1165
|
}
|
1155
1166
|
|
1156
1167
|
#define PARSE(klass, string) rb_funcall(klass, rb_intern("parse"), 1, rb_tainted_str_new2(string));
|
@@ -1161,11 +1172,18 @@ fetch_pgresult(result, row, column)
|
|
1161
1172
|
int row;
|
1162
1173
|
int column;
|
1163
1174
|
{
|
1175
|
+
char* string;
|
1176
|
+
|
1164
1177
|
if (PQgetisnull(result, row, column)) {
|
1165
1178
|
return Qnil;
|
1166
1179
|
}
|
1167
1180
|
|
1168
|
-
|
1181
|
+
string = PQgetvalue(result, row, column);
|
1182
|
+
|
1183
|
+
if (!translate_results) {
|
1184
|
+
return rb_tainted_str_new2(string);
|
1185
|
+
}
|
1186
|
+
|
1169
1187
|
switch (PQftype(result, column)) {
|
1170
1188
|
|
1171
1189
|
case BOOLOID:
|
@@ -1175,7 +1193,7 @@ fetch_pgresult(result, row, column)
|
|
1175
1193
|
return pgconn_s_unescape_bytea(NULL, rb_tainted_str_new2(string));
|
1176
1194
|
|
1177
1195
|
case NUMERICOID:
|
1178
|
-
if (
|
1196
|
+
if (has_numeric_scale(PQfmod(result, column))) {
|
1179
1197
|
return rb_funcall(rb_cBigDecimal, rb_intern("new"), 1, rb_tainted_str_new2(string));
|
1180
1198
|
}
|
1181
1199
|
/* when scale == 0 return inum */
|
@@ -1726,7 +1744,7 @@ get_pglarge(obj)
|
|
1726
1744
|
{
|
1727
1745
|
PGlarge *pglarge;
|
1728
1746
|
Data_Get_Struct(obj, PGlarge, pglarge);
|
1729
|
-
if (pglarge ==
|
1747
|
+
if (pglarge == NULL) rb_raise(rb_ePGError, "invalid large object");
|
1730
1748
|
return pglarge;
|
1731
1749
|
}
|
1732
1750
|
|
@@ -2337,6 +2355,7 @@ Init_postgres()
|
|
2337
2355
|
rb_define_singleton_method(rb_cPGconn, "quote", pgconn_s_quote, 1);
|
2338
2356
|
rb_define_singleton_method(rb_cPGconn, "escape_bytea", pgconn_s_escape_bytea, 1);
|
2339
2357
|
rb_define_singleton_method(rb_cPGconn, "unescape_bytea", pgconn_s_unescape_bytea, 1);
|
2358
|
+
rb_define_singleton_method(rb_cPGconn, "translate_results=", pgconn_s_translate_results_set, 1);
|
2340
2359
|
|
2341
2360
|
rb_define_const(rb_cPGconn, "CONNECTION_OK", INT2FIX(CONNECTION_OK));
|
2342
2361
|
rb_define_const(rb_cPGconn, "CONNECTION_BAD", INT2FIX(CONNECTION_BAD));
|
@@ -2368,7 +2387,6 @@ Init_postgres()
|
|
2368
2387
|
rb_define_method(rb_cPGconn, "transaction_status", pgconn_transaction_status, 0);
|
2369
2388
|
rb_define_method(rb_cPGconn, "protocol_version", pgconn_protocol_version, 0);
|
2370
2389
|
rb_define_method(rb_cPGconn, "server_version", pgconn_server_version, 0);
|
2371
|
-
rb_define_method(rb_cPGconn, "lastval", pgconn_lastval, 0);
|
2372
2390
|
|
2373
2391
|
#ifdef HAVE_PQSETCLIENTENCODING
|
2374
2392
|
rb_define_method(rb_cPGconn, "client_encoding", pgconn_client_encoding, 0);
|
data/ruby-postgres.gemspec
CHANGED
@@ -14,7 +14,7 @@ SPEC = Gem::Specification.new do |s|
|
|
14
14
|
s.require_path = '.'
|
15
15
|
s.autorequire = 'postgres'
|
16
16
|
|
17
|
-
if File.exists? 'postgres.so' and PLATFORM =~ /mingw/
|
17
|
+
if File.exists? 'postgres.so' and PLATFORM =~ /mingw|mswin/
|
18
18
|
s.platform = Gem::Platform::WIN32
|
19
19
|
else
|
20
20
|
s.platform = Gem::Platform::RUBY
|
data/test.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'postgres'
|
2
|
+
require 'date'
|
3
|
+
require 'test/unit'
|
4
|
+
class TC_MyTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@conn = PGconn.new('dbname' => 'template1')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_conversion
|
10
|
+
query = <<-EOT
|
11
|
+
select true as true_value,
|
12
|
+
false as false_value,
|
13
|
+
'12345\\\\111\\\\000\\\\111TEST'::bytea as bytea_value,
|
14
|
+
'2005-11-30'::date as date_value,
|
15
|
+
'12:00:00'::time as time_value,
|
16
|
+
now() as date_time_value,
|
17
|
+
1.5::float as float_value,
|
18
|
+
12345.5678::numeric as numeric_value,
|
19
|
+
1234.56::numeric(10) as numeric_10_value,
|
20
|
+
12345.12345::numeric(10,5) as numeric_10_5_value
|
21
|
+
EOT
|
22
|
+
res = @conn.exec(query)
|
23
|
+
assert_equal(res.num_tuples, 1)
|
24
|
+
assert_equal(res.num_fields, 10)
|
25
|
+
tuple = res.result[0]
|
26
|
+
puts tuple
|
27
|
+
assert_equal(true, tuple['true_value'])
|
28
|
+
assert_equal(false, tuple['false_value'])
|
29
|
+
assert_equal("12345\111\000\111TEST", tuple['bytea_value'])
|
30
|
+
puts PGconn.escape_bytea(tuple['bytea_value'])
|
31
|
+
assert_equal("12345I\\\\000ITEST", PGconn.escape_bytea(tuple['bytea_value']))
|
32
|
+
assert_equal(Date.parse('2005-11-30'), tuple['date_value'])
|
33
|
+
puts tuple['date_value']
|
34
|
+
assert_kind_of(Time, tuple['time_value'])
|
35
|
+
puts tuple['time_value']
|
36
|
+
assert_kind_of(DateTime, tuple['date_time_value'])
|
37
|
+
puts tuple['date_time_value']
|
38
|
+
assert_equal(1.5, tuple['float_value'])
|
39
|
+
puts PGconn.quote(tuple['numeric_value'])
|
40
|
+
assert_equal(BigDecimal("12345.5678"), tuple['numeric_value'])
|
41
|
+
assert_equal(1235, tuple['numeric_10_value'])
|
42
|
+
assert_kind_of(Integer, tuple['numeric_10_value'])
|
43
|
+
assert_equal(BigDecimal("12345.12345"), tuple['numeric_10_5_value'])
|
44
|
+
end
|
45
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-postgres
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.1.2005.11.
|
7
|
-
date: 2005-11-
|
6
|
+
version: 0.7.1.2005.11.26
|
7
|
+
date: 2005-11-26 00:00:00 -06:00
|
8
8
|
summary: Ruby extension for PostgreSQL database coordination
|
9
9
|
require_paths:
|
10
10
|
- .
|
@@ -30,6 +30,7 @@ authors:
|
|
30
30
|
files:
|
31
31
|
- sample
|
32
32
|
- Contributors
|
33
|
+
- test.rb
|
33
34
|
- ruby-postgres.gemspec
|
34
35
|
- ChangeLog
|
35
36
|
- libpq-compat.c
|