pg 0.7.9.2008.10.13 → 0.8.0
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/BSD +23 -0
- data/COPYING.txt +340 -0
- data/ChangeLog +261 -0
- data/Contributors +28 -0
- data/GPL +340 -0
- data/LICENSE +58 -0
- data/README +125 -0
- data/Rakefile +103 -0
- data/ext/compat.c +3 -3
- data/ext/mingw/Rakefile +24 -0
- data/ext/mingw/build.rake +40 -0
- data/ext/mkrf_config.rb +8 -1
- data/ext/pg.c +35 -44
- data/ext/pg.h +6 -1
- data/ext/vc/pg.sln +26 -0
- data/spec/pgconn_spec.rb +34 -31
- data/spec/pgresult_spec.rb +20 -16
- metadata +16 -3
data/Rakefile
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rake/clean'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'spec/rake/spectask'
|
6
|
+
require 'rake/rdoctask'
|
7
|
+
require 'ext_helper'
|
8
|
+
require 'date'
|
9
|
+
|
10
|
+
# House-keeping
|
11
|
+
CLEAN.include '**/*.o', 'ext/*.so', '**/*.bundle', '**/*.a',
|
12
|
+
'**/*.log', "{ext,lib}/*.{bundle,so,obj,pdb,lib,def,exp}",
|
13
|
+
"ext/Makefile", 'lib', '**/*.db'
|
14
|
+
|
15
|
+
FILES = FileList[
|
16
|
+
'Rakefile',
|
17
|
+
'README',
|
18
|
+
'LICENSE',
|
19
|
+
'COPYING.txt',
|
20
|
+
'ChangeLog',
|
21
|
+
'Contributors',
|
22
|
+
'GPL',
|
23
|
+
'BSD',
|
24
|
+
'doc/**/*',
|
25
|
+
'ext/*',
|
26
|
+
'ext/mingw/Rakefile',
|
27
|
+
'ext/mingw/build.rake',
|
28
|
+
'ext/vc/*.sln',
|
29
|
+
'ext/vc/*.vcproj',
|
30
|
+
'lib/**/*',
|
31
|
+
'sample/**/*',
|
32
|
+
'spec/**/*'
|
33
|
+
]
|
34
|
+
|
35
|
+
spec = Gem::Specification.new do |s|
|
36
|
+
s.name = 'pg'
|
37
|
+
s.platform = Gem::Platform::RUBY
|
38
|
+
s.require_path = "lib"
|
39
|
+
s.rubyforge_project = 'ruby-pg'
|
40
|
+
s.version = "0.8.0"
|
41
|
+
s.date = DateTime.now
|
42
|
+
s.summary = 'Ruby extension library providing an API to PostgreSQL'
|
43
|
+
s.authors = [
|
44
|
+
'Yukihiro Matsumoto',
|
45
|
+
'Eiji Matsumoto',
|
46
|
+
'Noboru Saitou',
|
47
|
+
'Dave Lee',
|
48
|
+
'Jeff Davis']
|
49
|
+
s.email = 'ruby-pg@j-davis.com'
|
50
|
+
s.homepage = 'http://rubyforge.org/projects/ruby-pg'
|
51
|
+
s.requirements = 'PostgreSQL libpq library and headers'
|
52
|
+
s.has_rdoc = true
|
53
|
+
s.extra_rdoc_files = ['ext/pg.c']
|
54
|
+
s.extensions = [ 'ext/extconf.rb' ]
|
55
|
+
s.required_ruby_version = '>= 1.8.4'
|
56
|
+
s.files = FILES.to_a.reject { |x| CLEAN.include?(x) }
|
57
|
+
end
|
58
|
+
|
59
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
60
|
+
pkg.gem_spec = spec
|
61
|
+
pkg.need_tar = true
|
62
|
+
end
|
63
|
+
|
64
|
+
# ------- Windows Package ----------
|
65
|
+
if RUBY_PLATFORM.match(/win32/)
|
66
|
+
binaries = (FileList['ext/mingw/*.so',
|
67
|
+
'ext/mingw/*.dll*'])
|
68
|
+
|
69
|
+
# Windows specification
|
70
|
+
win_spec = spec.clone
|
71
|
+
win_spec.extensions = ['ext/mingw/Rakefile']
|
72
|
+
win_spec.platform = Gem::Platform::CURRENT
|
73
|
+
win_spec.files += binaries.to_a
|
74
|
+
|
75
|
+
# Rake task to build the windows package
|
76
|
+
Rake::GemPackageTask.new(win_spec) do |pkg|
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# --------- RDoc Documentation ---------
|
81
|
+
desc "Generate rdoc documentation"
|
82
|
+
Rake::RDocTask.new("rdoc") do |rdoc|
|
83
|
+
rdoc.rdoc_dir = 'doc/rdoc'
|
84
|
+
rdoc.title = "pg"
|
85
|
+
# Show source inline with line numbers
|
86
|
+
rdoc.options << "--line-numbers"
|
87
|
+
# Make the readme file the start page for the generated html
|
88
|
+
rdoc.options << '--main' << 'README'
|
89
|
+
rdoc.rdoc_files.include('ext/**/*.c',
|
90
|
+
'ChangeLog',
|
91
|
+
'README*',
|
92
|
+
'LICENSE')
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
setup_extension 'pg', spec
|
97
|
+
|
98
|
+
desc "Run all specs in spec directory"
|
99
|
+
Spec::Rake::SpecTask.new("spec") do |t|
|
100
|
+
t.spec_opts = ["--format", "specdoc", "--colour"]
|
101
|
+
t.spec_files = FileList["spec/**/*_spec.rb"]
|
102
|
+
end
|
103
|
+
task :spec => [:compile]
|
data/ext/compat.c
CHANGED
@@ -283,7 +283,7 @@ PQsetClientEncoding(PGconn *conn, const char *encoding)
|
|
283
283
|
PGresult *res;
|
284
284
|
int status;
|
285
285
|
|
286
|
-
if (!conn || conn
|
286
|
+
if (!conn || PQstatus(conn) != CONNECTION_OK)
|
287
287
|
return -1;
|
288
288
|
|
289
289
|
if (!encoding)
|
@@ -299,7 +299,7 @@ PQsetClientEncoding(PGconn *conn, const char *encoding)
|
|
299
299
|
|
300
300
|
if (res == NULL)
|
301
301
|
return -1;
|
302
|
-
if (res
|
302
|
+
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
303
303
|
status = -1;
|
304
304
|
else
|
305
305
|
{
|
@@ -309,7 +309,7 @@ PQsetClientEncoding(PGconn *conn, const char *encoding)
|
|
309
309
|
* backend to report the parameter value, and we'll change state at
|
310
310
|
* that time.
|
311
311
|
*/
|
312
|
-
if (
|
312
|
+
if (PQprotocolVersion(conn) < 3)
|
313
313
|
pqSaveParameterStatus(conn, "client_encoding", encoding);
|
314
314
|
status = 0; /* everything is ok */
|
315
315
|
}
|
data/ext/mingw/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# We can't use Ruby's standard build procedures
|
2
|
+
# on Windows because the Ruby executable is
|
3
|
+
# built with VC++ while here we want to build
|
4
|
+
# with MingW. So just roll our own...
|
5
|
+
|
6
|
+
require 'fileutils'
|
7
|
+
require 'rbconfig'
|
8
|
+
|
9
|
+
EXTENSION_NAME = "pg.#{Config::CONFIG["DLEXT"]}"
|
10
|
+
|
11
|
+
# This is called when the Windows GEM is installed!
|
12
|
+
task :install do
|
13
|
+
# Gems will pass these two environment variables:
|
14
|
+
# RUBYARCHDIR=#{dest_path}
|
15
|
+
# RUBYLIBDIR=#{dest_path}
|
16
|
+
|
17
|
+
dest_path = ENV['RUBYLIBDIR']
|
18
|
+
mkdir_p(dest_path)
|
19
|
+
|
20
|
+
# Copy the extension
|
21
|
+
cp(EXTENSION_NAME, dest_path)
|
22
|
+
end
|
23
|
+
|
24
|
+
task :default => :install
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# We can't use Ruby's standard build procedures
|
2
|
+
# on Windows because the Ruby executable is
|
3
|
+
# built with VC++ while here we want to build
|
4
|
+
# with MingW. So just roll our own...
|
5
|
+
|
6
|
+
require 'rake/clean'
|
7
|
+
require 'rbconfig'
|
8
|
+
|
9
|
+
RUBY_INCLUDE_DIR = Config::CONFIG["archdir"]
|
10
|
+
RUBY_BIN_DIR = Config::CONFIG["bindir"]
|
11
|
+
RUBY_LIB_DIR = Config::CONFIG["libdir"]
|
12
|
+
RUBY_SHARED_LIB = Config::CONFIG["LIBRUBY"]
|
13
|
+
RUBY_SHARED_DLL = RUBY_SHARED_LIB.gsub(/lib$/, 'dll')
|
14
|
+
|
15
|
+
EXTENSION_NAME = "pg.#{Config::CONFIG["DLEXT"]}"
|
16
|
+
|
17
|
+
CLEAN.include('*.o')
|
18
|
+
CLOBBER.include(EXTENSION_NAME)
|
19
|
+
|
20
|
+
task :default => "pg"
|
21
|
+
|
22
|
+
DEFINES = "-DHAVE_LIBPQ_FE_H -DHAVE_LIBPQ_LIBPQ_FS_H -DHAVE_PQCONNECTIONUSEDPASSWORD -DHAVE_PQISTHREADSAFE -DHAVE_LO_CREATE -DHAVE_PQPREPARE -DHAVE_PQEXECPARAMS -DHAVE_PQESCAPESTRING -DHAVE_PQESCAPESTRINGCONN -DHAVE_PG_ENCODING_TO_CHAR -DHAVE_PQSETCLIENTENCODING"
|
23
|
+
LIBS = "-lpq -lm"
|
24
|
+
SRC = FileList['../*.c']
|
25
|
+
OBJ = SRC.collect do |file_name|
|
26
|
+
File.basename(file_name).ext('o')
|
27
|
+
end
|
28
|
+
|
29
|
+
SRC.each do |srcfile|
|
30
|
+
objfile = File.basename(srcfile).ext('o')
|
31
|
+
file objfile => srcfile do
|
32
|
+
command = "gcc -c -O2 -Wall #{DEFINES} -o #{objfile} -I/usr/local/include #{srcfile} -I#{RUBY_INCLUDE_DIR}"
|
33
|
+
sh "sh -c '#{command}'"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
file "pg" => OBJ do
|
38
|
+
command = "gcc -shared -o #{EXTENSION_NAME} #{OBJ} -L/usr/local/lib #{LIBS} #{RUBY_BIN_DIR}/#{RUBY_SHARED_DLL}"
|
39
|
+
sh "sh -c '#{command}'"
|
40
|
+
end
|
data/ext/mkrf_config.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'mkrf'
|
3
3
|
|
4
|
-
|
4
|
+
pg_config_command =
|
5
|
+
if RUBY_PLATFORM.match(/win32/)
|
6
|
+
"pg_config --bindir > nul"
|
7
|
+
else
|
8
|
+
"pg_config --bindir > /dev/null"
|
9
|
+
end
|
10
|
+
|
11
|
+
unless system(pg_config_command)
|
5
12
|
$stderr.write("ERROR: can't find pg_config.\n")
|
6
13
|
$stderr.write("HINT: Make sure pg_config is in your PATH\n")
|
7
14
|
exit 1
|
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:
|
12
|
+
$Date: 2009-03-28 09:49:43 -0700 (Sat, 28 Mar 2009) $
|
13
13
|
************************************************/
|
14
14
|
|
15
15
|
#include "pg.h"
|
@@ -79,17 +79,10 @@ pgconn_s_quote_connstr(VALUE string)
|
|
79
79
|
}
|
80
80
|
str[j++] = '\'';
|
81
81
|
result = rb_str_new(str, j);
|
82
|
-
|
82
|
+
xfree(str);
|
83
83
|
return result;
|
84
84
|
}
|
85
85
|
|
86
|
-
static char *
|
87
|
-
value_as_cstring(VALUE in_str)
|
88
|
-
{
|
89
|
-
VALUE rstring = rb_obj_as_string(in_str);
|
90
|
-
return StringValuePtr(rstring);
|
91
|
-
}
|
92
|
-
|
93
86
|
static void
|
94
87
|
free_pgconn(PGconn *conn)
|
95
88
|
{
|
@@ -228,9 +221,7 @@ static VALUE
|
|
228
221
|
parse_connect_args(int argc, VALUE *argv, VALUE self)
|
229
222
|
{
|
230
223
|
VALUE args,arg;
|
231
|
-
PGconn *conn = NULL;
|
232
224
|
VALUE conninfo_rstr = rb_str_new("",0);
|
233
|
-
VALUE error;
|
234
225
|
char *host, *port, *opt, *tty, *dbname, *login, *pwd;
|
235
226
|
host=port=opt=tty=dbname=login=pwd=NULL;
|
236
227
|
|
@@ -372,15 +363,16 @@ pgconn_init(int argc, VALUE *argv, VALUE self)
|
|
372
363
|
|
373
364
|
if(conn == NULL)
|
374
365
|
rb_raise(rb_ePGError, "PQconnectStart() unable to allocate structure");
|
366
|
+
|
367
|
+
Check_Type(self, T_DATA);
|
368
|
+
DATA_PTR(self) = conn;
|
369
|
+
|
375
370
|
if (PQstatus(conn) == CONNECTION_BAD) {
|
376
371
|
error = rb_exc_new2(rb_ePGError, PQerrorMessage(conn));
|
377
372
|
rb_iv_set(error, "@connection", self);
|
378
373
|
rb_exc_raise(error);
|
379
374
|
}
|
380
375
|
|
381
|
-
Check_Type(self, T_DATA);
|
382
|
-
DATA_PTR(self) = conn;
|
383
|
-
|
384
376
|
if (rb_block_given_p()) {
|
385
377
|
return rb_ensure(rb_yield, self, pgconn_finish, self);
|
386
378
|
}
|
@@ -957,7 +949,7 @@ pgconn_exec(int argc, VALUE *argv, VALUE self)
|
|
957
949
|
sym_type = ID2SYM(rb_intern("type"));
|
958
950
|
sym_value = ID2SYM(rb_intern("value"));
|
959
951
|
sym_format = ID2SYM(rb_intern("format"));
|
960
|
-
nParams =
|
952
|
+
nParams = RARRAY_LEN(params);
|
961
953
|
paramTypes = ALLOC_N(Oid, nParams);
|
962
954
|
paramValues = ALLOC_N(char *, nParams);
|
963
955
|
paramLengths = ALLOC_N(int, nParams);
|
@@ -1010,10 +1002,10 @@ pgconn_exec(int argc, VALUE *argv, VALUE self)
|
|
1010
1002
|
|
1011
1003
|
rb_gc_unregister_address(&gc_array);
|
1012
1004
|
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1005
|
+
xfree(paramTypes);
|
1006
|
+
xfree(paramValues);
|
1007
|
+
xfree(paramLengths);
|
1008
|
+
xfree(paramFormats);
|
1017
1009
|
|
1018
1010
|
rb_pgresult = new_pgresult(result);
|
1019
1011
|
pgresult_check(self, rb_pgresult);
|
@@ -1062,7 +1054,7 @@ pgconn_prepare(int argc, VALUE *argv, VALUE self)
|
|
1062
1054
|
|
1063
1055
|
if(! NIL_P(in_paramtypes)) {
|
1064
1056
|
Check_Type(in_paramtypes, T_ARRAY);
|
1065
|
-
nParams =
|
1057
|
+
nParams = RARRAY_LEN(in_paramtypes);
|
1066
1058
|
paramTypes = ALLOC_N(Oid, nParams);
|
1067
1059
|
for(i = 0; i < nParams; i++) {
|
1068
1060
|
param = rb_ary_entry(in_paramtypes, i);
|
@@ -1076,7 +1068,7 @@ pgconn_prepare(int argc, VALUE *argv, VALUE self)
|
|
1076
1068
|
result = PQprepare(conn, StringValuePtr(name), StringValuePtr(command),
|
1077
1069
|
nParams, paramTypes);
|
1078
1070
|
|
1079
|
-
|
1071
|
+
xfree(paramTypes);
|
1080
1072
|
|
1081
1073
|
rb_pgresult = new_pgresult(result);
|
1082
1074
|
pgresult_check(self, rb_pgresult);
|
@@ -1148,7 +1140,7 @@ pgconn_exec_prepared(int argc, VALUE *argv, VALUE self)
|
|
1148
1140
|
rb_gc_register_address(&gc_array);
|
1149
1141
|
sym_value = ID2SYM(rb_intern("value"));
|
1150
1142
|
sym_format = ID2SYM(rb_intern("format"));
|
1151
|
-
nParams =
|
1143
|
+
nParams = RARRAY_LEN(params);
|
1152
1144
|
paramValues = ALLOC_N(char *, nParams);
|
1153
1145
|
paramLengths = ALLOC_N(int, nParams);
|
1154
1146
|
paramFormats = ALLOC_N(int, nParams);
|
@@ -1193,9 +1185,9 @@ pgconn_exec_prepared(int argc, VALUE *argv, VALUE self)
|
|
1193
1185
|
|
1194
1186
|
rb_gc_unregister_address(&gc_array);
|
1195
1187
|
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1188
|
+
xfree(paramValues);
|
1189
|
+
xfree(paramLengths);
|
1190
|
+
xfree(paramFormats);
|
1199
1191
|
|
1200
1192
|
rb_pgresult = new_pgresult(result);
|
1201
1193
|
pgresult_check(self, rb_pgresult);
|
@@ -1327,7 +1319,7 @@ pgconn_s_escape(VALUE self, VALUE string)
|
|
1327
1319
|
RSTRING_LEN(string));
|
1328
1320
|
}
|
1329
1321
|
result = rb_str_new(escaped, size);
|
1330
|
-
|
1322
|
+
xfree(escaped);
|
1331
1323
|
OBJ_INFECT(result, string);
|
1332
1324
|
return result;
|
1333
1325
|
}
|
@@ -1488,7 +1480,7 @@ pgconn_send_query(int argc, VALUE *argv, VALUE self)
|
|
1488
1480
|
sym_type = ID2SYM(rb_intern("type"));
|
1489
1481
|
sym_value = ID2SYM(rb_intern("value"));
|
1490
1482
|
sym_format = ID2SYM(rb_intern("format"));
|
1491
|
-
nParams =
|
1483
|
+
nParams = RARRAY_LEN(params);
|
1492
1484
|
paramTypes = ALLOC_N(Oid, nParams);
|
1493
1485
|
paramValues = ALLOC_N(char *, nParams);
|
1494
1486
|
paramLengths = ALLOC_N(int, nParams);
|
@@ -1541,10 +1533,10 @@ pgconn_send_query(int argc, VALUE *argv, VALUE self)
|
|
1541
1533
|
|
1542
1534
|
rb_gc_unregister_address(&gc_array);
|
1543
1535
|
|
1544
|
-
|
1545
|
-
|
1546
|
-
|
1547
|
-
|
1536
|
+
xfree(paramTypes);
|
1537
|
+
xfree(paramValues);
|
1538
|
+
xfree(paramLengths);
|
1539
|
+
xfree(paramFormats);
|
1548
1540
|
|
1549
1541
|
if(result == 0) {
|
1550
1542
|
error = rb_exc_new2(rb_ePGError, PQerrorMessage(conn));
|
@@ -1592,7 +1584,7 @@ pgconn_send_prepare(int argc, VALUE *argv, VALUE self)
|
|
1592
1584
|
|
1593
1585
|
if(! NIL_P(in_paramtypes)) {
|
1594
1586
|
Check_Type(in_paramtypes, T_ARRAY);
|
1595
|
-
nParams =
|
1587
|
+
nParams = RARRAY_LEN(in_paramtypes);
|
1596
1588
|
paramTypes = ALLOC_N(Oid, nParams);
|
1597
1589
|
for(i = 0; i < nParams; i++) {
|
1598
1590
|
param = rb_ary_entry(in_paramtypes, i);
|
@@ -1606,7 +1598,7 @@ pgconn_send_prepare(int argc, VALUE *argv, VALUE self)
|
|
1606
1598
|
result = PQsendPrepare(conn, StringValuePtr(name), StringValuePtr(command),
|
1607
1599
|
nParams, paramTypes);
|
1608
1600
|
|
1609
|
-
|
1601
|
+
xfree(paramTypes);
|
1610
1602
|
|
1611
1603
|
if(result == 0) {
|
1612
1604
|
error = rb_exc_new2(rb_ePGError, PQerrorMessage(conn));
|
@@ -1681,7 +1673,7 @@ pgconn_send_query_prepared(int argc, VALUE *argv, VALUE self)
|
|
1681
1673
|
rb_gc_register_address(&gc_array);
|
1682
1674
|
sym_value = ID2SYM(rb_intern("value"));
|
1683
1675
|
sym_format = ID2SYM(rb_intern("format"));
|
1684
|
-
nParams =
|
1676
|
+
nParams = RARRAY_LEN(params);
|
1685
1677
|
paramValues = ALLOC_N(char *, nParams);
|
1686
1678
|
paramLengths = ALLOC_N(int, nParams);
|
1687
1679
|
paramFormats = ALLOC_N(int, nParams);
|
@@ -1727,9 +1719,9 @@ pgconn_send_query_prepared(int argc, VALUE *argv, VALUE self)
|
|
1727
1719
|
|
1728
1720
|
rb_gc_unregister_address(&gc_array);
|
1729
1721
|
|
1730
|
-
|
1731
|
-
|
1732
|
-
|
1722
|
+
xfree(paramValues);
|
1723
|
+
xfree(paramLengths);
|
1724
|
+
xfree(paramFormats);
|
1733
1725
|
|
1734
1726
|
if(result == 0) {
|
1735
1727
|
error = rb_exc_new2(rb_ePGError, PQerrorMessage(conn));
|
@@ -2138,7 +2130,6 @@ pgconn_set_error_verbosity(VALUE self, VALUE in_verbosity)
|
|
2138
2130
|
static VALUE
|
2139
2131
|
pgconn_trace(VALUE self, VALUE stream)
|
2140
2132
|
{
|
2141
|
-
FILE *fp;
|
2142
2133
|
VALUE fileno;
|
2143
2134
|
FILE *new_fp;
|
2144
2135
|
int old_fd, new_fd;
|
@@ -2658,15 +2649,15 @@ static VALUE
|
|
2658
2649
|
pgconn_loread(VALUE self, VALUE in_lo_desc, VALUE in_len)
|
2659
2650
|
{
|
2660
2651
|
int ret;
|
2661
|
-
|
2652
|
+
PGconn *conn = get_pgconn(self);
|
2662
2653
|
int len = NUM2INT(in_len);
|
2663
2654
|
int lo_desc = NUM2INT(in_lo_desc);
|
2664
2655
|
VALUE str;
|
2665
2656
|
char *buffer;
|
2666
2657
|
|
2667
|
-
|
2658
|
+
buffer = ALLOC_N(char, len);
|
2668
2659
|
if(buffer == NULL)
|
2669
|
-
rb_raise(rb_eNoMemError, "
|
2660
|
+
rb_raise(rb_eNoMemError, "ALLOC failed!");
|
2670
2661
|
|
2671
2662
|
if (len < 0){
|
2672
2663
|
rb_raise(rb_ePGError,"nagative length %d given", len);
|
@@ -2676,12 +2667,12 @@ pgconn_loread(VALUE self, VALUE in_lo_desc, VALUE in_len)
|
|
2676
2667
|
rb_raise(rb_ePGError, "lo_read failed");
|
2677
2668
|
|
2678
2669
|
if(ret == 0) {
|
2679
|
-
|
2670
|
+
xfree(buffer);
|
2680
2671
|
return Qnil;
|
2681
2672
|
}
|
2682
2673
|
|
2683
2674
|
str = rb_tainted_str_new(buffer, len);
|
2684
|
-
|
2675
|
+
xfree(buffer);
|
2685
2676
|
|
2686
2677
|
return str;
|
2687
2678
|
}
|
@@ -2759,7 +2750,7 @@ pgconn_loclose(VALUE self, VALUE in_lo_desc)
|
|
2759
2750
|
PGconn *conn = get_pgconn(self);
|
2760
2751
|
int lo_desc = NUM2INT(in_lo_desc);
|
2761
2752
|
|
2762
|
-
if(
|
2753
|
+
if(lo_close(conn,lo_desc) < 0)
|
2763
2754
|
rb_raise(rb_ePGError,"lo_close failed");
|
2764
2755
|
|
2765
2756
|
return Qnil;
|