pg 0.13.2-x86-mingw32 → 0.14.0.pre.353-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +230 -1
- data/History.rdoc +28 -0
- data/Manifest.txt +8 -0
- data/Rakefile +8 -2
- data/Rakefile.cross +11 -4
- data/ext/extconf.rb +7 -0
- data/ext/pg.c +76 -2
- data/ext/pg.h +2 -2
- data/ext/pg_connection.c +196 -81
- data/ext/pg_result.c +77 -58
- data/lib/1.8/pg_ext.so +0 -0
- data/lib/1.9/pg_ext.so +0 -0
- data/lib/pg.rb +1 -1
- data/lib/pg/connection.rb +7 -0
- data/sample/async_api.rb +2 -0
- data/sample/check_conn.rb +21 -0
- data/sample/disk_usage_report.rb +186 -0
- data/sample/issue-119.rb +94 -0
- data/sample/minimal-testcase.rb +17 -0
- data/sample/pg_statistics.rb +294 -0
- data/sample/replication_monitor.rb +231 -0
- data/sample/wal_shipper.rb +434 -0
- data/sample/warehouse_partitions.rb +320 -0
- data/spec/lib/helpers.rb +6 -1
- data/spec/pg/connection_spec.rb +205 -141
- data/spec/pg/result_spec.rb +18 -6
- data/spec/pg_spec.rb +9 -0
- metadata +50 -34
data/ext/pg.h
CHANGED
@@ -107,8 +107,8 @@ void init_pg_result _(( void ));
|
|
107
107
|
|
108
108
|
PGconn *pg_get_pgconn _(( VALUE ));
|
109
109
|
|
110
|
-
VALUE pg_new_result _(( PGresult *,
|
111
|
-
|
110
|
+
VALUE pg_new_result _(( PGresult *, VALUE ));
|
111
|
+
VALUE pg_result_check _(( VALUE ));
|
112
112
|
VALUE pg_result_clear _(( VALUE ));
|
113
113
|
|
114
114
|
#ifdef M17N_SUPPORTED
|
data/ext/pg_connection.c
CHANGED
@@ -21,7 +21,7 @@
|
|
21
21
|
* # Equivalent to:
|
22
22
|
* # res = conn.exec('SELECT 1 AS a, 2 AS b, NULL AS c')
|
23
23
|
*
|
24
|
-
* See the
|
24
|
+
* See the PG::Result class for information on working with the results of a query.
|
25
25
|
*
|
26
26
|
*/
|
27
27
|
VALUE rb_cPGconn;
|
@@ -31,7 +31,9 @@ static PQnoticeProcessor default_notice_processor = NULL;
|
|
31
31
|
|
32
32
|
static PGconn *pgconn_check( VALUE );
|
33
33
|
static VALUE pgconn_finish( VALUE );
|
34
|
-
|
34
|
+
#ifdef M17N_SUPPORTED
|
35
|
+
static VALUE pgconn_set_default_encoding( VALUE self );
|
36
|
+
#endif
|
35
37
|
|
36
38
|
/*
|
37
39
|
* Global functions
|
@@ -164,10 +166,6 @@ pgconn_init(int argc, VALUE *argv, VALUE self)
|
|
164
166
|
PGconn *conn = NULL;
|
165
167
|
VALUE conninfo;
|
166
168
|
VALUE error;
|
167
|
-
#ifdef M17N_SUPPORTED
|
168
|
-
rb_encoding *enc;
|
169
|
-
const char *encname;
|
170
|
-
#endif
|
171
169
|
|
172
170
|
conninfo = rb_funcall2( rb_cPGconn, rb_intern("parse_connect_args"), argc, argv );
|
173
171
|
conn = PQconnectdb(StringValuePtr(conninfo));
|
@@ -185,14 +183,7 @@ pgconn_init(int argc, VALUE *argv, VALUE self)
|
|
185
183
|
}
|
186
184
|
|
187
185
|
#ifdef M17N_SUPPORTED
|
188
|
-
|
189
|
-
* to match */
|
190
|
-
if (( enc = rb_default_internal_encoding() )) {
|
191
|
-
encname = pg_get_rb_encoding_as_pg_encoding( enc );
|
192
|
-
if ( PQsetClientEncoding(conn, encname) != 0 )
|
193
|
-
rb_warn( "Failed to set the default_internal encoding to %s: '%s'",
|
194
|
-
encname, PQerrorMessage(conn) );
|
195
|
-
}
|
186
|
+
pgconn_set_default_encoding( self );
|
196
187
|
#endif
|
197
188
|
|
198
189
|
if (rb_block_given_p()) {
|
@@ -251,6 +242,39 @@ pgconn_s_connect_start( int argc, VALUE *argv, VALUE klass )
|
|
251
242
|
return rb_conn;
|
252
243
|
}
|
253
244
|
|
245
|
+
#ifdef HAVE_PQPING
|
246
|
+
/*
|
247
|
+
* call-seq:
|
248
|
+
* PG::Connection.ping(connection_hash) -> Fixnum
|
249
|
+
* PG::Connection.ping(connection_string) -> Fixnum
|
250
|
+
* PG::Connection.ping(host, port, options, tty, dbname, login, password) -> Fixnum
|
251
|
+
*
|
252
|
+
* Check server status.
|
253
|
+
*
|
254
|
+
* Returns one of:
|
255
|
+
* [+PQPING_OK+]
|
256
|
+
* server is accepting connections
|
257
|
+
* [+PQPING_REJECT+]
|
258
|
+
* server is alive but rejecting connections
|
259
|
+
* [+PQPING_NO_RESPONSE+]
|
260
|
+
* could not establish connection
|
261
|
+
* [+PQPING_NO_ATTEMPT+]
|
262
|
+
* connection not attempted (bad params)
|
263
|
+
*/
|
264
|
+
static VALUE
|
265
|
+
pgconn_s_ping( int argc, VALUE *argv, VALUE klass )
|
266
|
+
{
|
267
|
+
PGPing ping;
|
268
|
+
VALUE conninfo;
|
269
|
+
VALUE error;
|
270
|
+
|
271
|
+
conninfo = rb_funcall2( klass, rb_intern("parse_connect_args"), argc, argv );
|
272
|
+
ping = PQping( StringValuePtr(conninfo) );
|
273
|
+
|
274
|
+
return INT2FIX((int)ping);
|
275
|
+
}
|
276
|
+
#endif
|
277
|
+
|
254
278
|
/*
|
255
279
|
* call-seq:
|
256
280
|
* PG::Connection.conndefaults() -> Array
|
@@ -336,19 +360,6 @@ pgconn_s_encrypt_password(VALUE self, VALUE password, VALUE username)
|
|
336
360
|
}
|
337
361
|
|
338
362
|
|
339
|
-
/*
|
340
|
-
* call-seq:
|
341
|
-
* PG::Connection.isthreadsafe() -> Boolean
|
342
|
-
*
|
343
|
-
* Returns +true+ if libpq is thread safe, +false+ otherwise.
|
344
|
-
*/
|
345
|
-
static VALUE
|
346
|
-
pgconn_s_isthreadsafe(VALUE self)
|
347
|
-
{
|
348
|
-
UNUSED( self );
|
349
|
-
return PQisthreadsafe() ? Qtrue : Qfalse;
|
350
|
-
}
|
351
|
-
|
352
363
|
/**************************************************************************
|
353
364
|
* PG::Connection INSTANCE METHODS
|
354
365
|
**************************************************************************/
|
@@ -733,12 +744,12 @@ pgconn_connection_used_password(VALUE self)
|
|
733
744
|
|
734
745
|
/*
|
735
746
|
* call-seq:
|
736
|
-
* conn.exec(sql [, params, result_format ] ) ->
|
747
|
+
* conn.exec(sql [, params, result_format ] ) -> PG::Result
|
737
748
|
* conn.exec(sql [, params, result_format ] ) {|pg_result| block }
|
738
749
|
*
|
739
750
|
* Sends SQL query request specified by _sql_ to PostgreSQL.
|
740
|
-
* Returns a
|
741
|
-
* On failure, it raises a
|
751
|
+
* Returns a PG::Result instance on success.
|
752
|
+
* On failure, it raises a PG::Error.
|
742
753
|
*
|
743
754
|
* +params+ is an optional array of the bind parameters for the SQL query.
|
744
755
|
* Each element of the +params+ array may be either:
|
@@ -764,7 +775,7 @@ pgconn_connection_used_password(VALUE self)
|
|
764
775
|
* for binary.
|
765
776
|
*
|
766
777
|
* If the optional code block is given, it will be passed <i>result</i> as an argument,
|
767
|
-
* and the
|
778
|
+
* and the PG::Result object will automatically be cleared when the block terminates.
|
768
779
|
* In this instance, <code>conn.exec</code> returns the value of the block.
|
769
780
|
*/
|
770
781
|
static VALUE
|
@@ -793,8 +804,8 @@ pgconn_exec(int argc, VALUE *argv, VALUE self)
|
|
793
804
|
/* If called with no parameters, use PQexec */
|
794
805
|
if(NIL_P(params)) {
|
795
806
|
result = PQexec(conn, StringValuePtr(command));
|
796
|
-
rb_pgresult = pg_new_result(result,
|
797
|
-
|
807
|
+
rb_pgresult = pg_new_result(result, self);
|
808
|
+
pg_result_check(rb_pgresult);
|
798
809
|
if (rb_block_given_p()) {
|
799
810
|
return rb_ensure(rb_yield, rb_pgresult, pg_result_clear, rb_pgresult);
|
800
811
|
}
|
@@ -876,8 +887,8 @@ pgconn_exec(int argc, VALUE *argv, VALUE self)
|
|
876
887
|
xfree(paramLengths);
|
877
888
|
xfree(paramFormats);
|
878
889
|
|
879
|
-
rb_pgresult = pg_new_result(result,
|
880
|
-
|
890
|
+
rb_pgresult = pg_new_result(result, self);
|
891
|
+
pg_result_check(rb_pgresult);
|
881
892
|
if (rb_block_given_p()) {
|
882
893
|
return rb_ensure(rb_yield, rb_pgresult,
|
883
894
|
pg_result_clear, rb_pgresult);
|
@@ -887,11 +898,11 @@ pgconn_exec(int argc, VALUE *argv, VALUE self)
|
|
887
898
|
|
888
899
|
/*
|
889
900
|
* call-seq:
|
890
|
-
* conn.prepare(stmt_name, sql [, param_types ] ) ->
|
901
|
+
* conn.prepare(stmt_name, sql [, param_types ] ) -> PG::Result
|
891
902
|
*
|
892
903
|
* Prepares statement _sql_ with name _name_ to be executed later.
|
893
|
-
* Returns a
|
894
|
-
* On failure, it raises a
|
904
|
+
* Returns a PG::Result instance on success.
|
905
|
+
* On failure, it raises a PG::Error.
|
895
906
|
*
|
896
907
|
* +param_types+ is an optional parameter to specify the Oids of the
|
897
908
|
* types of the parameters.
|
@@ -939,19 +950,19 @@ pgconn_prepare(int argc, VALUE *argv, VALUE self)
|
|
939
950
|
|
940
951
|
xfree(paramTypes);
|
941
952
|
|
942
|
-
rb_pgresult = pg_new_result(result,
|
943
|
-
|
953
|
+
rb_pgresult = pg_new_result(result, self);
|
954
|
+
pg_result_check(rb_pgresult);
|
944
955
|
return rb_pgresult;
|
945
956
|
}
|
946
957
|
|
947
958
|
/*
|
948
959
|
* call-seq:
|
949
|
-
* conn.exec_prepared(statement_name [, params, result_format ] ) ->
|
960
|
+
* conn.exec_prepared(statement_name [, params, result_format ] ) -> PG::Result
|
950
961
|
* conn.exec_prepared(statement_name [, params, result_format ] ) {|pg_result| block }
|
951
962
|
*
|
952
963
|
* Execute prepared named statement specified by _statement_name_.
|
953
|
-
* Returns a
|
954
|
-
* On failure, it raises a
|
964
|
+
* Returns a PG::Result instance on success.
|
965
|
+
* On failure, it raises a PG::Error.
|
955
966
|
*
|
956
967
|
* +params+ is an array of the optional bind parameters for the
|
957
968
|
* SQL query. Each element of the +params+ array may be either:
|
@@ -970,7 +981,7 @@ pgconn_prepare(int argc, VALUE *argv, VALUE self)
|
|
970
981
|
* for binary.
|
971
982
|
*
|
972
983
|
* If the optional code block is given, it will be passed <i>result</i> as an argument,
|
973
|
-
* and the
|
984
|
+
* and the PG::Result object will automatically be cleared when the block terminates.
|
974
985
|
* In this instance, <code>conn.exec_prepared</code> returns the value of the block.
|
975
986
|
*/
|
976
987
|
static VALUE
|
@@ -1063,8 +1074,8 @@ pgconn_exec_prepared(int argc, VALUE *argv, VALUE self)
|
|
1063
1074
|
xfree(paramLengths);
|
1064
1075
|
xfree(paramFormats);
|
1065
1076
|
|
1066
|
-
rb_pgresult = pg_new_result(result,
|
1067
|
-
|
1077
|
+
rb_pgresult = pg_new_result(result, self);
|
1078
|
+
pg_result_check(rb_pgresult);
|
1068
1079
|
if (rb_block_given_p()) {
|
1069
1080
|
return rb_ensure(rb_yield, rb_pgresult,
|
1070
1081
|
pg_result_clear, rb_pgresult);
|
@@ -1074,7 +1085,7 @@ pgconn_exec_prepared(int argc, VALUE *argv, VALUE self)
|
|
1074
1085
|
|
1075
1086
|
/*
|
1076
1087
|
* call-seq:
|
1077
|
-
* conn.describe_prepared( statement_name ) ->
|
1088
|
+
* conn.describe_prepared( statement_name ) -> PG::Result
|
1078
1089
|
*
|
1079
1090
|
* Retrieve information about the prepared statement
|
1080
1091
|
* _statement_name_.
|
@@ -1094,15 +1105,15 @@ pgconn_describe_prepared(VALUE self, VALUE stmt_name)
|
|
1094
1105
|
stmt = StringValuePtr(stmt_name);
|
1095
1106
|
}
|
1096
1107
|
result = PQdescribePrepared(conn, stmt);
|
1097
|
-
rb_pgresult = pg_new_result(result,
|
1098
|
-
|
1108
|
+
rb_pgresult = pg_new_result(result, self);
|
1109
|
+
pg_result_check(rb_pgresult);
|
1099
1110
|
return rb_pgresult;
|
1100
1111
|
}
|
1101
1112
|
|
1102
1113
|
|
1103
1114
|
/*
|
1104
1115
|
* call-seq:
|
1105
|
-
* conn.describe_portal( portal_name ) ->
|
1116
|
+
* conn.describe_portal( portal_name ) -> PG::Result
|
1106
1117
|
*
|
1107
1118
|
* Retrieve information about the portal _portal_name_.
|
1108
1119
|
*/
|
@@ -1122,17 +1133,17 @@ pgconn_describe_portal(self, stmt_name)
|
|
1122
1133
|
stmt = StringValuePtr(stmt_name);
|
1123
1134
|
}
|
1124
1135
|
result = PQdescribePortal(conn, stmt);
|
1125
|
-
rb_pgresult = pg_new_result(result,
|
1126
|
-
|
1136
|
+
rb_pgresult = pg_new_result(result, self);
|
1137
|
+
pg_result_check(rb_pgresult);
|
1127
1138
|
return rb_pgresult;
|
1128
1139
|
}
|
1129
1140
|
|
1130
1141
|
|
1131
1142
|
/*
|
1132
1143
|
* call-seq:
|
1133
|
-
* conn.make_empty_pgresult( status ) ->
|
1144
|
+
* conn.make_empty_pgresult( status ) -> PG::Result
|
1134
1145
|
*
|
1135
|
-
* Constructs and empty
|
1146
|
+
* Constructs and empty PG::Result with status _status_.
|
1136
1147
|
* _status_ may be one of:
|
1137
1148
|
* * +PGRES_EMPTY_QUERY+
|
1138
1149
|
* * +PGRES_COMMAND_OK+
|
@@ -1142,6 +1153,7 @@ pgconn_describe_portal(self, stmt_name)
|
|
1142
1153
|
* * +PGRES_BAD_RESPONSE+
|
1143
1154
|
* * +PGRES_NONFATAL_ERROR+
|
1144
1155
|
* * +PGRES_FATAL_ERROR+
|
1156
|
+
* * +PGRES_COPY_BOTH+
|
1145
1157
|
*/
|
1146
1158
|
static VALUE
|
1147
1159
|
pgconn_make_empty_pgresult(VALUE self, VALUE status)
|
@@ -1150,8 +1162,8 @@ pgconn_make_empty_pgresult(VALUE self, VALUE status)
|
|
1150
1162
|
VALUE rb_pgresult;
|
1151
1163
|
PGconn *conn = pg_get_pgconn(self);
|
1152
1164
|
result = PQmakeEmptyPGresult(conn, NUM2INT(status));
|
1153
|
-
rb_pgresult = pg_new_result(result,
|
1154
|
-
|
1165
|
+
rb_pgresult = pg_new_result(result, self);
|
1166
|
+
pg_result_check(rb_pgresult);
|
1155
1167
|
return rb_pgresult;
|
1156
1168
|
}
|
1157
1169
|
|
@@ -1290,13 +1302,79 @@ pgconn_s_unescape_bytea(VALUE self, VALUE str)
|
|
1290
1302
|
return ret;
|
1291
1303
|
}
|
1292
1304
|
|
1305
|
+
#ifdef HAVE_PQESCAPELITERAL
|
1306
|
+
/*
|
1307
|
+
* call-seq:
|
1308
|
+
* conn.escape_literal( str ) -> String
|
1309
|
+
*
|
1310
|
+
* Escape an arbitrary String +str+ as a literal.
|
1311
|
+
*/
|
1312
|
+
static VALUE
|
1313
|
+
pgconn_escape_literal(VALUE self, VALUE string)
|
1314
|
+
{
|
1315
|
+
PGconn *conn = pg_get_pgconn(self);
|
1316
|
+
char *escaped = NULL;
|
1317
|
+
VALUE error;
|
1318
|
+
VALUE result = Qnil;
|
1319
|
+
|
1320
|
+
Check_Type(string, T_STRING);
|
1321
|
+
|
1322
|
+
escaped = PQescapeLiteral(conn, RSTRING_PTR(string), RSTRING_LEN(string));
|
1323
|
+
if (escaped == NULL)
|
1324
|
+
{
|
1325
|
+
error = rb_exc_new2(rb_ePGerror, PQerrorMessage(conn));
|
1326
|
+
rb_iv_set(error, "@connection", self);
|
1327
|
+
rb_exc_raise(error);
|
1328
|
+
return Qnil;
|
1329
|
+
}
|
1330
|
+
result = rb_str_new2(escaped);
|
1331
|
+
PQfreemem(escaped);
|
1332
|
+
OBJ_INFECT(result, string);
|
1333
|
+
|
1334
|
+
return result;
|
1335
|
+
}
|
1336
|
+
#endif
|
1337
|
+
|
1338
|
+
#ifdef HAVE_PQESCAPEIDENTIFIER
|
1339
|
+
/*
|
1340
|
+
* call-seq:
|
1341
|
+
* conn.escape_identifier( str ) -> String
|
1342
|
+
*
|
1343
|
+
* Escape an arbitrary String +str+ as an identifier.
|
1344
|
+
*/
|
1345
|
+
static VALUE
|
1346
|
+
pgconn_escape_identifier(VALUE self, VALUE string)
|
1347
|
+
{
|
1348
|
+
PGconn *conn = pg_get_pgconn(self);
|
1349
|
+
char *escaped = NULL;
|
1350
|
+
VALUE error;
|
1351
|
+
VALUE result = Qnil;
|
1352
|
+
|
1353
|
+
Check_Type(string, T_STRING);
|
1354
|
+
|
1355
|
+
escaped = PQescapeIdentifier(conn, RSTRING_PTR(string), RSTRING_LEN(string));
|
1356
|
+
if (escaped == NULL)
|
1357
|
+
{
|
1358
|
+
error = rb_exc_new2(rb_ePGerror, PQerrorMessage(conn));
|
1359
|
+
rb_iv_set(error, "@connection", self);
|
1360
|
+
rb_exc_raise(error);
|
1361
|
+
return Qnil;
|
1362
|
+
}
|
1363
|
+
result = rb_str_new2(escaped);
|
1364
|
+
PQfreemem(escaped);
|
1365
|
+
OBJ_INFECT(result, string);
|
1366
|
+
|
1367
|
+
return result;
|
1368
|
+
}
|
1369
|
+
#endif
|
1370
|
+
|
1293
1371
|
/*
|
1294
1372
|
* call-seq:
|
1295
1373
|
* conn.send_query(sql [, params, result_format ] ) -> nil
|
1296
1374
|
*
|
1297
1375
|
* Sends SQL query request specified by _sql_ to PostgreSQL for
|
1298
1376
|
* asynchronous processing, and immediately returns.
|
1299
|
-
* On failure, it raises a
|
1377
|
+
* On failure, it raises a PG::Error.
|
1300
1378
|
*
|
1301
1379
|
* +params+ is an optional array of the bind parameters for the SQL query.
|
1302
1380
|
* Each element of the +params+ array may be either:
|
@@ -1442,7 +1520,7 @@ pgconn_send_query(int argc, VALUE *argv, VALUE self)
|
|
1442
1520
|
*
|
1443
1521
|
* Prepares statement _sql_ with name _name_ to be executed later.
|
1444
1522
|
* Sends prepare command asynchronously, and returns immediately.
|
1445
|
-
* On failure, it raises a
|
1523
|
+
* On failure, it raises a PG::Error.
|
1446
1524
|
*
|
1447
1525
|
* +param_types+ is an optional parameter to specify the Oids of the
|
1448
1526
|
* types of the parameters.
|
@@ -1505,7 +1583,7 @@ pgconn_send_prepare(int argc, VALUE *argv, VALUE self)
|
|
1505
1583
|
*
|
1506
1584
|
* Execute prepared named statement specified by _statement_name_
|
1507
1585
|
* asynchronously, and returns immediately.
|
1508
|
-
* On failure, it raises a
|
1586
|
+
* On failure, it raises a PG::Error.
|
1509
1587
|
*
|
1510
1588
|
* +params+ is an array of the optional bind parameters for the
|
1511
1589
|
* SQL query. Each element of the +params+ array may be either:
|
@@ -1667,7 +1745,7 @@ pgconn_send_describe_portal(VALUE self, VALUE portal)
|
|
1667
1745
|
|
1668
1746
|
/*
|
1669
1747
|
* call-seq:
|
1670
|
-
* conn.get_result() ->
|
1748
|
+
* conn.get_result() -> PG::Result
|
1671
1749
|
* conn.get_result() {|pg_result| block }
|
1672
1750
|
*
|
1673
1751
|
* Blocks waiting for the next result from a call to
|
@@ -1678,7 +1756,7 @@ pgconn_send_describe_portal(VALUE self, VALUE portal)
|
|
1678
1756
|
* you will not be able to issue further commands.
|
1679
1757
|
*
|
1680
1758
|
* If the optional code block is given, it will be passed <i>result</i> as an argument,
|
1681
|
-
* and the
|
1759
|
+
* and the PG::Result object will automatically be cleared when the block terminates.
|
1682
1760
|
* In this instance, <code>conn.exec</code> returns the value of the block.
|
1683
1761
|
*/
|
1684
1762
|
static VALUE
|
@@ -1691,7 +1769,7 @@ pgconn_get_result(VALUE self)
|
|
1691
1769
|
result = PQgetResult(conn);
|
1692
1770
|
if(result == NULL)
|
1693
1771
|
return Qnil;
|
1694
|
-
rb_pgresult = pg_new_result(result,
|
1772
|
+
rb_pgresult = pg_new_result(result, self);
|
1695
1773
|
if (rb_block_given_p()) {
|
1696
1774
|
return rb_ensure(rb_yield, rb_pgresult,
|
1697
1775
|
pg_result_clear, rb_pgresult);
|
@@ -1797,7 +1875,7 @@ pgconn_isnonblocking(self)
|
|
1797
1875
|
* Returns +true+ if data is successfully flushed, +false+
|
1798
1876
|
* if not (can only return +false+ if connection is
|
1799
1877
|
* nonblocking.
|
1800
|
-
* Raises
|
1878
|
+
* Raises PG::Error if some other failure occurred.
|
1801
1879
|
*/
|
1802
1880
|
static VALUE
|
1803
1881
|
pgconn_flush(self)
|
@@ -2243,7 +2321,7 @@ notice_receiver_proxy(void *arg, const PGresult *result)
|
|
2243
2321
|
* the work in the notice receiver.
|
2244
2322
|
*
|
2245
2323
|
* This function takes a new block to act as the handler, which should
|
2246
|
-
* accept a single parameter that will be a
|
2324
|
+
* accept a single parameter that will be a PG::Result object, and returns
|
2247
2325
|
* the Proc object previously set, or +nil+ if it was previously the default.
|
2248
2326
|
*
|
2249
2327
|
* If you pass no arguments, it will reset the handler to the default.
|
@@ -2387,19 +2465,19 @@ pgconn_transaction(VALUE self)
|
|
2387
2465
|
|
2388
2466
|
if (rb_block_given_p()) {
|
2389
2467
|
result = PQexec(conn, "BEGIN");
|
2390
|
-
rb_pgresult = pg_new_result(result,
|
2391
|
-
|
2468
|
+
rb_pgresult = pg_new_result(result, self);
|
2469
|
+
pg_result_check(rb_pgresult);
|
2392
2470
|
rb_protect(rb_yield, self, &status);
|
2393
2471
|
if(status == 0) {
|
2394
2472
|
result = PQexec(conn, "COMMIT");
|
2395
|
-
rb_pgresult = pg_new_result(result,
|
2396
|
-
|
2473
|
+
rb_pgresult = pg_new_result(result, self);
|
2474
|
+
pg_result_check(rb_pgresult);
|
2397
2475
|
}
|
2398
2476
|
else {
|
2399
2477
|
/* exception occurred, ROLLBACK and re-raise */
|
2400
2478
|
result = PQexec(conn, "ROLLBACK");
|
2401
|
-
rb_pgresult = pg_new_result(result,
|
2402
|
-
|
2479
|
+
rb_pgresult = pg_new_result(result, self);
|
2480
|
+
pg_result_check(rb_pgresult);
|
2403
2481
|
rb_jump_tag(status);
|
2404
2482
|
}
|
2405
2483
|
|
@@ -2664,7 +2742,7 @@ pgconn_block( int argc, VALUE *argv, VALUE self ) {
|
|
2664
2742
|
|
2665
2743
|
/*
|
2666
2744
|
* call-seq:
|
2667
|
-
* conn.get_last_result( ) ->
|
2745
|
+
* conn.get_last_result( ) -> PG::Result
|
2668
2746
|
*
|
2669
2747
|
* This function retrieves all available results
|
2670
2748
|
* on the current connection (from previously issued
|
@@ -2697,8 +2775,8 @@ pgconn_get_last_result(VALUE self)
|
|
2697
2775
|
}
|
2698
2776
|
|
2699
2777
|
if (prev) {
|
2700
|
-
rb_pgresult = pg_new_result(prev,
|
2701
|
-
|
2778
|
+
rb_pgresult = pg_new_result( prev, self );
|
2779
|
+
pg_result_check(rb_pgresult);
|
2702
2780
|
}
|
2703
2781
|
|
2704
2782
|
return rb_pgresult;
|
@@ -2707,7 +2785,7 @@ pgconn_get_last_result(VALUE self)
|
|
2707
2785
|
|
2708
2786
|
/*
|
2709
2787
|
* call-seq:
|
2710
|
-
* conn.async_exec(sql [, params, result_format ] ) ->
|
2788
|
+
* conn.async_exec(sql [, params, result_format ] ) -> PG::Result
|
2711
2789
|
* conn.async_exec(sql [, params, result_format ] ) {|pg_result| block }
|
2712
2790
|
*
|
2713
2791
|
* This function has the same behavior as #exec,
|
@@ -2745,7 +2823,7 @@ pgconn_async_exec(int argc, VALUE *argv, VALUE self)
|
|
2745
2823
|
* conn.lo_creat( [mode] ) -> Fixnum
|
2746
2824
|
*
|
2747
2825
|
* Creates a large object with mode _mode_. Returns a large object Oid.
|
2748
|
-
* On failure, it raises
|
2826
|
+
* On failure, it raises PG::Error.
|
2749
2827
|
*/
|
2750
2828
|
static VALUE
|
2751
2829
|
pgconn_locreat(int argc, VALUE *argv, VALUE self)
|
@@ -2772,7 +2850,7 @@ pgconn_locreat(int argc, VALUE *argv, VALUE self)
|
|
2772
2850
|
* conn.lo_create( oid ) -> Fixnum
|
2773
2851
|
*
|
2774
2852
|
* Creates a large object with oid _oid_. Returns the large object Oid.
|
2775
|
-
* On failure, it raises
|
2853
|
+
* On failure, it raises PG::Error.
|
2776
2854
|
*/
|
2777
2855
|
static VALUE
|
2778
2856
|
pgconn_locreate(VALUE self, VALUE in_lo_oid)
|
@@ -2794,7 +2872,7 @@ pgconn_locreate(VALUE self, VALUE in_lo_oid)
|
|
2794
2872
|
*
|
2795
2873
|
* Import a file to a large object. Returns a large object Oid.
|
2796
2874
|
*
|
2797
|
-
* On failure, it raises a
|
2875
|
+
* On failure, it raises a PG::Error.
|
2798
2876
|
*/
|
2799
2877
|
static VALUE
|
2800
2878
|
pgconn_loimport(VALUE self, VALUE filename)
|
@@ -3107,9 +3185,8 @@ pgconn_internal_encoding_set(VALUE self, VALUE enc)
|
|
3107
3185
|
* call-seq:
|
3108
3186
|
* conn.external_encoding() -> Encoding
|
3109
3187
|
*
|
3110
|
-
*
|
3111
|
-
*
|
3112
|
-
* - Maps 'SQL_ASCII' to ASCII-8BIT.
|
3188
|
+
* Return the +server_encoding+ of the connected database as a Ruby Encoding object.
|
3189
|
+
* The <tt>SQL_ASCII</tt> encoding is mapped to to <tt>ASCII_8BIT</tt>.
|
3113
3190
|
*/
|
3114
3191
|
static VALUE
|
3115
3192
|
pgconn_external_encoding(VALUE self)
|
@@ -3131,6 +3208,35 @@ pgconn_external_encoding(VALUE self)
|
|
3131
3208
|
return encoding;
|
3132
3209
|
}
|
3133
3210
|
|
3211
|
+
|
3212
|
+
|
3213
|
+
/*
|
3214
|
+
* call-seq:
|
3215
|
+
* conn.set_default_encoding() -> Encoding
|
3216
|
+
*
|
3217
|
+
* If Ruby has its Encoding.default_internal set, set PostgreSQL's client_encoding
|
3218
|
+
* to match. Returns the new Encoding, or +nil+ if the default internal encoding
|
3219
|
+
* wasn't set.
|
3220
|
+
*/
|
3221
|
+
static VALUE
|
3222
|
+
pgconn_set_default_encoding( VALUE self )
|
3223
|
+
{
|
3224
|
+
PGconn *conn = pg_get_pgconn( self );
|
3225
|
+
rb_encoding *enc;
|
3226
|
+
const char *encname;
|
3227
|
+
|
3228
|
+
if (( enc = rb_default_internal_encoding() )) {
|
3229
|
+
encname = pg_get_rb_encoding_as_pg_encoding( enc );
|
3230
|
+
if ( PQsetClientEncoding(conn, encname) != 0 )
|
3231
|
+
rb_warn( "Failed to set the default_internal encoding to %s: '%s'",
|
3232
|
+
encname, PQerrorMessage(conn) );
|
3233
|
+
return rb_enc_from_encoding( enc );
|
3234
|
+
} else {
|
3235
|
+
return Qnil;
|
3236
|
+
}
|
3237
|
+
}
|
3238
|
+
|
3239
|
+
|
3134
3240
|
#endif /* M17N_SUPPORTED */
|
3135
3241
|
|
3136
3242
|
|
@@ -3152,11 +3258,13 @@ init_pg_connection()
|
|
3152
3258
|
SINGLETON_ALIAS(rb_cPGconn, "escape", "escape_string");
|
3153
3259
|
rb_define_singleton_method(rb_cPGconn, "escape_bytea", pgconn_s_escape_bytea, 1);
|
3154
3260
|
rb_define_singleton_method(rb_cPGconn, "unescape_bytea", pgconn_s_unescape_bytea, 1);
|
3155
|
-
rb_define_singleton_method(rb_cPGconn, "isthreadsafe", pgconn_s_isthreadsafe, 0);
|
3156
3261
|
rb_define_singleton_method(rb_cPGconn, "encrypt_password", pgconn_s_encrypt_password, 2);
|
3157
3262
|
rb_define_singleton_method(rb_cPGconn, "quote_ident", pgconn_s_quote_ident, 1);
|
3158
3263
|
rb_define_singleton_method(rb_cPGconn, "connect_start", pgconn_s_connect_start, -1);
|
3159
3264
|
rb_define_singleton_method(rb_cPGconn, "conndefaults", pgconn_s_conndefaults, 0);
|
3265
|
+
#ifdef HAVE_PQPING
|
3266
|
+
rb_define_singleton_method(rb_cPGconn, "ping", pgconn_s_ping, -1);
|
3267
|
+
#endif
|
3160
3268
|
|
3161
3269
|
/****** PG::Connection INSTANCE METHODS: Connection Control ******/
|
3162
3270
|
rb_define_method(rb_cPGconn, "initialize", pgconn_init, -1);
|
@@ -3199,6 +3307,12 @@ init_pg_connection()
|
|
3199
3307
|
rb_define_method(rb_cPGconn, "make_empty_pgresult", pgconn_make_empty_pgresult, 1);
|
3200
3308
|
rb_define_method(rb_cPGconn, "escape_string", pgconn_s_escape, 1);
|
3201
3309
|
rb_define_alias(rb_cPGconn, "escape", "escape_string");
|
3310
|
+
#ifdef HAVE_PQESCAPELITERAL
|
3311
|
+
rb_define_method(rb_cPGconn, "escape_literal", pgconn_escape_literal, 1);
|
3312
|
+
#endif
|
3313
|
+
#ifdef HAVE_PQESCAPEIDENTIFIER
|
3314
|
+
rb_define_method(rb_cPGconn, "escape_identifier", pgconn_escape_identifier, 1);
|
3315
|
+
#endif
|
3202
3316
|
rb_define_method(rb_cPGconn, "escape_bytea", pgconn_s_escape_bytea, 1);
|
3203
3317
|
rb_define_method(rb_cPGconn, "unescape_bytea", pgconn_s_unescape_bytea, 1);
|
3204
3318
|
|
@@ -3281,6 +3395,7 @@ init_pg_connection()
|
|
3281
3395
|
rb_define_method(rb_cPGconn, "internal_encoding", pgconn_internal_encoding, 0);
|
3282
3396
|
rb_define_method(rb_cPGconn, "internal_encoding=", pgconn_internal_encoding_set, 1);
|
3283
3397
|
rb_define_method(rb_cPGconn, "external_encoding", pgconn_external_encoding, 0);
|
3398
|
+
rb_define_method(rb_cPGconn, "set_default_encoding", pgconn_set_default_encoding, 0);
|
3284
3399
|
#endif /* M17N_SUPPORTED */
|
3285
3400
|
|
3286
3401
|
}
|