sqlpostgres 1.2.6 → 1.3.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/Changelog.md +18 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +12 -0
- data/README.rdoc +5 -2
- data/Rakefile +5 -24
- data/VERSION +1 -1
- data/lib/sqlpostgres/Connection.rb +8 -3
- data/lib/sqlpostgres/Cursor.rb +2 -2
- data/lib/sqlpostgres/Insert.rb +1 -1
- data/lib/sqlpostgres/PgBit.rb +1 -1
- data/lib/sqlpostgres/PgBox.rb +1 -1
- data/lib/sqlpostgres/PgCidr.rb +1 -1
- data/lib/sqlpostgres/PgCircle.rb +1 -1
- data/lib/sqlpostgres/PgInet.rb +1 -1
- data/lib/sqlpostgres/PgInterval.rb +1 -1
- data/lib/sqlpostgres/PgLineSegment.rb +1 -1
- data/lib/sqlpostgres/PgMacAddr.rb +1 -1
- data/lib/sqlpostgres/PgPath.rb +1 -1
- data/lib/sqlpostgres/PgPoint.rb +1 -1
- data/lib/sqlpostgres/PgPolygon.rb +1 -1
- data/lib/sqlpostgres/PgTime.rb +1 -1
- data/lib/sqlpostgres/PgTimeWithTimeZone.rb +1 -1
- data/lib/sqlpostgres/PgTimestamp.rb +1 -1
- data/lib/sqlpostgres/PgTwoPoints.rb +1 -1
- data/lib/sqlpostgres/PgWrapper.rb +1 -1
- data/lib/sqlpostgres/Select.rb +25 -25
- data/lib/sqlpostgres/Translate.rb +7 -29
- data/lib/sqlpostgres/Update.rb +1 -1
- data/rake_tasks/db.rake +17 -0
- data/rake_tasks/default.rake +1 -0
- data/rake_tasks/jeweler.rake +18 -0
- data/rake_tasks/test.rake +2 -0
- data/rake_tasks/test_spec.rake +3 -0
- data/rake_tasks/test_unit.rake +4 -0
- data/spec/Translate_spec.rb +533 -0
- data/spec/config/.gitignore +1 -0
- data/spec/config/config.yml +10 -0
- data/spec/config/database.yml.template +6 -0
- data/spec/connection_spec.rb +515 -0
- data/spec/cursor_spec.rb +288 -0
- data/spec/lib/database_config.rb +33 -0
- data/spec/lib/database_server.rb +42 -0
- data/spec/lib/postgres_template.rb +60 -0
- data/spec/lib/target_database_servers.rb +55 -0
- data/spec/lib/temporary_table.rb +45 -0
- data/spec/lib/test_config.rb +24 -0
- data/spec/lib/test_connection.rb +29 -0
- data/spec/lib/test_database.rb +57 -0
- data/spec/roundtrip_spec.rb +582 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/all_characters.rb +18 -0
- data/spec/support/clear_default_connection.rb +5 -0
- data/spec/support/temporary_table.rb +24 -0
- data/spec/support/test_connections.rb +10 -0
- data/sqlpostgres.gemspec +35 -4
- data/test/Connection.test.rb +7 -5
- data/test/Select.test.rb +1 -1
- data/test/TestConfig.rb +9 -0
- data/test/TestUtil.rb +17 -3
- metadata +66 -9
- data/test/Translate.test.rb +0 -354
- data/test/roundtrip.test.rb +0 -565
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path('../lib/sqlpostgres.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
[
|
4
|
+
'support/**/*.rb',
|
5
|
+
].each do |relative_glob|
|
6
|
+
absolute_glob = File.expand_path(relative_glob, File.dirname(__FILE__))
|
7
|
+
Dir[absolute_glob].each do |path|
|
8
|
+
require path
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
shared_context "AllCharacters" do
|
3
|
+
|
4
|
+
def self.allCharactersExceptNull
|
5
|
+
allCharacters(1)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.allCharacters(floor = 0)
|
9
|
+
s = (floor..255).to_a.collect do |i|
|
10
|
+
i.chr
|
11
|
+
end.join
|
12
|
+
if s.respond_to?(:force_encoding)
|
13
|
+
s = s.force_encoding('ASCII-8BIT')
|
14
|
+
end
|
15
|
+
s
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('../lib/temporary_table',
|
2
|
+
File.dirname(__FILE__))
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
|
6
|
+
shared_context 'temporary table' do |args|
|
7
|
+
|
8
|
+
def set_message_level(level)
|
9
|
+
prior = connection.exec("show client_min_messages").first['client_min_messages']
|
10
|
+
connection.exec("set client_min_messages = '#{level}'")
|
11
|
+
ensure
|
12
|
+
connection.exec("set client_min_messages = '#{prior}'")
|
13
|
+
end
|
14
|
+
|
15
|
+
around(:each) do |block|
|
16
|
+
args = args.merge(:connection => connection)
|
17
|
+
set_message_level('warning') do
|
18
|
+
TestSupport::TemporaryTable.create(args, &block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path('../lib/target_database_servers',
|
2
|
+
File.dirname(__FILE__))
|
3
|
+
|
4
|
+
def test_connections
|
5
|
+
TestSupport::TargetDatabaseServers.instance.test_connections
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_connection
|
9
|
+
TestSupport::TargetDatabaseServers.instance.test_connection
|
10
|
+
end
|
data/sqlpostgres.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "sqlpostgres"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Wayne Conrad"]
|
12
|
-
s.date = "2013-02-
|
12
|
+
s.date = "2013-02-26"
|
13
13
|
s.description = "A mini-language for building and executing SQL statements against a postgresql database. This is a very old library, pre-dating active record and lacking many of its refinments. New projects will probably not want to use it."
|
14
14
|
s.email = "wconrad@yagni.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
|
+
"Changelog.md",
|
20
21
|
"Gemfile",
|
21
22
|
"Gemfile.lock",
|
22
23
|
"LICENSE.md",
|
@@ -121,6 +122,32 @@ Gem::Specification.new do |s|
|
|
121
122
|
"lib/sqlpostgres/Transaction.rb",
|
122
123
|
"lib/sqlpostgres/Translate.rb",
|
123
124
|
"lib/sqlpostgres/Update.rb",
|
125
|
+
"rake_tasks/db.rake",
|
126
|
+
"rake_tasks/default.rake",
|
127
|
+
"rake_tasks/jeweler.rake",
|
128
|
+
"rake_tasks/test.rake",
|
129
|
+
"rake_tasks/test_spec.rake",
|
130
|
+
"rake_tasks/test_unit.rake",
|
131
|
+
"spec/Translate_spec.rb",
|
132
|
+
"spec/config/.gitignore",
|
133
|
+
"spec/config/config.yml",
|
134
|
+
"spec/config/database.yml.template",
|
135
|
+
"spec/connection_spec.rb",
|
136
|
+
"spec/cursor_spec.rb",
|
137
|
+
"spec/lib/database_config.rb",
|
138
|
+
"spec/lib/database_server.rb",
|
139
|
+
"spec/lib/postgres_template.rb",
|
140
|
+
"spec/lib/target_database_servers.rb",
|
141
|
+
"spec/lib/temporary_table.rb",
|
142
|
+
"spec/lib/test_config.rb",
|
143
|
+
"spec/lib/test_connection.rb",
|
144
|
+
"spec/lib/test_database.rb",
|
145
|
+
"spec/roundtrip_spec.rb",
|
146
|
+
"spec/spec_helper.rb",
|
147
|
+
"spec/support/all_characters.rb",
|
148
|
+
"spec/support/clear_default_connection.rb",
|
149
|
+
"spec/support/temporary_table.rb",
|
150
|
+
"spec/support/test_connections.rb",
|
124
151
|
"sqlpostgres.gemspec",
|
125
152
|
"test/Assert.rb",
|
126
153
|
"test/Connection.test.rb",
|
@@ -151,9 +178,7 @@ Gem::Specification.new do |s|
|
|
151
178
|
"test/TestSetup.rb",
|
152
179
|
"test/TestUtil.rb",
|
153
180
|
"test/Transaction.test.rb",
|
154
|
-
"test/Translate.test.rb",
|
155
181
|
"test/Update.test.rb",
|
156
|
-
"test/roundtrip.test.rb",
|
157
182
|
"test/test",
|
158
183
|
"tools/exampleinserter/ExampleInserter.rb",
|
159
184
|
"tools/rdoc/ChangeLog",
|
@@ -237,16 +262,22 @@ Gem::Specification.new do |s|
|
|
237
262
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
238
263
|
s.add_runtime_dependency(%q<pg>, ["~> 0.13.2"])
|
239
264
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
265
|
+
s.add_development_dependency(%q<memoizer>, ["~> 1.0.1"])
|
240
266
|
s.add_development_dependency(%q<rake>, ["~> 10.0.3"])
|
267
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.12.0"])
|
241
268
|
else
|
242
269
|
s.add_dependency(%q<pg>, ["~> 0.13.2"])
|
243
270
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
271
|
+
s.add_dependency(%q<memoizer>, ["~> 1.0.1"])
|
244
272
|
s.add_dependency(%q<rake>, ["~> 10.0.3"])
|
273
|
+
s.add_dependency(%q<rspec>, ["~> 2.12.0"])
|
245
274
|
end
|
246
275
|
else
|
247
276
|
s.add_dependency(%q<pg>, ["~> 0.13.2"])
|
248
277
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
278
|
+
s.add_dependency(%q<memoizer>, ["~> 1.0.1"])
|
249
279
|
s.add_dependency(%q<rake>, ["~> 10.0.3"])
|
280
|
+
s.add_dependency(%q<rspec>, ["~> 2.12.0"])
|
250
281
|
end
|
251
282
|
end
|
252
283
|
|
data/test/Connection.test.rb
CHANGED
@@ -18,9 +18,8 @@ class ConnectionTest < Test
|
|
18
18
|
def test_ConnectionNewWrap
|
19
19
|
Connection.mockPgClass do
|
20
20
|
rawConnection = MockPGconn.new
|
21
|
-
assertEquals(MockPGconn.state[:encoding], nil)
|
22
21
|
connection = Connection.new('connection'=>rawConnection)
|
23
|
-
assertEquals(
|
22
|
+
assertEquals(connection.pgconn, rawConnection)
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
@@ -44,7 +43,8 @@ class ConnectionTest < Test
|
|
44
43
|
Connection.open(testDbArgs) do |connection1|
|
45
44
|
connection1.exec("create database #{dbName}")
|
46
45
|
begin
|
47
|
-
|
46
|
+
sleep(0.1)
|
47
|
+
Connection.open(testDbArgs.merge('db_name'=>dbName)) do |connection2|
|
48
48
|
rows = connection2.query("select current_database();")
|
49
49
|
assertEquals(rows[0][0], dbName)
|
50
50
|
end
|
@@ -85,17 +85,19 @@ class ConnectionTest < Test
|
|
85
85
|
password = randomString
|
86
86
|
options = randomString
|
87
87
|
tty = randomString
|
88
|
+
encoding = randomString
|
88
89
|
connection = Connection.new('host_name'=>hostName,
|
89
90
|
'port'=>port,
|
90
91
|
'options'=>options,
|
91
92
|
'tty'=>tty,
|
92
93
|
'db_name'=>dbName,
|
93
94
|
'login'=>login,
|
94
|
-
'password'=>password
|
95
|
+
'password'=>password,
|
96
|
+
'encoding'=>encoding)
|
95
97
|
assertEquals(MockPGconn.state[:open], true)
|
96
98
|
assertEquals(MockPGconn.state[:openArgs],
|
97
99
|
[hostName, port, options, tty, dbName, login, password])
|
98
|
-
assertEquals(MockPGconn.state[:encoding],
|
100
|
+
assertEquals(MockPGconn.state[:encoding], encoding)
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
data/test/Select.test.rb
CHANGED
@@ -231,7 +231,7 @@ class SelectTest < Test
|
|
231
231
|
def testUserConversion
|
232
232
|
makeTestConnection do |connection|
|
233
233
|
select = Select.new(connection)
|
234
|
-
select.select(["%s", "abc"], 'letters') do |s|
|
234
|
+
select.select(["%s", "abc"], 'letters') do |s, server_version|
|
235
235
|
s.scan(/./)
|
236
236
|
end
|
237
237
|
assertEquals(select.exec, [{'letters'=>['a', 'b', 'c']}])
|
data/test/TestConfig.rb
CHANGED
@@ -8,10 +8,19 @@ module TestConfig
|
|
8
8
|
|
9
9
|
TEST_DB_NAME = "sqlpostgres_test"
|
10
10
|
|
11
|
+
# The database port to use for testing.
|
12
|
+
|
13
|
+
TEST_DB_PORT = ENV['PGPORT'] || 5432
|
14
|
+
|
11
15
|
# The prefix for temporary database objects.
|
12
16
|
|
13
17
|
TEST_DB_PREFIX = "SQLPOSTGRES_TEST_"
|
14
18
|
|
19
|
+
# Encodings
|
20
|
+
|
21
|
+
TEST_CLIENT_ENCODING = 'SQL_ASCII'
|
22
|
+
TEST_DB_ENCODING = 'SQL_ASCII'
|
23
|
+
|
15
24
|
end
|
16
25
|
|
17
26
|
# Local Variables:
|
data/test/TestUtil.rb
CHANGED
@@ -6,7 +6,11 @@ module TestUtil
|
|
6
6
|
include SqlPostgres
|
7
7
|
|
8
8
|
def testDbArgs
|
9
|
-
{
|
9
|
+
{
|
10
|
+
'db_name' => TEST_DB_NAME,
|
11
|
+
'port'=> TEST_DB_PORT,
|
12
|
+
'encoding' => TEST_CLIENT_ENCODING,
|
13
|
+
}
|
10
14
|
end
|
11
15
|
|
12
16
|
def testForTestDb
|
@@ -14,13 +18,23 @@ module TestUtil
|
|
14
18
|
Connection.new(testDbArgs)
|
15
19
|
rescue PGError => message
|
16
20
|
puts "Creating test database"
|
17
|
-
|
21
|
+
run_psql "create database #{TEST_DB_NAME} with encoding '#{TEST_DB_ENCODING}' template template0"
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
21
25
|
def removeTestDb
|
22
26
|
puts "Removing test database"
|
23
|
-
|
27
|
+
run_psql "drop database #{TEST_DB_NAME}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def run_psql(command)
|
31
|
+
command = "psql -p #{TEST_DB_PORT} -c #{command.inspect} 2>&1"
|
32
|
+
output = `#{command}`
|
33
|
+
if $? != 0
|
34
|
+
$stderr.puts "Failed: #{command}"
|
35
|
+
$stderr.print output
|
36
|
+
exit(1)
|
37
|
+
end
|
24
38
|
end
|
25
39
|
|
26
40
|
def makeTestConnection
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqlpostgres
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 1.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 1.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Wayne Conrad
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-02-
|
18
|
+
date: 2013-02-26 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: pg
|
@@ -50,10 +50,26 @@ dependencies:
|
|
50
50
|
version: 1.8.4
|
51
51
|
version_requirements: *id002
|
52
52
|
- !ruby/object:Gem::Dependency
|
53
|
-
name:
|
53
|
+
name: memoizer
|
54
54
|
prerelease: false
|
55
55
|
type: :development
|
56
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 21
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 0
|
65
|
+
- 1
|
66
|
+
version: 1.0.1
|
67
|
+
version_requirements: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: rake
|
70
|
+
prerelease: false
|
71
|
+
type: :development
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
57
73
|
none: false
|
58
74
|
requirements:
|
59
75
|
- - ~>
|
@@ -64,7 +80,23 @@ dependencies:
|
|
64
80
|
- 0
|
65
81
|
- 3
|
66
82
|
version: 10.0.3
|
67
|
-
version_requirements: *
|
83
|
+
version_requirements: *id004
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rspec
|
86
|
+
prerelease: false
|
87
|
+
type: :development
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 63
|
94
|
+
segments:
|
95
|
+
- 2
|
96
|
+
- 12
|
97
|
+
- 0
|
98
|
+
version: 2.12.0
|
99
|
+
version_requirements: *id005
|
68
100
|
description: A mini-language for building and executing SQL statements against a postgresql database. This is a very old library, pre-dating active record and lacking many of its refinments. New projects will probably not want to use it.
|
69
101
|
email: wconrad@yagni.com
|
70
102
|
executables: []
|
@@ -75,6 +107,7 @@ extra_rdoc_files:
|
|
75
107
|
- LICENSE.md
|
76
108
|
- README.rdoc
|
77
109
|
files:
|
110
|
+
- Changelog.md
|
78
111
|
- Gemfile
|
79
112
|
- Gemfile.lock
|
80
113
|
- LICENSE.md
|
@@ -179,6 +212,32 @@ files:
|
|
179
212
|
- lib/sqlpostgres/Transaction.rb
|
180
213
|
- lib/sqlpostgres/Translate.rb
|
181
214
|
- lib/sqlpostgres/Update.rb
|
215
|
+
- rake_tasks/db.rake
|
216
|
+
- rake_tasks/default.rake
|
217
|
+
- rake_tasks/jeweler.rake
|
218
|
+
- rake_tasks/test.rake
|
219
|
+
- rake_tasks/test_spec.rake
|
220
|
+
- rake_tasks/test_unit.rake
|
221
|
+
- spec/Translate_spec.rb
|
222
|
+
- spec/config/.gitignore
|
223
|
+
- spec/config/config.yml
|
224
|
+
- spec/config/database.yml.template
|
225
|
+
- spec/connection_spec.rb
|
226
|
+
- spec/cursor_spec.rb
|
227
|
+
- spec/lib/database_config.rb
|
228
|
+
- spec/lib/database_server.rb
|
229
|
+
- spec/lib/postgres_template.rb
|
230
|
+
- spec/lib/target_database_servers.rb
|
231
|
+
- spec/lib/temporary_table.rb
|
232
|
+
- spec/lib/test_config.rb
|
233
|
+
- spec/lib/test_connection.rb
|
234
|
+
- spec/lib/test_database.rb
|
235
|
+
- spec/roundtrip_spec.rb
|
236
|
+
- spec/spec_helper.rb
|
237
|
+
- spec/support/all_characters.rb
|
238
|
+
- spec/support/clear_default_connection.rb
|
239
|
+
- spec/support/temporary_table.rb
|
240
|
+
- spec/support/test_connections.rb
|
182
241
|
- sqlpostgres.gemspec
|
183
242
|
- test/Assert.rb
|
184
243
|
- test/Connection.test.rb
|
@@ -209,9 +268,7 @@ files:
|
|
209
268
|
- test/TestSetup.rb
|
210
269
|
- test/TestUtil.rb
|
211
270
|
- test/Transaction.test.rb
|
212
|
-
- test/Translate.test.rb
|
213
271
|
- test/Update.test.rb
|
214
|
-
- test/roundtrip.test.rb
|
215
272
|
- test/test
|
216
273
|
- tools/exampleinserter/ExampleInserter.rb
|
217
274
|
- tools/rdoc/ChangeLog
|
data/test/Translate.test.rb
DELETED
@@ -1,354 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'bundler/setup'
|
5
|
-
$:.unshift(File.dirname(__FILE__))
|
6
|
-
require 'TestSetup'
|
7
|
-
|
8
|
-
class TranslateTest < Test
|
9
|
-
|
10
|
-
include SqlPostgres
|
11
|
-
include TestUtil
|
12
|
-
|
13
|
-
def testEscapeSql
|
14
|
-
pi = 3.1415926535897932384626433832795028841971693993751058209749445923
|
15
|
-
testCases = [
|
16
|
-
[nil, 'null'],
|
17
|
-
["", "E''"],
|
18
|
-
["foo", %q"E'foo'"],
|
19
|
-
["fred's", %q"E'fred\\047s'"],
|
20
|
-
['\\', %q"E'\\134'"],
|
21
|
-
[Time.local(2000, 1, 2, 3, 4, 5, 6),
|
22
|
-
"timestamp '2000-01-02 03:04:05.000006'"],
|
23
|
-
[Time.local(1999, 12, 31, 23, 59, 59, 999999),
|
24
|
-
"timestamp '1999-12-31 23:59:59.999999'"],
|
25
|
-
[1, '1'],
|
26
|
-
[-1, '-1'],
|
27
|
-
[1.0, "1"],
|
28
|
-
[-1.0, "-1"],
|
29
|
-
[pi, "3.1415926535898"],
|
30
|
-
[-pi, "-3.1415926535898"],
|
31
|
-
[1e100, "1e+100"],
|
32
|
-
[-1e-100, "-1e-100"],
|
33
|
-
[true, "true"],
|
34
|
-
[false, "false"],
|
35
|
-
[:default, "default"],
|
36
|
-
[['1 + %s', 1], '1 + 1'],
|
37
|
-
[[:in, 1, 2], '(1, 2)'],
|
38
|
-
[[:in, 'foo', 'bar'], "(E'foo', E'bar')"],
|
39
|
-
[BigDecimal('0'), '0.0'],
|
40
|
-
[BigDecimal('0.'), '0.0'],
|
41
|
-
[BigDecimal('1234567890.0987654321'), '1234567890.0987654321'],
|
42
|
-
[BigDecimal('0.000000000000000000000000000001'), '0.000000000000000000000000000001'],
|
43
|
-
[PgTime.new(0, 0, 0), "time '00:00:00'"],
|
44
|
-
[PgTime.new(23, 59, 59), "time '23:59:59'"],
|
45
|
-
[
|
46
|
-
PgTimeWithTimeZone.new,
|
47
|
-
"time with time zone '00:00:00+00:00'"
|
48
|
-
],
|
49
|
-
[
|
50
|
-
PgTimeWithTimeZone.new(12, 0, 0, -8),
|
51
|
-
"time with time zone '12:00:00-08:00'"
|
52
|
-
],
|
53
|
-
[
|
54
|
-
PgTimeWithTimeZone.new(23, 59, 59, 8),
|
55
|
-
"time with time zone '23:59:59+08:00'"
|
56
|
-
],
|
57
|
-
[
|
58
|
-
DateTime.civil(2001, 1, 1, 0, 0, 0, Rational(7, 24)),
|
59
|
-
"timestamp with time zone '2001-01-01 00:00:00.000000000+0700'",
|
60
|
-
],
|
61
|
-
[Date.civil(2001, 1, 1), "date '2001-01-01'"],
|
62
|
-
[
|
63
|
-
PgTimestamp.new(2001, 1, 2, 12, 0, 1),
|
64
|
-
"timestamp '2001-01-02 12:00:01.00000'"
|
65
|
-
],
|
66
|
-
[PgInterval.new('hours'=>1), "interval '01:00'"],
|
67
|
-
[PgInterval.new('days'=>1), "interval '1 day'"],
|
68
|
-
[PgPoint.new(1, 2), "point '(1, 2)'"],
|
69
|
-
[PgPoint.new(3, 4), "point '(3, 4)'"],
|
70
|
-
[
|
71
|
-
PgLineSegment.new(PgPoint.new(1, 2), PgPoint.new(3, 4)),
|
72
|
-
"lseg '((1, 2), (3, 4))'"
|
73
|
-
],
|
74
|
-
[
|
75
|
-
PgBox.new(PgPoint.new(1, 2), PgPoint.new(3, 4)),
|
76
|
-
"box '((1, 2), (3, 4))'"
|
77
|
-
],
|
78
|
-
[
|
79
|
-
PgPath.new(true, PgPoint.new(1, 2), PgPoint.new(3, 4)),
|
80
|
-
"path '((1, 2), (3, 4))'"
|
81
|
-
],
|
82
|
-
[
|
83
|
-
PgPolygon.new(PgPoint.new(1, 2), PgPoint.new(3, 4)),
|
84
|
-
"polygon '((1, 2), (3, 4))'"
|
85
|
-
],
|
86
|
-
[["%s %s", 1, 'Fred'], "1 E'Fred'"],
|
87
|
-
]
|
88
|
-
for testCase in testCases
|
89
|
-
assertInfo("For test case #{testCase.inspect}") do
|
90
|
-
raw, escaped = *testCase
|
91
|
-
assertEquals(Translate.escape_sql(raw), escaped)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_escape_array
|
97
|
-
testCases = [
|
98
|
-
[nil, "null"],
|
99
|
-
[[], %q"'{}'"],
|
100
|
-
[[1], %q"ARRAY[1]"],
|
101
|
-
[[1, 2], %q"ARRAY[1, 2]"],
|
102
|
-
[['foo'], %q"ARRAY[E'foo']"],
|
103
|
-
[['\\'], %q"ARRAY[E'\\134']"],
|
104
|
-
[["a,b,c"], %q"ARRAY[E'a,b,c']"],
|
105
|
-
[["a", "b", "c"], %q"ARRAY[E'a', E'b', E'c']"],
|
106
|
-
[["\"Hello\""], %q"ARRAY[E'\"Hello\"']"],
|
107
|
-
[
|
108
|
-
[[0, 0], [0, 1], [1, 0], [1, 1]],
|
109
|
-
"ARRAY[ARRAY[0, 0], ARRAY[0, 1], ARRAY[1, 0], ARRAY[1, 1]]"
|
110
|
-
],
|
111
|
-
]
|
112
|
-
for array, escaped in testCases
|
113
|
-
assertInfo("For array #{array.inspect}") do
|
114
|
-
assertEquals(Translate.escape_array(array), escaped)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_escape_bytea_array
|
120
|
-
testCases = [
|
121
|
-
[[], "'{}'"],
|
122
|
-
[["", "foo"], "'{\"\",\"foo\"}'"],
|
123
|
-
["\000\037 ", "'{\"\\\\\\\\000\037 \"}'"],
|
124
|
-
[["'\\"], "'{\"\\'\\\\\\\\\\\\\\\\\"}'"],
|
125
|
-
[["~\177\377"], "'{\"~\177\377\"}'"],
|
126
|
-
[["\""], "'{\"\\\\\"\"}'"],
|
127
|
-
[nil, "null"],
|
128
|
-
]
|
129
|
-
for array, escaped in testCases
|
130
|
-
assertInfo("For array #{array.inspect}") do
|
131
|
-
assertEquals(Translate.escape_bytea_array(array), escaped)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_sql_to_array
|
137
|
-
goodTestCases = [
|
138
|
-
["{}", []],
|
139
|
-
["{foo}", ["foo"]],
|
140
|
-
["{foo,bar,\"fool's gold\"}", ["foo", "bar", "fool's gold"]],
|
141
|
-
["{\"\\\\\"}", ["\\"]],
|
142
|
-
["{\"\\\\\",fool's}", ["\\", "fool's"]],
|
143
|
-
["{\"a,b,c\"}", ["a,b,c"]],
|
144
|
-
["{\"\\\"Hello!\\\"\"}", ["\"Hello!\""]],
|
145
|
-
["{\"\001\n\037\"}", ["\001\n\037"]],
|
146
|
-
[
|
147
|
-
"{{f,f},{f,t},{t,f},{t,t}}",
|
148
|
-
[["f", "f"], ["f", "t"], ["t", "f"], ["t", "t"]],
|
149
|
-
],
|
150
|
-
]
|
151
|
-
for sql, array in goodTestCases
|
152
|
-
assertInfo("For sql #{sql.inspect}") do
|
153
|
-
assertEquals(Translate.sql_to_array(sql), array)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
badTestCases = [
|
157
|
-
"",
|
158
|
-
"{",
|
159
|
-
"{foo",
|
160
|
-
"{foo}x",
|
161
|
-
]
|
162
|
-
for sql in badTestCases
|
163
|
-
assertInfo("For sql #{sql.inspect}") do
|
164
|
-
assertException(ArgumentError, sql.inspect) do
|
165
|
-
Translate.sql_to_array(sql)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def test_escape_qchar
|
172
|
-
test_cases = [
|
173
|
-
[nil, 'null'],
|
174
|
-
["\000", %q"E'\\000'"],
|
175
|
-
["\001", %q"E'\\001'"],
|
176
|
-
["\377", %q"E'\\377'"],
|
177
|
-
["a", "E'\\141'"],
|
178
|
-
]
|
179
|
-
for raw, escaped in test_cases
|
180
|
-
assertInfo("For raw=#{raw.inspect}") do
|
181
|
-
assertEquals(Translate.escape_qchar(raw), escaped)
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
def test_escape_bytea
|
187
|
-
testCases = [
|
188
|
-
[nil, 'null'],
|
189
|
-
[:default, "default"],
|
190
|
-
["", "E''"],
|
191
|
-
["foo", %q"E'foo'"],
|
192
|
-
["\000\037 ", %q"E'\\\\000\\\\037 '"],
|
193
|
-
["'\\", %q"E'''\\\\\\\\'"],
|
194
|
-
["~\177\377", "E'~\\\\177\\\\377'"],
|
195
|
-
]
|
196
|
-
for testCase in testCases
|
197
|
-
assertInfo("For test case #{testCase.inspect}") do
|
198
|
-
raw, escaped = *testCase
|
199
|
-
assertEquals(Translate.escape_bytea(raw), escaped)
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def test_unescape_bytea
|
205
|
-
testCases = [
|
206
|
-
["", ""],
|
207
|
-
["abc", "abc"],
|
208
|
-
["\\\\", "\\"],
|
209
|
-
["\\001", "\001"],
|
210
|
-
["\\037", "\037"],
|
211
|
-
["\\177", "\177"],
|
212
|
-
["\\200", "\200"],
|
213
|
-
["\\377", "\377"],
|
214
|
-
["\\477", "\\477"],
|
215
|
-
["\\387", "\\387"],
|
216
|
-
["\\378", "\\378"],
|
217
|
-
["\\n", "\\n"],
|
218
|
-
["abc\\", "abc\\"],
|
219
|
-
]
|
220
|
-
for testCase in testCases
|
221
|
-
assertInfo("For test case #{testCase.inspect}") do
|
222
|
-
escaped, raw = *testCase
|
223
|
-
assertEquals(Translate.unescape_bytea(escaped), raw)
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
def test_unescape_qchar
|
229
|
-
testCases = [
|
230
|
-
["", "\000"],
|
231
|
-
["\001", "\001"],
|
232
|
-
["\037", "\037"],
|
233
|
-
[" ", " "],
|
234
|
-
["~", '~'],
|
235
|
-
["\277", "\277"],
|
236
|
-
["\300", "\300"],
|
237
|
-
["\377", "\377"],
|
238
|
-
]
|
239
|
-
for testCase in testCases
|
240
|
-
assertInfo("For test case #{testCase.inspect}") do
|
241
|
-
escaped, raw = *testCase
|
242
|
-
assertEquals(Translate.unescape_qchar(escaped), raw)
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
def testEscapeSql_Select
|
248
|
-
select = Object.new
|
249
|
-
def select.statement
|
250
|
-
"foo"
|
251
|
-
end
|
252
|
-
assertEquals(Translate.escape_sql(select), "(foo)")
|
253
|
-
end
|
254
|
-
|
255
|
-
def testEscapeSql_AllCharValues
|
256
|
-
tableName = testTableName("foo")
|
257
|
-
Connection.open(testDbArgs) do |connection|
|
258
|
-
connection.exec("begin transaction;")
|
259
|
-
connection.exec("create temporary table #{tableName} "\
|
260
|
-
"(i int, t text);")
|
261
|
-
range = (1..255)
|
262
|
-
for i in range
|
263
|
-
assertInfo("For i=#{i.inspect}") do
|
264
|
-
statement = ("insert into #{tableName} (i, t) "\
|
265
|
-
"values (#{i}, #{Translate.escape_sql(i.chr)});")
|
266
|
-
connection.query(statement)
|
267
|
-
end
|
268
|
-
end
|
269
|
-
connection.exec("end transaction;")
|
270
|
-
statement = "select i, t, length(t) from #{tableName} order by i;"
|
271
|
-
rows = connection.query(statement)
|
272
|
-
for i in range
|
273
|
-
assertInfo("for i = #{i}") do
|
274
|
-
row = rows.assoc(i.to_s)
|
275
|
-
char_number, text, length = *row
|
276
|
-
assertEquals(length.to_i, 1)
|
277
|
-
c = Translate.unescape_text(text)
|
278
|
-
assertEquals(c, i.chr)
|
279
|
-
end
|
280
|
-
end
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
def testSubstituteValues
|
285
|
-
assertEquals(Translate.substitute_values("foo"), "foo")
|
286
|
-
assertEquals(Translate.substitute_values(["bar %s", 1]), "bar 1")
|
287
|
-
assertEquals(Translate.substitute_values(["bar %s", "O'Malley"]),
|
288
|
-
"bar E'O\\047Malley'")
|
289
|
-
assertEquals(Translate.substitute_values(["%s %s", nil, 1.23]), "null 1.23")
|
290
|
-
end
|
291
|
-
|
292
|
-
def test_sql_to_datetime
|
293
|
-
testCases = [
|
294
|
-
[2003, 10, 18, 11, 30, 24, -7],
|
295
|
-
[2001, 1, 1, 0, 0, 0, 0],
|
296
|
-
[1970, 12, 31, 23, 59, 59, -11],
|
297
|
-
]
|
298
|
-
for testCase in testCases
|
299
|
-
sql = "%04d-%02d-%02d %02d:%02d:%02d%+03d" % testCase
|
300
|
-
dateTime = DateTime.civil(*testCase[0..5] +
|
301
|
-
[Rational(testCase[6], 24)])
|
302
|
-
assertEquals(Translate.sql_to_datetime(sql), dateTime)
|
303
|
-
end
|
304
|
-
end
|
305
|
-
|
306
|
-
def test_datetime_to_sql
|
307
|
-
testCases = [
|
308
|
-
[2003, 10, 18, 11, 30, 24, -7],
|
309
|
-
[2001, 1, 1, 0, 0, 0, 0],
|
310
|
-
[1970, 12, 31, 23, 59, 59, -11],
|
311
|
-
]
|
312
|
-
for testCase in testCases
|
313
|
-
sql = "%04d-%02d-%02d %02d:%02d:%02d.000000000%+03d00" % testCase
|
314
|
-
dateTime = DateTime.civil(*testCase[0..5] +
|
315
|
-
[Rational(testCase[6], 24)])
|
316
|
-
assertEquals(Translate.datetime_to_sql(dateTime), sql)
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
def test_sql_to_date
|
321
|
-
testCases = [
|
322
|
-
[2000, 1, 1],
|
323
|
-
[1899, 12, 31],
|
324
|
-
]
|
325
|
-
for testCase in testCases
|
326
|
-
sql = "%04d-%02d-%02d" % testCase
|
327
|
-
date = Date.civil(*testCase)
|
328
|
-
assertEquals(Translate.sql_to_date(sql), date)
|
329
|
-
end
|
330
|
-
end
|
331
|
-
|
332
|
-
def test_deep_collect
|
333
|
-
testCases = [
|
334
|
-
["1", 1],
|
335
|
-
[[], []],
|
336
|
-
[["1"], [1]],
|
337
|
-
[["1", "2"], [1, 2]],
|
338
|
-
[["1", ["2", "3"], []], [1, [2, 3], []]],
|
339
|
-
]
|
340
|
-
for testCase in testCases
|
341
|
-
a, result = *testCase
|
342
|
-
assertEquals(Translate.deep_collect(a) do |e| e.to_i end, result)
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
|
-
end
|
347
|
-
|
348
|
-
TranslateTest.new.run if $0 == __FILE__
|
349
|
-
|
350
|
-
# Local Variables:
|
351
|
-
# tab-width: 2
|
352
|
-
# ruby-indent-level: 2
|
353
|
-
# indent-tabs-mode: nil
|
354
|
-
# End:
|