pg 0.17.0 → 0.17.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 82f24c3c723c5c426929fd7c14b784f8db43fccc
4
- data.tar.gz: 3ce6e0d944af02a3283c2d51588e988df89da216
3
+ metadata.gz: 76e0a053a21b6714395f5ccf1bd43c9caa235584
4
+ data.tar.gz: 6d1021ba6991c151049c33f0963f22c5c1262a75
5
5
  SHA512:
6
- metadata.gz: eb683af0ecf1711e19a5e497e63d7ca5fe08180db99b373fdbd9e0167d3930bfb55de6fe37f116a0e8d3c520741bef019ebcc15993da905eceb495c03ec23c31
7
- data.tar.gz: e7255b4ce2802d0b97b4af8fe3a5715bfbffc2aee7d454b1c6bd6eec8b82aa711212467ca0b99a6614355b8ad1f101b9075f443b88d36e648aa0251848923b3f
6
+ metadata.gz: 3b91c230861ffd1e08fd835ce16245f9abe9344f435f558fbd8987cf6db81255473445a0ea7c1cbb8f602f2eb6bd2ea1ac446cfba484939bb9635ba67ef4060b
7
+ data.tar.gz: 3219c6f4aaebb9ba597e1ae772b74edb19e27b80f1f60c16537a85f4790e427d040ebfdd46d8e44a626994a5599cdbf9fc82ce3ab269c5f3b7b77b5a80fccc3c
Binary file
data.tar.gz.sig CHANGED
@@ -1,2 +1 @@
1
- 2+��Ѣ���"����M5��c&��X��� AI�9�\�7xhn�4G�1=(�0R�)#O���#z …S`|,�\$�\�\�K�ԓ�G
2
- |7^`�^6�ui��&�ه^(K���E�;R�ZO1V�>�g�L4=�ZL���Zřw�[�\7h�B���)l/��J;F�X�V�"�+Py\�Ė&�g��b&<Qj8.Ū��SY
1
+ ��8�2 vp� �֜W��j�х��"aGiN
data/ChangeLog CHANGED
@@ -1,8 +1,83 @@
1
+ 2013-12-17 Lars Kanis <kanis@comcard.de>
2
+
3
+ * History.rdoc:
4
+ Update History file
5
+ [ebd0e140f78d] [tip]
6
+
7
+ 2013-12-16 larskanis <lars@greiz-reinsdorf.de>
8
+
9
+ * Close branch revert_query_cancel_on_ubf
10
+ [cddad8917d19] <revert_query_cancel_on_ubf>
11
+
12
+ * Merged in larskanis/ruby-pg/revert_query_cancel_on_ubf (pull request
13
+ #18)
14
+
15
+ Revert commit e0492d4 "Ensure a query is canceled, if a thread is
16
+ about to be killed."
17
+ [93a8aedecd05]
18
+
19
+ 2013-12-09 Lars Kanis <kanis@comcard.de>
20
+
21
+ * spec/pg/connection_spec.rb:
22
+ Add test case for compatibility with signal handlers. See 97c3ec2.
23
+ [1e974a370012] <revert_query_cancel_on_ubf>
24
+
25
+ * ext/gvl_wrappers.c, ext/gvl_wrappers.h, ext/pg_connection.c,
26
+ spec/pg/connection_spec.rb:
27
+ Revert commit e0492d4 "Ensure a query is canceled, if a thread is
28
+ about to be killed."
29
+
30
+ This is due to this discussion: https://groups.google.com/d/topic
31
+ /ruby-pg/5_ylGmog1S4/discussion
32
+
33
+ We were using rb_thread_call_without_gvl() with an ubf which
34
+ canceled the query currently being processed. This turned out to be
35
+ incompatible with possibly registered signal handlers (by
36
+ Signal.trap). A ubf is unconditionally invoked if ANY signal fires
37
+ on a process (eg even: USR1 or PROF) and Ruby has handlers
38
+ registered. Cancelling queries in those conditions does no make
39
+ sense.
40
+
41
+ This commit re-enables Connection#async_exec based on the async API
42
+ for all ruby versions, because async_exec allowes cancelation of
43
+ queries by signals like Control+C.
44
+
45
+ Thanks to Sam Saffron for highlighting this issue.
46
+ [97c3ec224be9] <revert_query_cancel_on_ubf>
47
+
48
+ 2013-09-23 Michael Granger <ged@FaerieMUD.org>
49
+
50
+ * ext/pg_connection.c, lib/pg/connection.rb:
51
+ Fix documentation for PG::Connection::conndefaults.
52
+ [9812218e0654] [github/master]
53
+
54
+ 2013-09-20 Lars Kanis <lars@greiz-reinsdorf.de>
55
+
56
+ * ext/gvl_wrappers.h, ext/pg_connection.c:
57
+ Wrap PQcancel to be called without GVL. It internally waits for
58
+ close of the connection to be canceled.
59
+ [0ed6451d10a5]
60
+
61
+ 2013-09-16 Michael Granger <ged@FaerieMUD.org>
62
+
63
+ * .hgtags:
64
+ Added tag v0.17.0 for changeset 30da9c169efc
65
+ [46f35f5b396e]
66
+
67
+ * .hgsigs:
68
+ Added signature for changeset eed93df350a6
69
+ [30da9c169efc] [v0.17.0]
70
+
71
+ * .hoerc:
72
+ Add the Gemfile to the list of files that don't have to be on the
73
+ Manifest.
74
+ [eed93df350a6]
75
+
1
76
  2013-09-15 Michael Granger <ged@FaerieMUD.org>
2
77
 
3
78
  * History.rdoc, lib/pg.rb:
4
79
  Bump minor version
5
- [7cdff0a462e5] [tip]
80
+ [7cdff0a462e5]
6
81
 
7
82
  2013-09-14 Lars Kanis <lars@greiz-reinsdorf.de>
8
83
 
@@ -79,7 +154,7 @@
79
154
  compilation platform.
80
155
 
81
156
  This is 'i586-mingw32msvc-gcc' versus 'i586-pc-mingw32msvc'.
82
- [fbee9586e8f7] [github/master]
157
+ [fbee9586e8f7]
83
158
 
84
159
  2013-08-14 Lars Kanis <lars@greiz-reinsdorf.de>
85
160
 
@@ -1,3 +1,19 @@
1
+ == v0.17.1 [2013-12-18] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Bugfixes:
4
+
5
+ - Fix compatibility with signal handlers defined in Ruby. This reverts
6
+ cancelation of queries running on top of the blocking libpq API (like
7
+ Connection#exec) in case of signals. As an alternative the #async_exec
8
+ can be used, which is reverted to use the non-blocking API, again.
9
+ - Wrap PQcancel to be called without GVL. It internally waits for
10
+ the canceling connection.
11
+
12
+ Documentation fixes:
13
+
14
+ - Fix documentation for PG::Connection::conndefaults.
15
+
16
+
1
17
  == v0.17.0 [2013-09-15] Michael Granger <ged@FaerieMUD.org>
2
18
 
3
19
  Bugfixes:
@@ -11,9 +11,3 @@ FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB );
11
11
  FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVL_WRAPPER_STRUCT );
12
12
  FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_SKELETON );
13
13
  FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_STUB );
14
-
15
- void ubf_cancel_running_command(void *c)
16
- {
17
- PGconn *conn = (PGconn*) c;
18
- PQrequestCancel(conn);
19
- }
@@ -24,8 +24,6 @@ extern void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
24
24
  rb_unblock_function_t *ubf, void *data2);
25
25
  #endif
26
26
 
27
- void ubf_cancel_running_command(void *c);
28
-
29
27
  #define DEFINE_PARAM_LIST1(type, name) \
30
28
  name,
31
29
 
@@ -38,7 +36,7 @@ void ubf_cancel_running_command(void *c);
38
36
  #define DEFINE_PARAM_DECL(type, name) \
39
37
  type name;
40
38
 
41
- #define DEFINE_GVL_WRAPPER_STRUCT(name, cancel_params, when_non_void, rettype, lastparamtype, lastparamname) \
39
+ #define DEFINE_GVL_WRAPPER_STRUCT(name, when_non_void, rettype, lastparamtype, lastparamname) \
42
40
  struct gvl_wrapper_##name##_params { \
43
41
  struct { \
44
42
  FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_DECL) \
@@ -47,7 +45,7 @@ void ubf_cancel_running_command(void *c);
47
45
  when_non_void( rettype retval; ) \
48
46
  };
49
47
 
50
- #define DEFINE_GVL_SKELETON(name, cancel_params, when_non_void, rettype, lastparamtype, lastparamname) \
48
+ #define DEFINE_GVL_SKELETON(name, when_non_void, rettype, lastparamtype, lastparamname) \
51
49
  static void * gvl_##name##_skeleton( void *data ){ \
52
50
  struct gvl_wrapper_##name##_params *p = (struct gvl_wrapper_##name##_params*)data; \
53
51
  when_non_void( p->retval = ) \
@@ -56,25 +54,25 @@ void ubf_cancel_running_command(void *c);
56
54
  }
57
55
 
58
56
  #if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
59
- #define DEFINE_GVL_STUB(name, cancel_params, when_non_void, rettype, lastparamtype, lastparamname) \
57
+ #define DEFINE_GVL_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
60
58
  rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
61
59
  struct gvl_wrapper_##name##_params params = { \
62
60
  {FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST1) lastparamname}, when_non_void((rettype)0) \
63
61
  }; \
64
- rb_thread_call_without_gvl(gvl_##name##_skeleton, &params, cancel_params); \
62
+ rb_thread_call_without_gvl(gvl_##name##_skeleton, &params, RUBY_UBF_IO, 0); \
65
63
  when_non_void( return params.retval; ) \
66
64
  }
67
65
  #else
68
- #define DEFINE_GVL_STUB(name, cancel_params, when_non_void, rettype, lastparamtype, lastparamname) \
66
+ #define DEFINE_GVL_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
69
67
  rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
70
68
  return name( FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST1) lastparamname ); \
71
69
  }
72
70
  #endif
73
71
 
74
- #define DEFINE_GVL_STUB_DECL(name, cancel_params, when_non_void, rettype, lastparamtype, lastparamname) \
72
+ #define DEFINE_GVL_STUB_DECL(name, when_non_void, rettype, lastparamtype, lastparamname) \
75
73
  rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname);
76
74
 
77
- #define DEFINE_GVLCB_SKELETON(name, cancel_params, when_non_void, rettype, lastparamtype, lastparamname) \
75
+ #define DEFINE_GVLCB_SKELETON(name, when_non_void, rettype, lastparamtype, lastparamname) \
78
76
  static void * gvl_##name##_skeleton( void *data ){ \
79
77
  struct gvl_wrapper_##name##_params *p = (struct gvl_wrapper_##name##_params*)data; \
80
78
  when_non_void( p->retval = ) \
@@ -83,7 +81,7 @@ void ubf_cancel_running_command(void *c);
83
81
  }
84
82
 
85
83
  #if defined(HAVE_RB_THREAD_CALL_WITH_GVL)
86
- #define DEFINE_GVLCB_STUB(name, cancel_params, when_non_void, rettype, lastparamtype, lastparamname) \
84
+ #define DEFINE_GVLCB_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
87
85
  rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
88
86
  struct gvl_wrapper_##name##_params params = { \
89
87
  {FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST1) lastparamname}, when_non_void((rettype)0) \
@@ -92,7 +90,7 @@ void ubf_cancel_running_command(void *c);
92
90
  when_non_void( return params.retval; ) \
93
91
  }
94
92
  #else
95
- #define DEFINE_GVLCB_STUB(name, cancel_params, when_non_void, rettype, lastparamtype, lastparamname) \
93
+ #define DEFINE_GVLCB_STUB(name, when_non_void, rettype, lastparamtype, lastparamname) \
96
94
  rettype gvl_##name(FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST3) lastparamtype lastparamname){ \
97
95
  return name( FOR_EACH_PARAM_OF_##name(DEFINE_PARAM_LIST1) lastparamname ); \
98
96
  }
@@ -101,9 +99,6 @@ void ubf_cancel_running_command(void *c);
101
99
  #define GVL_TYPE_VOID(string)
102
100
  #define GVL_TYPE_NONVOID(string) string
103
101
 
104
- #define GVL_CANCELABLE ubf_cancel_running_command, conn
105
- #define GVL_NONCANCELABLE RUBY_UBF_IO, 0
106
-
107
102
 
108
103
  /*
109
104
  * Definitions of blocking functions and their parameters
@@ -202,32 +197,37 @@ void ubf_cancel_running_command(void *c);
202
197
 
203
198
  #define FOR_EACH_PARAM_OF_PQisBusy(param)
204
199
 
205
- /* function( name, cancel, void_or_nonvoid, returntype, lastparamtype, lastparamname ) */
200
+ #define FOR_EACH_PARAM_OF_PQcancel(param) \
201
+ param(PGcancel *, cancel) \
202
+ param(char *, errbuf)
203
+
204
+ /* function( name, void_or_nonvoid, returntype, lastparamtype, lastparamname ) */
206
205
  #define FOR_EACH_BLOCKING_FUNCTION(function) \
207
- function(PQconnectdb, GVL_NONCANCELABLE, GVL_TYPE_NONVOID, PGconn *, const char *, conninfo) \
208
- function(PQconnectStart, GVL_NONCANCELABLE, GVL_TYPE_NONVOID, PGconn *, const char *, conninfo) \
209
- function(PQconnectPoll, GVL_CANCELABLE, GVL_TYPE_NONVOID, PostgresPollingStatusType, PGconn *, conn) \
210
- function(PQreset, GVL_CANCELABLE, GVL_TYPE_VOID, void, PGconn *, conn) \
211
- function(PQresetStart, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, PGconn *, conn) \
212
- function(PQresetPoll, GVL_CANCELABLE, GVL_TYPE_NONVOID, PostgresPollingStatusType, PGconn *, conn) \
213
- function(PQexec, GVL_CANCELABLE, GVL_TYPE_NONVOID, PGresult *, const char *, command) \
214
- function(PQexecParams, GVL_CANCELABLE, GVL_TYPE_NONVOID, PGresult *, int, resultFormat) \
215
- function(PQexecPrepared, GVL_CANCELABLE, GVL_TYPE_NONVOID, PGresult *, int, resultFormat) \
216
- function(PQprepare, GVL_CANCELABLE, GVL_TYPE_NONVOID, PGresult *, const Oid *, paramTypes) \
217
- function(PQdescribePrepared, GVL_CANCELABLE, GVL_TYPE_NONVOID, PGresult *, const char *, stmtName) \
218
- function(PQdescribePortal, GVL_CANCELABLE, GVL_TYPE_NONVOID, PGresult *, const char *, portalName) \
219
- function(PQgetResult, GVL_CANCELABLE, GVL_TYPE_NONVOID, PGresult *, PGconn *, conn) \
220
- function(PQputCopyData, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, int, nbytes) \
221
- function(PQputCopyEnd, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, const char *, errormsg) \
222
- function(PQgetCopyData, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, int, async) \
223
- function(PQnotifies, GVL_CANCELABLE, GVL_TYPE_NONVOID, PGnotify *, PGconn *, conn) \
224
- function(PQsendQuery, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, const char *, query) \
225
- function(PQsendQueryParams, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, int, resultFormat) \
226
- function(PQsendPrepare, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, const Oid *, paramTypes) \
227
- function(PQsendQueryPrepared, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, int, resultFormat) \
228
- function(PQsendDescribePrepared, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, const char *, stmt) \
229
- function(PQsendDescribePortal, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, const char *, portal) \
230
- function(PQisBusy, GVL_CANCELABLE, GVL_TYPE_NONVOID, int, PGconn *, conn);
206
+ function(PQconnectdb, GVL_TYPE_NONVOID, PGconn *, const char *, conninfo) \
207
+ function(PQconnectStart, GVL_TYPE_NONVOID, PGconn *, const char *, conninfo) \
208
+ function(PQconnectPoll, GVL_TYPE_NONVOID, PostgresPollingStatusType, PGconn *, conn) \
209
+ function(PQreset, GVL_TYPE_VOID, void, PGconn *, conn) \
210
+ function(PQresetStart, GVL_TYPE_NONVOID, int, PGconn *, conn) \
211
+ function(PQresetPoll, GVL_TYPE_NONVOID, PostgresPollingStatusType, PGconn *, conn) \
212
+ function(PQexec, GVL_TYPE_NONVOID, PGresult *, const char *, command) \
213
+ function(PQexecParams, GVL_TYPE_NONVOID, PGresult *, int, resultFormat) \
214
+ function(PQexecPrepared, GVL_TYPE_NONVOID, PGresult *, int, resultFormat) \
215
+ function(PQprepare, GVL_TYPE_NONVOID, PGresult *, const Oid *, paramTypes) \
216
+ function(PQdescribePrepared, GVL_TYPE_NONVOID, PGresult *, const char *, stmtName) \
217
+ function(PQdescribePortal, GVL_TYPE_NONVOID, PGresult *, const char *, portalName) \
218
+ function(PQgetResult, GVL_TYPE_NONVOID, PGresult *, PGconn *, conn) \
219
+ function(PQputCopyData, GVL_TYPE_NONVOID, int, int, nbytes) \
220
+ function(PQputCopyEnd, GVL_TYPE_NONVOID, int, const char *, errormsg) \
221
+ function(PQgetCopyData, GVL_TYPE_NONVOID, int, int, async) \
222
+ function(PQnotifies, GVL_TYPE_NONVOID, PGnotify *, PGconn *, conn) \
223
+ function(PQsendQuery, GVL_TYPE_NONVOID, int, const char *, query) \
224
+ function(PQsendQueryParams, GVL_TYPE_NONVOID, int, int, resultFormat) \
225
+ function(PQsendPrepare, GVL_TYPE_NONVOID, int, const Oid *, paramTypes) \
226
+ function(PQsendQueryPrepared, GVL_TYPE_NONVOID, int, int, resultFormat) \
227
+ function(PQsendDescribePrepared, GVL_TYPE_NONVOID, int, const char *, stmt) \
228
+ function(PQsendDescribePortal, GVL_TYPE_NONVOID, int, const char *, portal) \
229
+ function(PQisBusy, GVL_TYPE_NONVOID, int, PGconn *, conn) \
230
+ function(PQcancel, GVL_TYPE_NONVOID, int, int, errbufsize);
231
231
 
232
232
 
233
233
  FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB_DECL );
@@ -243,10 +243,10 @@ FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB_DECL );
243
243
  #define FOR_EACH_PARAM_OF_notice_receiver_proxy(param) \
244
244
  param(void *, arg)
245
245
 
246
- /* function( name, cancel, void_or_nonvoid, returntype, lastparamtype, lastparamname ) */
246
+ /* function( name, void_or_nonvoid, returntype, lastparamtype, lastparamname ) */
247
247
  #define FOR_EACH_CALLBACK_FUNCTION(function) \
248
- function(notice_processor_proxy,, GVL_TYPE_VOID, void, const char *, message) \
249
- function(notice_receiver_proxy,, GVL_TYPE_VOID, void, const PGresult *, result) \
248
+ function(notice_processor_proxy, GVL_TYPE_VOID, void, const char *, message) \
249
+ function(notice_receiver_proxy, GVL_TYPE_VOID, void, const PGresult *, result) \
250
250
 
251
251
  FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVL_STUB_DECL );
252
252
 
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * pg_connection.c - PG::Connection class extension
3
- * $Id: pg_connection.c,v d93b3ddc69ff 2013/09/07 21:12:59 lars $
3
+ * $Id: pg_connection.c,v 97c3ec224be9 2013/12/09 16:34:26 kanis $
4
4
  *
5
5
  */
6
6
 
@@ -292,7 +292,10 @@ pgconn_s_ping( int argc, VALUE *argv, VALUE klass )
292
292
  }
293
293
  #endif
294
294
 
295
+
295
296
  /*
297
+ * Document-method: conndefaults
298
+ *
296
299
  * call-seq:
297
300
  * PG::Connection.conndefaults() -> Array
298
301
  *
@@ -503,6 +506,7 @@ pgconn_reset_poll(VALUE self)
503
506
  return INT2FIX((int)status);
504
507
  }
505
508
 
509
+
506
510
  /*
507
511
  * call-seq:
508
512
  * conn.db()
@@ -838,6 +842,13 @@ static VALUE pgconn_exec_params( int, VALUE *, VALUE );
838
842
  * If the optional code block is given, it will be passed <i>result</i> as an argument,
839
843
  * and the PG::Result object will automatically be cleared when the block terminates.
840
844
  * In this instance, <code>conn.exec</code> returns the value of the block.
845
+ *
846
+ * #exec is implemented on the synchronous command processing API of libpq, whereas
847
+ * #async_exec is implemented on the asynchronous API.
848
+ * #exec is somewhat faster that #async_exec, but blocks any signals to be processed until
849
+ * the query is finished. This is most notably visible by a delayed reaction to Control+C.
850
+ * Both methods ensure that other threads can process while waiting for the server to
851
+ * complete the request.
841
852
  */
842
853
  static VALUE
843
854
  pgconn_exec(int argc, VALUE *argv, VALUE self)
@@ -2103,7 +2114,7 @@ pgconn_cancel(VALUE self)
2103
2114
  if(cancel == NULL)
2104
2115
  rb_raise(rb_ePGerror,"Invalid connection!");
2105
2116
 
2106
- ret = PQcancel(cancel, errbuf, 256);
2117
+ ret = gvl_PQcancel(cancel, errbuf, 256);
2107
2118
  if(ret == 1)
2108
2119
  retval = Qnil;
2109
2120
  else
@@ -3010,22 +3021,14 @@ pgconn_get_last_result(VALUE self)
3010
3021
  return rb_pgresult;
3011
3022
  }
3012
3023
 
3013
- #if !defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
3014
-
3015
3024
  /*
3016
3025
  * call-seq:
3017
3026
  * conn.async_exec(sql [, params, result_format ] ) -> PG::Result
3018
3027
  * conn.async_exec(sql [, params, result_format ] ) {|pg_result| block }
3019
3028
  *
3020
3029
  * This function has the same behavior as #exec,
3021
- * but ensures that other threads can process while
3022
- * waiting for the server to complete the request.
3023
- *
3024
- * On Ruby platforms with native threads (MRI-1.9+ and all others)
3025
- * this method is an alias to #exec.
3026
- *
3027
- * On MRI-1.8 it's implemented using asynchronous command
3028
- * processing and ruby's +rb_thread_select+ .
3030
+ * but is implemented using the asynchronous command
3031
+ * processing API of libpq.
3029
3032
  */
3030
3033
  static VALUE
3031
3034
  pgconn_async_exec(int argc, VALUE *argv, VALUE self)
@@ -3046,8 +3049,6 @@ pgconn_async_exec(int argc, VALUE *argv, VALUE self)
3046
3049
  return rb_pgresult;
3047
3050
  }
3048
3051
 
3049
- #endif
3050
-
3051
3052
  /**************************************************************************
3052
3053
  * LARGE OBJECT SUPPORT
3053
3054
  **************************************************************************/
@@ -3508,7 +3509,6 @@ init_pg_connection()
3508
3509
  rb_define_method(rb_cPGconn, "reset", pgconn_reset, 0);
3509
3510
  rb_define_method(rb_cPGconn, "reset_start", pgconn_reset_start, 0);
3510
3511
  rb_define_method(rb_cPGconn, "reset_poll", pgconn_reset_poll, 0);
3511
- rb_define_method(rb_cPGconn, "conndefaults", pgconn_s_conndefaults, 0);
3512
3512
  rb_define_alias(rb_cPGconn, "close", "finish");
3513
3513
 
3514
3514
  /****** PG::Connection INSTANCE METHODS: Connection Status ******/
@@ -3600,11 +3600,7 @@ init_pg_connection()
3600
3600
  rb_define_method(rb_cPGconn, "wait_for_notify", pgconn_wait_for_notify, -1);
3601
3601
  rb_define_alias(rb_cPGconn, "notifies_wait", "wait_for_notify");
3602
3602
  rb_define_method(rb_cPGconn, "quote_ident", pgconn_s_quote_ident, 1);
3603
- #if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
3604
- rb_define_alias(rb_cPGconn, "async_exec", "exec");
3605
- #else
3606
3603
  rb_define_method(rb_cPGconn, "async_exec", pgconn_async_exec, -1);
3607
- #endif
3608
3604
  rb_define_alias(rb_cPGconn, "async_query", "async_exec");
3609
3605
  rb_define_method(rb_cPGconn, "get_last_result", pgconn_get_last_result, 0);
3610
3606
 
data/lib/pg.rb CHANGED
@@ -19,10 +19,10 @@ end
19
19
  module PG
20
20
 
21
21
  # Library version
22
- VERSION = '0.17.0'
22
+ VERSION = '0.17.1'
23
23
 
24
24
  # VCS revision
25
- REVISION = %q$Revision: 7cdff0a462e5 $
25
+ REVISION = %q$Revision: 22d57e3a2b37 $
26
26
 
27
27
  class NotAllCopyDataRetrieved < PG::Error
28
28
  end
@@ -164,6 +164,14 @@ class PG::Connection
164
164
  class << self
165
165
  define_method( :isthreadsafe, &PG.method(:isthreadsafe) )
166
166
  end
167
+
168
+
169
+ ### Returns an array of Hashes with connection defaults. See ::conndefaults
170
+ ### for details.
171
+ def conndefaults
172
+ return self.class.conndefaults
173
+ end
174
+
167
175
  end # class PG::Connection
168
176
 
169
177
  # Backward-compatible alias
@@ -262,7 +262,7 @@ describe PG::Connection do
262
262
  error.should == true
263
263
  end
264
264
 
265
- it "can stop a thread that runs a blocking query" do
265
+ it "can stop a thread that runs a blocking query with async_exec" do
266
266
  start = Time.now
267
267
  t = Thread.new do
268
268
  @conn.async_exec( 'select pg_sleep(10)' )
@@ -274,6 +274,29 @@ describe PG::Connection do
274
274
  (Time.now - start).should < 10
275
275
  end
276
276
 
277
+ it "should work together with signal handlers" do
278
+ signal_received = false
279
+ trap 'USR1' do
280
+ signal_received = true
281
+ end
282
+
283
+ Thread.new do
284
+ sleep 0.1
285
+ Process.kill("USR1", Process.pid)
286
+ end
287
+ @conn.exec("select pg_sleep(0.3)")
288
+ signal_received.should be_true
289
+
290
+ signal_received = false
291
+ Thread.new do
292
+ sleep 0.1
293
+ Process.kill("USR1", Process.pid)
294
+ end
295
+ @conn.async_exec("select pg_sleep(0.3)")
296
+ signal_received.should be_true
297
+ end
298
+
299
+
277
300
  it "automatically rolls back a transaction started with Connection#transaction if an exception " +
278
301
  "is raised" do
279
302
  # abort the per-example transaction so we can test our own
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
@@ -31,7 +31,7 @@ cert_chain:
31
31
  6mKCwjpegytE0oifXfF8k75A9105cBnNiMZOe1tXiqYc/exCgWvbggurzDOcRkZu
32
32
  /YSusaiDXHKU2O3Akc3htA==
33
33
  -----END CERTIFICATE-----
34
- date: 2013-09-16 00:00:00.000000000 Z
34
+ date: 2013-12-19 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: hoe-mercurial
@@ -259,7 +259,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
259
259
  version: '0'
260
260
  requirements: []
261
261
  rubyforge_project: pg
262
- rubygems_version: 2.0.5
262
+ rubygems_version: 2.1.11
263
263
  signing_key:
264
264
  specification_version: 4
265
265
  summary: Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/]
metadata.gz.sig CHANGED
Binary file