fb 0.8.0 → 0.9.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.
- checksums.yaml +4 -4
- data/extconf.rb +23 -4
- data/fb.c +25 -0
- data/test/ConnectionTestCases.rb +20 -4
- data/test/CursorTestCases.rb +64 -12
- data/test/DataTypesTestCases.rb +51 -0
- data/test/FbTestCases.rb +13 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d8e0d820f068703a7427f675e1e40bf5202287c
|
4
|
+
data.tar.gz: 280d0ae8ceb2eaf63ff07ff049986c53d45bd7d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41569151e53743c4f48178f848ec884125c3c2a8bee7d23b098626e8ddc2f0c1f5354bc59526738e7b0f042b68526b283e942a1b26cc0f296c72d321a67bc992
|
7
|
+
data.tar.gz: aaa348851b9b97b6c2508cbe7e6495bb0f7aaf521949171b5f7fa29db9053bf14d082e8367c63d9d157d86f0fcc7f708af7844c82d6e10af5cd3ff7d50018208
|
data/extconf.rb
CHANGED
@@ -18,23 +18,42 @@ def unquote(string)
|
|
18
18
|
string.sub(/\A(['"])?(.*?)\1?\z/m, '\2') unless string.nil?
|
19
19
|
end
|
20
20
|
|
21
|
+
def key_exists?(path)
|
22
|
+
begin
|
23
|
+
Win32::Registry::HKEY_LOCAL_MACHINE.open(path, ::Win32::Registry::KEY_READ)
|
24
|
+
return true
|
25
|
+
rescue
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
21
30
|
def read_firebird_registry
|
22
31
|
require 'win32/registry'
|
23
|
-
|
24
|
-
|
32
|
+
if key_exists?('SOFTWARE\Firebird Project\Firebird Server\Instances')
|
33
|
+
Win32::Registry::HKEY_LOCAL_MACHINE.open('SOFTWARE\Firebird Project\Firebird Server\Instances', Win32::Registry::Constants::KEY_READ) do |reg|
|
34
|
+
return reg.read_s('DefaultInstance') rescue nil
|
35
|
+
end
|
36
|
+
else
|
37
|
+
return false
|
25
38
|
end
|
26
39
|
end
|
27
40
|
|
28
41
|
def search_firebird_path
|
29
42
|
program_files = ENV['ProgramFiles'].gsub('\\', '/').gsub(/(\w+\s+[\w\s]+)/) { |s| s.size > 8 ? s[0,6] + '~1' : s }
|
30
|
-
|
43
|
+
program_files_x86 = ENV['ProgramFiles'].gsub('\\', '/').gsub(/(\w+\s+[\w\s]+)/) { |s| s.size > 8 ? s[0,6] + '~2' : s }
|
44
|
+
result = Dir["#{program_files}/Firebird/Firebird_*"].sort.last || Dir["#{program_files_x86}/Firebird/Firebird_*"].sort.last
|
31
45
|
end
|
32
46
|
|
33
47
|
if RUBY_PLATFORM =~ /(mingw32|mswin32)/ and ARGV.grep(/^--with-opt-dir=/).empty?
|
34
48
|
opt = unquote(ENV['FIREBIRD'])
|
35
49
|
opt = opt || read_firebird_registry
|
36
50
|
opt = opt || search_firebird_path
|
37
|
-
|
51
|
+
if opt
|
52
|
+
ARGV << "--with-opt-dir=#{opt}"
|
53
|
+
else
|
54
|
+
puts "No any Firebird instances found in system."
|
55
|
+
exit
|
56
|
+
end
|
38
57
|
end
|
39
58
|
|
40
59
|
require 'mkmf'
|
data/fb.c
CHANGED
@@ -41,6 +41,7 @@
|
|
41
41
|
#include <ibase.h>
|
42
42
|
#include <float.h>
|
43
43
|
#include <time.h>
|
44
|
+
#include <stdbool.h>
|
44
45
|
|
45
46
|
|
46
47
|
#define SQLDA_COLSINIT 50
|
@@ -403,6 +404,12 @@ static VALUE fb_sql_type_from_code(int code, int subtype)
|
|
403
404
|
case SQL_ARRAY:
|
404
405
|
sql_type = "ARRAY";
|
405
406
|
break;
|
407
|
+
#if (FB_API_VER >= 30)
|
408
|
+
case SQL_BOOLEAN:
|
409
|
+
case blr_boolean:
|
410
|
+
sql_type = "BOOLEAN";
|
411
|
+
break;
|
412
|
+
#endif
|
406
413
|
case SQL_QUAD:
|
407
414
|
case blr_quad:
|
408
415
|
sql_type = "DECIMAL";
|
@@ -1520,6 +1527,14 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
|
|
1520
1527
|
break;
|
1521
1528
|
#endif
|
1522
1529
|
|
1530
|
+
#if (FB_API_VER >= 30)
|
1531
|
+
case SQL_BOOLEAN:
|
1532
|
+
offset = FB_ALIGN(offset, alignment);
|
1533
|
+
var->sqldata = (char *)(fb_cursor->i_buffer + offset);
|
1534
|
+
*(bool *)var->sqldata = obj;
|
1535
|
+
offset += alignment;
|
1536
|
+
break;
|
1537
|
+
#endif
|
1523
1538
|
default :
|
1524
1539
|
rb_raise(rb_eFbError, "Specified table includes unsupported datatype (%d)", dtp);
|
1525
1540
|
}
|
@@ -1611,6 +1626,9 @@ static VALUE precision_from_sqlvar(XSQLVAR *sqlvar)
|
|
1611
1626
|
case SQL_TIMESTAMP: return Qnil;
|
1612
1627
|
case SQL_BLOB: return Qnil;
|
1613
1628
|
case SQL_ARRAY: return Qnil;
|
1629
|
+
#if (FB_API_VER >= 30)
|
1630
|
+
case SQL_BOOLEAN: return Qnil;
|
1631
|
+
#endif
|
1614
1632
|
case SQL_QUAD: return Qnil;
|
1615
1633
|
case SQL_TYPE_TIME: return Qnil;
|
1616
1634
|
case SQL_TYPE_DATE: return Qnil;
|
@@ -1791,6 +1809,7 @@ static VALUE fb_cursor_fetch(struct FbCursor *fb_cursor)
|
|
1791
1809
|
dtp = var->sqltype & ~1;
|
1792
1810
|
|
1793
1811
|
/* Check if column is null */
|
1812
|
+
|
1794
1813
|
|
1795
1814
|
if ((var->sqltype & 1) && (*var->sqlind < 0)) {
|
1796
1815
|
val = Qnil;
|
@@ -1906,6 +1925,12 @@ static VALUE fb_cursor_fetch(struct FbCursor *fb_cursor)
|
|
1906
1925
|
val = Qnil;
|
1907
1926
|
break;
|
1908
1927
|
|
1928
|
+
#if (FB_API_VER >= 30)
|
1929
|
+
case SQL_BOOLEAN:
|
1930
|
+
val = ((*(int*)var->sqldata) == 1) ? Qtrue : Qfalse;
|
1931
|
+
break;
|
1932
|
+
#endif
|
1933
|
+
|
1909
1934
|
default:
|
1910
1935
|
rb_raise(rb_eFbError, "Specified table includes unsupported datatype (%ld)", dtp);
|
1911
1936
|
break;
|
data/test/ConnectionTestCases.rb
CHANGED
@@ -20,27 +20,43 @@ class ConnectionTestCases < FbTestCase
|
|
20
20
|
def test_query_select
|
21
21
|
sql_select = "SELECT * FROM RDB$DATABASE"
|
22
22
|
Database.create(@parms) do |connection|
|
23
|
+
|
23
24
|
d = connection.query(sql_select)
|
24
25
|
assert_instance_of Array, d
|
25
26
|
assert_equal 1, d.size
|
26
27
|
assert_instance_of Array, d.first
|
27
|
-
|
28
|
-
|
28
|
+
if @fb_version == 3
|
29
|
+
assert_equal 5, d.first.size
|
30
|
+
else
|
31
|
+
assert_equal 4, d.first.size
|
32
|
+
end
|
33
|
+
|
29
34
|
a = connection.query(:array, sql_select)
|
30
35
|
assert_instance_of Array, a
|
31
36
|
assert_equal 1, a.size
|
32
37
|
assert_instance_of Array, a.first
|
33
|
-
|
38
|
+
if @fb_version == 3
|
39
|
+
assert_equal 5, a.first.size
|
40
|
+
else
|
41
|
+
assert_equal 4, a.first.size
|
42
|
+
end
|
34
43
|
|
35
44
|
h = connection.query(:hash, sql_select)
|
36
45
|
assert_instance_of Array, h
|
37
46
|
assert_equal 1, h.size
|
38
47
|
assert_instance_of Hash, h.first
|
39
|
-
|
48
|
+
if @fb_version == 3
|
49
|
+
assert_equal 5, h.first.keys.size
|
50
|
+
else
|
51
|
+
assert_equal 4, h.first.keys.size
|
52
|
+
end
|
40
53
|
assert h.first.keys.include?("RDB$DESCRIPTION")
|
41
54
|
assert h.first.keys.include?("RDB$RELATION_ID")
|
42
55
|
assert h.first.keys.include?("RDB$SECURITY_CLASS")
|
43
56
|
assert h.first.keys.include?("RDB$CHARACTER_SET_NAME")
|
57
|
+
if @fb_version == 3
|
58
|
+
assert h.first.keys.include?("RDB$LINGER")
|
59
|
+
end
|
44
60
|
end
|
45
61
|
end
|
46
62
|
|
data/test/CursorTestCases.rb
CHANGED
@@ -9,13 +9,17 @@ class CursorTestCases < FbTestCase
|
|
9
9
|
assert_instance_of Cursor, cursor
|
10
10
|
row = cursor.fetch :array
|
11
11
|
assert_instance_of Array, row
|
12
|
-
|
12
|
+
if @fb_version == 3
|
13
|
+
assert_equal 5, row.size
|
14
|
+
else
|
15
|
+
assert_equal 4, row.size
|
16
|
+
end
|
13
17
|
end
|
14
18
|
connection.execute("select * from rdb$database where rdb$description = 'bogus'") do |cursor|
|
15
19
|
assert_instance_of Cursor, cursor
|
16
20
|
row = cursor.fetch :array
|
17
21
|
assert_instance_of NilClass, row
|
18
|
-
|
22
|
+
assert_nil row
|
19
23
|
end
|
20
24
|
connection.drop
|
21
25
|
end
|
@@ -27,13 +31,17 @@ class CursorTestCases < FbTestCase
|
|
27
31
|
assert_instance_of Cursor, cursor
|
28
32
|
row = cursor.fetch :hash
|
29
33
|
assert_instance_of Hash, row
|
30
|
-
|
34
|
+
if @fb_version == 3
|
35
|
+
assert_equal 5, row.size
|
36
|
+
else
|
37
|
+
assert_equal 4, row.size
|
38
|
+
end
|
31
39
|
end
|
32
40
|
connection.execute("select * from rdb$database where rdb$description = 'bogus'") do |cursor|
|
33
41
|
assert_instance_of Cursor, cursor
|
34
42
|
row = cursor.fetch :hash
|
35
43
|
assert_instance_of NilClass, row
|
36
|
-
|
44
|
+
assert_nil row
|
37
45
|
end
|
38
46
|
connection.drop
|
39
47
|
end
|
@@ -47,7 +55,11 @@ class CursorTestCases < FbTestCase
|
|
47
55
|
assert_instance_of Array, rows
|
48
56
|
assert_equal 1, rows.size
|
49
57
|
assert_instance_of Array, rows[0]
|
50
|
-
|
58
|
+
if @fb_version == 3
|
59
|
+
assert_equal 5, rows[0].size
|
60
|
+
else
|
61
|
+
assert_equal 4, rows[0].size
|
62
|
+
end
|
51
63
|
end
|
52
64
|
connection.drop
|
53
65
|
end
|
@@ -61,7 +73,11 @@ class CursorTestCases < FbTestCase
|
|
61
73
|
assert_instance_of Array, rows
|
62
74
|
assert_equal 1, rows.size
|
63
75
|
assert_instance_of Hash, rows[0]
|
64
|
-
|
76
|
+
if @fb_version == 3
|
77
|
+
assert_equal 5, rows[0].size
|
78
|
+
else
|
79
|
+
assert_equal 4, rows[0].size
|
80
|
+
end
|
65
81
|
end
|
66
82
|
connection.drop
|
67
83
|
end
|
@@ -73,11 +89,18 @@ class CursorTestCases < FbTestCase
|
|
73
89
|
fields = cursor.fields
|
74
90
|
fields_ary = cursor.fields :array
|
75
91
|
assert_equal fields, fields_ary
|
76
|
-
|
92
|
+
if @fb_version == 3
|
93
|
+
assert_equal 5, fields.size
|
94
|
+
else
|
95
|
+
assert_equal 4, fields.size
|
96
|
+
end
|
77
97
|
assert_equal "RDB$DESCRIPTION", fields[0].name;
|
78
98
|
assert_equal "RDB$RELATION_ID", fields[1].name;
|
79
99
|
assert_equal "RDB$SECURITY_CLASS", fields[2].name;
|
80
100
|
assert_equal "RDB$CHARACTER_SET_NAME", fields[3].name;
|
101
|
+
if @fb_version == 3
|
102
|
+
assert_equal "RDB$LINGER", fields[4].name;
|
103
|
+
end
|
81
104
|
end
|
82
105
|
connection.drop
|
83
106
|
end
|
@@ -89,11 +112,18 @@ class CursorTestCases < FbTestCase
|
|
89
112
|
fields = cursor.fields
|
90
113
|
fields_ary = cursor.fields :array
|
91
114
|
assert_equal fields, fields_ary
|
92
|
-
|
115
|
+
if @fb_version == 3
|
116
|
+
assert_equal 5, fields.size
|
117
|
+
else
|
118
|
+
assert_equal 4, fields.size
|
119
|
+
end
|
93
120
|
assert_equal "rdb$description", fields[0].name;
|
94
121
|
assert_equal "rdb$relation_id", fields[1].name;
|
95
122
|
assert_equal "rdb$security_class", fields[2].name;
|
96
123
|
assert_equal "rdb$character_set_name", fields[3].name;
|
124
|
+
if @fb_version == 3
|
125
|
+
assert_equal "rdb$linger", fields[4].name;
|
126
|
+
end
|
97
127
|
end
|
98
128
|
connection.drop
|
99
129
|
end
|
@@ -103,11 +133,18 @@ class CursorTestCases < FbTestCase
|
|
103
133
|
Database.create(@parms) do |connection|
|
104
134
|
connection.execute("select * from rdb$database") do |cursor|
|
105
135
|
fields = cursor.fields :hash
|
106
|
-
|
136
|
+
if @fb_version == 3
|
137
|
+
assert_equal 5, fields.size
|
138
|
+
else
|
139
|
+
assert_equal 4, fields.size
|
140
|
+
end
|
107
141
|
assert_equal 520, fields["RDB$DESCRIPTION"].type_code
|
108
142
|
assert_equal 500, fields["RDB$RELATION_ID"].type_code
|
109
143
|
assert_equal 452, fields["RDB$SECURITY_CLASS"].type_code
|
110
144
|
assert_equal 452, fields["RDB$CHARACTER_SET_NAME"].type_code
|
145
|
+
if @fb_version == 3
|
146
|
+
assert_equal 496, fields["RDB$LINGER"].type_code
|
147
|
+
end
|
111
148
|
end
|
112
149
|
connection.drop
|
113
150
|
end
|
@@ -117,11 +154,18 @@ class CursorTestCases < FbTestCase
|
|
117
154
|
Database.create(@parms.merge(:downcase_names => true)) do |connection| # xxx true
|
118
155
|
connection.execute("select * from rdb$database") do |cursor|
|
119
156
|
fields = cursor.fields :hash
|
120
|
-
|
157
|
+
if @fb_version == 3
|
158
|
+
assert_equal 5, fields.size
|
159
|
+
else
|
160
|
+
assert_equal 4, fields.size
|
161
|
+
end
|
121
162
|
assert_equal 520, fields["rdb$description"].type_code
|
122
163
|
assert_equal 500, fields["rdb$relation_id"].type_code
|
123
164
|
assert_equal 452, fields["rdb$security_class"].type_code
|
124
165
|
assert_equal 452, fields["rdb$character_set_name"].type_code
|
166
|
+
if @fb_version == 3
|
167
|
+
assert_equal 496, fields["rdb$linger"].type_code
|
168
|
+
end
|
125
169
|
end
|
126
170
|
connection.drop
|
127
171
|
end
|
@@ -134,7 +178,11 @@ class CursorTestCases < FbTestCase
|
|
134
178
|
cursor.each :array do |row|
|
135
179
|
count += 1
|
136
180
|
assert_instance_of Array, row
|
137
|
-
|
181
|
+
if @fb_version == 3
|
182
|
+
assert_equal 5, row.size
|
183
|
+
else
|
184
|
+
assert_equal 4, row.size
|
185
|
+
end
|
138
186
|
end
|
139
187
|
assert_equal 1, count
|
140
188
|
end
|
@@ -149,7 +197,11 @@ class CursorTestCases < FbTestCase
|
|
149
197
|
cursor.each :hash do |row|
|
150
198
|
count += 1
|
151
199
|
assert_instance_of Hash, row
|
152
|
-
|
200
|
+
if @fb_version == 3
|
201
|
+
assert_equal 5, row.size
|
202
|
+
else
|
203
|
+
assert_equal 4, row.size
|
204
|
+
end
|
153
205
|
end
|
154
206
|
assert_equal 1, count
|
155
207
|
end
|
data/test/DataTypesTestCases.rb
CHANGED
@@ -511,4 +511,55 @@ class DataTypesTestCases < FbTestCase
|
|
511
511
|
connection.drop
|
512
512
|
end
|
513
513
|
end
|
514
|
+
|
515
|
+
def test_boolean_type
|
516
|
+
if @fb_version == 3
|
517
|
+
|
518
|
+
sql_schema = "create table testboolean (id int generated by default as identity primary key, bval boolean)"
|
519
|
+
sql_insert = "insert into testboolean (bval) values (?)"
|
520
|
+
sql_select = "select * from testboolean order by id"
|
521
|
+
|
522
|
+
Database.create(@parms) do |connection|
|
523
|
+
|
524
|
+
connection.execute(sql_schema);
|
525
|
+
|
526
|
+
connection.transaction do
|
527
|
+
|
528
|
+
connection.execute(sql_insert, nil);
|
529
|
+
|
530
|
+
connection.execute(sql_insert, false);
|
531
|
+
|
532
|
+
connection.execute(sql_insert, true);
|
533
|
+
|
534
|
+
5.times do |i|
|
535
|
+
connection.execute(sql_insert, i.even?);
|
536
|
+
end
|
537
|
+
|
538
|
+
end
|
539
|
+
|
540
|
+
connection.execute(sql_select) do |cursor|
|
541
|
+
|
542
|
+
i = 0
|
543
|
+
|
544
|
+
cursor.each :hash do |row|
|
545
|
+
case i
|
546
|
+
when 0
|
547
|
+
assert_nil row["BVAL"]
|
548
|
+
when 1
|
549
|
+
assert_equal false, row["BVAL"]
|
550
|
+
when 2
|
551
|
+
assert_equal true, row["BVAL"]
|
552
|
+
else
|
553
|
+
end
|
554
|
+
i += 1
|
555
|
+
end
|
556
|
+
|
557
|
+
end
|
558
|
+
|
559
|
+
connection.drop
|
560
|
+
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
514
565
|
end
|
data/test/FbTestCases.rb
CHANGED
@@ -40,8 +40,21 @@ module FbTestCases
|
|
40
40
|
:charset => 'NONE',
|
41
41
|
:role => 'READER' }
|
42
42
|
@parms_s = "database = #{@db_host}:#{@db_file}; username = #{@username}; password = #{@password}; charset = NONE; role = READER;"
|
43
|
+
@fb_version = -1
|
44
|
+
rm_rf @db_file
|
45
|
+
|
46
|
+
Database.create(@parms) do |connection|
|
47
|
+
|
48
|
+
d = connection.query("SELECT substring(rdb$get_context('SYSTEM', 'ENGINE_VERSION') from 1 for 1) from rdb$database")
|
49
|
+
|
50
|
+
@fb_version = Integer(d.first[0])
|
51
|
+
|
52
|
+
connection.drop
|
53
|
+
end
|
54
|
+
|
43
55
|
rm_rf @db_file
|
44
56
|
end
|
57
|
+
|
45
58
|
end
|
46
59
|
|
47
60
|
class Fb::Connection
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brent Rowland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Ruby Firebird Extension Library
|
14
14
|
email: rowland@rowlandresearch.com
|