pg 0.13.2-x86-mingw32 → 0.14.0.pre.353-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 +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
|
}
|