ruby-pg 0.7.9.2008.01.24 → 0.7.9.2008.01.28
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/pg.c +72 -9
- metadata +2 -2
data/ext/pg.c
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
modified at: Wed Jan 20 16:41:51 1999
|
10
10
|
|
11
11
|
$Author: jdavis $
|
12
|
-
$Date: 2008-01-
|
12
|
+
$Date: 2008-01-28 11:21:07 -0800 (Mon, 28 Jan 2008) $
|
13
13
|
************************************************/
|
14
14
|
|
15
15
|
#include "pg.h"
|
@@ -123,7 +123,7 @@ get_pgconn(VALUE self)
|
|
123
123
|
{
|
124
124
|
PGconn *conn;
|
125
125
|
Data_Get_Struct(self, PGconn, conn);
|
126
|
-
if (conn == NULL) rb_raise(
|
126
|
+
if (conn == NULL) rb_raise(rb_ePGError, "not connected");
|
127
127
|
return conn;
|
128
128
|
}
|
129
129
|
|
@@ -132,7 +132,7 @@ get_pgresult(VALUE self)
|
|
132
132
|
{
|
133
133
|
PGresult *result;
|
134
134
|
Data_Get_Struct(self, PGresult, result);
|
135
|
-
if (result == NULL) rb_raise(
|
135
|
+
if (result == NULL) rb_raise(rb_ePGError, "result has been cleared");
|
136
136
|
return result;
|
137
137
|
}
|
138
138
|
|
@@ -1525,20 +1525,25 @@ pgconn_send_describe_portal(self, portal)
|
|
1525
1525
|
* call-seq:
|
1526
1526
|
* conn.get_result() -> PGresult
|
1527
1527
|
*
|
1528
|
-
*
|
1529
|
-
*
|
1528
|
+
* Blocks waiting for the next result from a call to
|
1529
|
+
* +PGconn#send_query+ (or another asynchronous command),
|
1530
|
+
* and returns it. Returns +nil+ if no more results are
|
1531
|
+
* available.
|
1532
|
+
*
|
1533
|
+
* Note: call this function repeatedly until it returns +nil+,
|
1534
|
+
* or else you will not be able to issue further commands.
|
1530
1535
|
*/
|
1531
1536
|
static VALUE
|
1532
1537
|
pgconn_get_result(self)
|
1533
1538
|
VALUE self;
|
1534
1539
|
{
|
1540
|
+
PGconn *conn = get_pgconn(self);
|
1535
1541
|
PGresult *result;
|
1536
1542
|
VALUE rb_pgresult;
|
1537
|
-
|
1538
|
-
result = PQgetResult(
|
1543
|
+
|
1544
|
+
result = PQgetResult(conn);
|
1539
1545
|
if(result == NULL)
|
1540
1546
|
return Qnil;
|
1541
|
-
|
1542
1547
|
rb_pgresult = new_pgresult(result);
|
1543
1548
|
pgresult_check(self, rb_pgresult);
|
1544
1549
|
if (rb_block_given_p()) {
|
@@ -2041,6 +2046,53 @@ pgconn_block(int argc, VALUE *argv, VALUE self)
|
|
2041
2046
|
return Qtrue;
|
2042
2047
|
}
|
2043
2048
|
|
2049
|
+
/*
|
2050
|
+
* call-seq:
|
2051
|
+
* conn.get_last_result( ) -> PGresult
|
2052
|
+
*
|
2053
|
+
* This function retrieves all available results
|
2054
|
+
* on the current connection (from previously issued
|
2055
|
+
* asynchronous commands like +send_query()+) and
|
2056
|
+
* returns the last non-NULL result, or +nil+ if no
|
2057
|
+
* results are available.
|
2058
|
+
*
|
2059
|
+
* This function is similar to +PGconn#get_result+
|
2060
|
+
* except that it is designed to get one and only
|
2061
|
+
* one result.
|
2062
|
+
*/
|
2063
|
+
static VALUE
|
2064
|
+
pgconn_get_last_result(VALUE self)
|
2065
|
+
{
|
2066
|
+
VALUE ret, result;
|
2067
|
+
int result_found = 0;
|
2068
|
+
while((result = pgconn_get_result(self)) != Qnil) {
|
2069
|
+
ret = result;
|
2070
|
+
result_found = 1;
|
2071
|
+
}
|
2072
|
+
if(!result_found)
|
2073
|
+
return Qnil;
|
2074
|
+
return ret;
|
2075
|
+
}
|
2076
|
+
|
2077
|
+
|
2078
|
+
/*
|
2079
|
+
* call-seq:
|
2080
|
+
* conn.async_exec(sql [, params, result_format ] ) -> PGresult
|
2081
|
+
*
|
2082
|
+
* This function has the same behavior as +PGconn#exec()+,
|
2083
|
+
* except that it's implemented using asynchronous command
|
2084
|
+
* processing and ruby's +rb_thread_select()+ in order to
|
2085
|
+
* allow other threads to process while waiting for the
|
2086
|
+
* server to complete the request.
|
2087
|
+
*/
|
2088
|
+
static VALUE
|
2089
|
+
pgconn_async_exec(int argc, VALUE *argv, VALUE self)
|
2090
|
+
{
|
2091
|
+
pgconn_send_query(argc, argv, self);
|
2092
|
+
pgconn_block(0, NULL, self);
|
2093
|
+
return pgconn_get_last_result(self);
|
2094
|
+
}
|
2095
|
+
|
2044
2096
|
/*TODO */
|
2045
2097
|
static void
|
2046
2098
|
notice_proxy(self, message)
|
@@ -2708,7 +2760,8 @@ pgresult_fsize(self, index)
|
|
2708
2760
|
* call-seq:
|
2709
2761
|
* res.getvalue( tup_num, field_num )
|
2710
2762
|
*
|
2711
|
-
* Returns the value in tuple number _tup_num_, field _field_num_
|
2763
|
+
* Returns the value in tuple number _tup_num_, field _field_num_,
|
2764
|
+
* or +nil+ if the field is +NULL+.
|
2712
2765
|
*/
|
2713
2766
|
static VALUE
|
2714
2767
|
pgresult_getvalue(self, tup_num, field_num)
|
@@ -2725,6 +2778,8 @@ pgresult_getvalue(self, tup_num, field_num)
|
|
2725
2778
|
if(j < 0 || j >= PQnfields(result)) {
|
2726
2779
|
rb_raise(rb_eArgError,"invalid field number %d", j);
|
2727
2780
|
}
|
2781
|
+
if(PQgetisnull(result, i, j))
|
2782
|
+
return Qnil;
|
2728
2783
|
return rb_str_new2(PQgetvalue(result, i, j));
|
2729
2784
|
}
|
2730
2785
|
|
@@ -2884,6 +2939,8 @@ pgresult_aref(self, index)
|
|
2884
2939
|
VALUE fname,val;
|
2885
2940
|
VALUE tuple;
|
2886
2941
|
|
2942
|
+
if(tuple_num >= PQntuples(result))
|
2943
|
+
rb_raise(rb_eIndexError, "Index %d is out of range", tuple_num);
|
2887
2944
|
tuple = rb_hash_new();
|
2888
2945
|
for(field_num = 0; field_num < PQnfields(result); field_num++) {
|
2889
2946
|
fname = rb_str_new2(PQfname(result,field_num));
|
@@ -3097,6 +3154,9 @@ Init_pg()
|
|
3097
3154
|
rb_define_method(rb_cPGconn, "transaction", pgconn_transaction, 0);
|
3098
3155
|
rb_define_method(rb_cPGconn, "block", pgconn_block, -1);
|
3099
3156
|
rb_define_method(rb_cPGconn, "quote_ident", pgconn_s_quote_ident, 1);
|
3157
|
+
rb_define_method(rb_cPGconn, "async_exec", pgconn_async_exec, -1);
|
3158
|
+
rb_define_alias(rb_cPGconn, "async_query", "async_exec");
|
3159
|
+
rb_define_method(rb_cPGconn, "get_last_result", pgconn_get_last_result, 0);
|
3100
3160
|
|
3101
3161
|
/****** PGconn INSTANCE METHODS: Large Object Support ******/
|
3102
3162
|
rb_define_method(rb_cPGconn, "lo_creat", pgconn_locreat, -1);
|
@@ -3162,7 +3222,9 @@ Init_pg()
|
|
3162
3222
|
rb_define_method(rb_cPGresult, "result_error_field", pgresult_result_error_field, 0);
|
3163
3223
|
rb_define_method(rb_cPGresult, "clear", pgresult_clear, 0);
|
3164
3224
|
rb_define_method(rb_cPGresult, "ntuples", pgresult_ntuples, 0);
|
3225
|
+
rb_define_alias(rb_cPGresult, "num_tuples", "ntuples");
|
3165
3226
|
rb_define_method(rb_cPGresult, "nfields", pgresult_nfields, 0);
|
3227
|
+
rb_define_alias(rb_cPGresult, "num_fields", "nfields");
|
3166
3228
|
rb_define_method(rb_cPGresult, "fname", pgresult_fname, 1);
|
3167
3229
|
rb_define_method(rb_cPGresult, "fnumber", pgresult_fnumber, 1);
|
3168
3230
|
rb_define_method(rb_cPGresult, "ftable", pgresult_ftable, 1);
|
@@ -3178,6 +3240,7 @@ Init_pg()
|
|
3178
3240
|
rb_define_method(rb_cPGresult, "paramtype", pgresult_paramtype, 0);
|
3179
3241
|
rb_define_method(rb_cPGresult, "cmd_status", pgresult_cmd_status, 0);
|
3180
3242
|
rb_define_method(rb_cPGresult, "cmd_tuples", pgresult_cmd_tuples, 0);
|
3243
|
+
rb_define_alias(rb_cPGresult, "cmdtuples", "cmd_tuples");
|
3181
3244
|
rb_define_method(rb_cPGresult, "oid_value", pgresult_oid_value, 0);
|
3182
3245
|
|
3183
3246
|
/****** PGresult INSTANCE METHODS: other ******/
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-pg
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.9.2008.01.
|
7
|
-
date: 2008-01-
|
6
|
+
version: 0.7.9.2008.01.28
|
7
|
+
date: 2008-01-28 00:00:00 -08:00
|
8
8
|
summary: Ruby extension library providing an API to PostgreSQL
|
9
9
|
require_paths:
|
10
10
|
- lib
|