activerecord-ingres-adapter 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +69 -0
- data/Gemfile +7 -0
- data/LICENSE +258 -0
- data/README.md +69 -0
- data/Rakefile +0 -0
- data/activerecord_ingres_adapter.gemspec +19 -0
- data/ext/Ingres.c +3889 -0
- data/ext/Ingres.h +318 -0
- data/ext/Unicode.c +219 -0
- data/ext/Unicode.h +56 -0
- data/ext/createMake.bat +1 -0
- data/ext/extconf.rb +85 -0
- data/ext/tests/config.rb +11 -0
- data/ext/tests/tc_connect.rb +12 -0
- data/ext/tests/tc_connect_hash.rb +31 -0
- data/ext/tests/tc_connect_with_login_only.rb +14 -0
- data/ext/tests/tc_connect_with_login_password.rb +12 -0
- data/ext/tests/tc_dual_connections.rb +14 -0
- data/ext/tests/tc_env_date_format.rb +47 -0
- data/ext/tests/tc_query_simple.rb +29 -0
- data/ext/tests/tc_query_username.rb +22 -0
- data/ext/tests/tc_transactions_savepoint.rb +109 -0
- data/ext/tests/tc_type_date_fetch.rb +22 -0
- data/ext/tests/tc_type_lob_fetch.rb +20 -0
- data/ext/tests/ts_all.rb +28 -0
- data/ext/tests/ts_connect.rb +5 -0
- data/ext/tests/ts_environment.rb +1 -0
- data/ext/tests/ts_execute.rb +1 -0
- data/ext/tests/ts_transactions.rb +3 -0
- data/ext/tests/ts_types.rb +2 -0
- data/lib/active_record/connection_adapters/ingres_adapter.rb +786 -0
- data/lib/activerecord-ingres-adapter.rb +2 -0
- data/lib/arel/visitors/ingres.rb +30 -0
- metadata +80 -0
data/ext/Unicode.h
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
/*
|
2
|
+
** Copyright (c) 2009 Ingres Corporation
|
3
|
+
**
|
4
|
+
** This program is free software; you can redistribute it and/or modify
|
5
|
+
** it under the terms of the GNU General Public License version 2 as
|
6
|
+
** published by the Free Software Foundation.
|
7
|
+
**
|
8
|
+
** This program is distributed in the hope that it will be useful,
|
9
|
+
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
** GNU General Public License for more details.
|
12
|
+
**
|
13
|
+
** You should have received a copy of the GNU General Public License along
|
14
|
+
** with this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
|
+
*/
|
17
|
+
|
18
|
+
/* static char Sccsid[] = "$Id$"; */
|
19
|
+
|
20
|
+
/*
|
21
|
+
** UNCIODE.H
|
22
|
+
**
|
23
|
+
** History
|
24
|
+
** 24-Aug-2009 (Grant.Croker@ingres.com)
|
25
|
+
** Created
|
26
|
+
*/
|
27
|
+
|
28
|
+
#include <stdlib.h>
|
29
|
+
|
30
|
+
typedef unsigned short ucs2;
|
31
|
+
typedef unsigned long ucs4;
|
32
|
+
typedef unsigned char utf8;
|
33
|
+
|
34
|
+
typedef short i2;
|
35
|
+
typedef long i4;
|
36
|
+
typedef unsigned short u_i2;
|
37
|
+
#ifndef _WIN32
|
38
|
+
typedef long long __int64;
|
39
|
+
#endif
|
40
|
+
|
41
|
+
#ifndef FALSE
|
42
|
+
#define FALSE 0
|
43
|
+
#endif
|
44
|
+
#ifndef TRUE
|
45
|
+
#define TRUE 0
|
46
|
+
#endif
|
47
|
+
|
48
|
+
#define UTF8 utf8
|
49
|
+
#define UCS2 ucs2
|
50
|
+
#define UCS4 ucs4
|
51
|
+
|
52
|
+
int utf8_to_utf16 (UTF8 * sourceStart, const UTF8 * sourceEnd, UCS2 * targetStart, const UCS2 * targetEnd, long *reslen);
|
53
|
+
int utf16_to_utf8 (UCS2 * sourceStart, const UCS2 * sourceEnd, UTF8 * targetStart, const UTF8 * targetEnd, long *reslen);
|
54
|
+
/*
|
55
|
+
vim: ts=2 sw=2 expandtab
|
56
|
+
*/
|
data/ext/createMake.bat
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby -r mkmf extconf.rb --with-ingres-include="%II_SYSTEM%\ingres\files" --with-ingres-lib="%II_SYSTEM%\ingres\lib"
|
data/ext/extconf.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# UNIX/Linux/OS X
|
2
|
+
# ruby -r mkmf extconf.rb --with-ingres-include="${II_SYSTEM}/ingres/files/" --with-ingres-lib="${II_SYSTEM}/ingres/lib/"
|
3
|
+
# Windows
|
4
|
+
# ruby -r mkmf extconf.rb --with-ingres-include="%II_SYSTEM%\ingres\files\" --with-ingres-lib="%II_SYSTEM%\ingres\lib\"
|
5
|
+
#
|
6
|
+
# If mkmf is not found on your system, install something like ruby1.8-dev
|
7
|
+
#
|
8
|
+
require 'mkmf'
|
9
|
+
puts "Start extconf.rb"
|
10
|
+
|
11
|
+
#Get the supplied library/header directory (if any)
|
12
|
+
ingres_dirs=dir_config('ingres')
|
13
|
+
|
14
|
+
#Sanity checks, --with-ingres-xxx override system set II_SYSTEM
|
15
|
+
if ingres_dirs[0] =~ /files/ and ingres_dirs[1] =~ /lib/
|
16
|
+
puts "Using supplied directories:"
|
17
|
+
puts "Headers - #{ingres_dirs[0]}"
|
18
|
+
puts "Libraries - #{ingres_dirs[1]}"
|
19
|
+
|
20
|
+
elsif ENV["II_SYSTEM"] # fallback
|
21
|
+
puts "Using II_SYSTEM=#{ENV['II_SYSTEM']}"
|
22
|
+
$CFLAGS += " -I#{ENV["II_SYSTEM"]}/ingres/files"
|
23
|
+
if RUBY_PLATFORM !~ /mswin32/
|
24
|
+
libdir = ENV["II_SYSTEM"] + "/ingres/lib"
|
25
|
+
$LDFLAGS += " -L#{libdir}"
|
26
|
+
$LDFLAGS += " -lq.1 -lcompat.1 -lframe.1 -liiapi.1"
|
27
|
+
if RUBY_PLATFORM =~ /solaris/
|
28
|
+
$LDFLAGS += " -lsocket"
|
29
|
+
end
|
30
|
+
if RUBY_PLATFORM =~ /linux/
|
31
|
+
$LDFLAGS += " -lrt"
|
32
|
+
end
|
33
|
+
else
|
34
|
+
libdir = "#{ENV["II_SYSTEM"]}\\ingres\\lib"
|
35
|
+
$LIBPATH.push("-libpath:\"#{libdir}\"")
|
36
|
+
end
|
37
|
+
else
|
38
|
+
puts "Unable to proceed without the environment variable II_SYSTEM or the flags --with-ingres-files/--with-ingres-lib pointing to a valid Ingres installation"
|
39
|
+
exit(1)
|
40
|
+
end
|
41
|
+
|
42
|
+
if have_header('iiapi.h')
|
43
|
+
if RUBY_PLATFORM =~ /mswin32/
|
44
|
+
if have_library('oiapi','IIapi_initialize') # Check for Ingres 2.6
|
45
|
+
have_library('ingres')
|
46
|
+
puts "Found Ingres 2.6 or earlier.\n"
|
47
|
+
elsif have_library('iilibapi','IIapi_initialize')
|
48
|
+
have_library('libingres')
|
49
|
+
puts "Found Ingres 2006/9.0.4 or later.\n"
|
50
|
+
else
|
51
|
+
puts "\n\nI couldn't find the Ingres libraries so I didn't create your Makefile.\n"
|
52
|
+
puts "Do you have Ingres installed?\n"
|
53
|
+
puts "Be sure to use the '--with-ingres-include' and '--with-ingres-lib' options.\n"
|
54
|
+
puts "See the first line of extconf.rb for an example.\n\n"
|
55
|
+
puts "BUILD FAILED\n\n"
|
56
|
+
exit
|
57
|
+
end
|
58
|
+
else
|
59
|
+
|
60
|
+
if have_library('iiapi')
|
61
|
+
else
|
62
|
+
puts "\n\nI couldn't find the Ingres libraries so I didn't create your Makefile.\n"
|
63
|
+
puts "Do you have Ingres installed?\n"
|
64
|
+
puts "Be sure to use the '--with-ingres-include' and '--with-ingres-lib' options.\n"
|
65
|
+
puts "See the first line of extconf.rb for an example.\n\n"
|
66
|
+
puts "BUILD FAILED\n\n"
|
67
|
+
exit
|
68
|
+
end
|
69
|
+
|
70
|
+
if ENV["INGRES_RUBY_DEBUG"] == "Y"
|
71
|
+
$CFLAGS += " -g "
|
72
|
+
end
|
73
|
+
end
|
74
|
+
$OBJS=['Unicode.o','Ingres.c']
|
75
|
+
|
76
|
+
if RUBY_VERSION.to_f >= 1.9
|
77
|
+
$CFLAGS << ' -DRUBY_19_COMPATIBILITY'
|
78
|
+
end
|
79
|
+
|
80
|
+
create_makefile('Ingres')
|
81
|
+
else
|
82
|
+
puts "Unable to find iiapi.h, please verify your setup"
|
83
|
+
end
|
84
|
+
#do not remove the following line
|
85
|
+
#vim: ts=4 sw=4 expandtabs
|
data/ext/tests/config.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# Database and connection information for the tests
|
2
|
+
# Use a vnode for Windows as the build box only has a
|
3
|
+
# client installation
|
4
|
+
if RUBY_PLATFORM =~ /mswin32/
|
5
|
+
@@database = "ruby::demodb"
|
6
|
+
else
|
7
|
+
@@database = "demodb"
|
8
|
+
end
|
9
|
+
@@username = "ruby"
|
10
|
+
@@password = "ruby"
|
11
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresConnection < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_connect
|
8
|
+
ing = Ingres.new()
|
9
|
+
assert_kind_of(Ingres, ing.connect(@@database), "conn is not an Ingres object")
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresConnectionHash < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_connect_hash
|
8
|
+
ing = Ingres.new()
|
9
|
+
assert_kind_of(Ingres, ing.connect(:database => @@database), "conn is not an Ingres object")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_connect_hash_no_database
|
13
|
+
ing = Ingres.new()
|
14
|
+
assert_raise ArgumentError do
|
15
|
+
ing.connect()
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_connect_hash_with_login_password
|
20
|
+
ing = Ingres.new()
|
21
|
+
assert_kind_of(Ingres, ing.connect_with_credentials(:database => @@database, :username => @@username, :password => @@password), "conn is not an Ingres object")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_connect_hash_with_login_only
|
25
|
+
ing = Ingres.new()
|
26
|
+
assert_raise ArgumentError do
|
27
|
+
ing.connect_with_credentials(:database => @@database, :username => @@username)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresConnection < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_connect_with_login_only
|
8
|
+
ing = Ingres.new()
|
9
|
+
assert_raise ArgumentError do
|
10
|
+
ing.connect_with_credentials(@@database,@@username)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresConnection < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_connect_with_login_password
|
8
|
+
ing = Ingres.new()
|
9
|
+
assert_kind_of(Ingres, ing.connect_with_credentials(@@database,@@username,@@password), "conn is not an Ingres object")
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresDualConnections < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_dual_connections
|
8
|
+
ing = Ingres.new()
|
9
|
+
assert_kind_of(Ingres, ing.connect(@@database), "conn is not an Ingres object")
|
10
|
+
ing2 = Ingres.new()
|
11
|
+
assert_kind_of(Ingres, ing2.connect(@@database), "conn is not an Ingres object")
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresEnvionmentDateFormat < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_connect_env_date_iso4
|
8
|
+
@@ing = Ingres.new()
|
9
|
+
@@ing.connect(:database => @@database, :date_format => Ingres::DATE_FORMAT_ISO4)
|
10
|
+
assert_equal "20091109 15:14:00", @@ing.execute("select date('20091109 15:14:00')").flatten[0]
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_connect_env_date_finland
|
14
|
+
@@ing = Ingres.new()
|
15
|
+
@@ing.connect(:database => @@database, :date_format => Ingres::DATE_FORMAT_FINLAND)
|
16
|
+
assert_equal "2009-11-09 15:14:00", @@ing.execute("select date('2009-11-09 15:14:00')").flatten[0]
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_connect_env_date_multinational4
|
20
|
+
@@ing = Ingres.new()
|
21
|
+
@@ing.connect(:database => @@database, :date_format => Ingres::DATE_FORMAT_MULTINATIONAL4)
|
22
|
+
assert_equal "09/11/2009 15:14:00", @@ing.execute("select date('09/11/2009 15:14:00')").flatten[0]
|
23
|
+
end
|
24
|
+
|
25
|
+
# Same as above but using Ingres.set_environment()
|
26
|
+
def test_set_env_date_iso4
|
27
|
+
@@ing = Ingres.new()
|
28
|
+
@@ing.connect(:database => @@database)
|
29
|
+
@@ing.set_environment(:date_format => Ingres::DATE_FORMAT_ISO4)
|
30
|
+
assert_equal "20061012 01:09:00", @@ing.execute("select rt_arrive_at, rt_depart_at from route where rt_depart_from = 'VLL' and rt_arrive_to = 'LHR'")[0][0]
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_set_env_date_finland
|
34
|
+
@@ing = Ingres.new()
|
35
|
+
@@ing.connect(:database => @@database)
|
36
|
+
@@ing.set_environment(:date_format => Ingres::DATE_FORMAT_FINLAND)
|
37
|
+
assert_equal "2006-10-11 20:26:00", @@ing.execute("select rt_arrive_at, rt_depart_at from route where rt_depart_from = 'VLL' and rt_arrive_to = 'LHR'")[0][1]
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_set_env_date_multinational4
|
41
|
+
@@ing = Ingres.new()
|
42
|
+
@@ing.connect(:database => @@database)
|
43
|
+
@@ing.set_environment(:date_format => Ingres::DATE_FORMAT_MULTINATIONAL4)
|
44
|
+
assert_equal "11/10/2006 23:40:00", @@ing.execute("select rt_arrive_at, rt_depart_at from route where rt_depart_from = 'VLL' and rt_arrive_to = 'LHR'")[1][0]
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresQuerySimple < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@@ing = Ingres.new()
|
9
|
+
assert_kind_of(Ingres, @@ing.connect(@@database, @@username, @@password), "conn is not an Ingres object")
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
@@ing.disconnect
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_query_username
|
17
|
+
# ing.execute returns and array so we want the first and only element
|
18
|
+
assert_equal @@username, @@ing.execute("select dbmsinfo('session_user')").flatten[0]
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_tables
|
22
|
+
if @@database == "demodb"
|
23
|
+
assert_not_nil @@ing.tables.include? "airport"
|
24
|
+
assert_not_nil @@ing.tables.include? "country"
|
25
|
+
assert_not_nil @@ing.tables.include? "user_profile"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresQueryUsername < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@ing = Ingres.new()
|
9
|
+
@ing.connect(@@database, @@username, @@password)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_query_username
|
13
|
+
# ing.execute returns and array so we want the first and only element
|
14
|
+
assert_equal @@username, @ing.execute("select dbmsinfo('username')")[0][0]
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_tables
|
18
|
+
# ing.execute returns and array so we want the first and only element
|
19
|
+
assert_not_nil @ing.tables.include? "airport"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'Ingres'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ext/tests/config.rb'
|
4
|
+
|
5
|
+
class TestIngresTransactionSavePoints < Test::Unit::TestCase
|
6
|
+
|
7
|
+
# Data set used for inserting
|
8
|
+
@@data = [[1, "one"], [2, "two"], [3, "three"], [4, "four"], [5, "five"], [6, "six"], [7, "seven"], [8, "eight"], [9, "nine"], [10, "ten"]]
|
9
|
+
# Some savepoint => rollback values in the form of at savepoint x rollback to (=>) y
|
10
|
+
@@rollback_points = { 5 => 3, 7 => 6 }
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@@ing = Ingres.new()
|
14
|
+
#@@ing.set_debug_flag("GLOBAL_DEBUG","TRUE")
|
15
|
+
assert_kind_of(Ingres, @@ing.connect(@@database, @@username, @@password), "conn is not an Ingres object")
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
# drop the savepoint_tests table if it happens to be around still
|
20
|
+
if @@ing.tables.include? "savepoint_tests"
|
21
|
+
@@ing.execute "drop table savepoint_tests"
|
22
|
+
end
|
23
|
+
@@ing.disconnect
|
24
|
+
end
|
25
|
+
|
26
|
+
# A simple test to create a savepoint, if this fails then the rest of this unit test
|
27
|
+
# has no chance
|
28
|
+
def test_savepoint_single
|
29
|
+
@@ing.execute "start transaction"
|
30
|
+
@@ing.execute "create table savepoint_tests (id integer not null, txt varchar(100))"
|
31
|
+
@@ing.savepoint "savepoint_1"
|
32
|
+
@@ing.execute "insert into savepoint_tests values (1, 'one')"
|
33
|
+
@@ing.rollback
|
34
|
+
end
|
35
|
+
|
36
|
+
# Generate a savepoint for each insert into the table and rollback them all at the end
|
37
|
+
def test_savepoint_multiple
|
38
|
+
@@ing.execute "start transaction"
|
39
|
+
@@ing.execute "create table savepoint_tests (id integer not null, txt varchar(100))"
|
40
|
+
@@data.each { |element|
|
41
|
+
@@ing.execute("insert into savepoint_tests values (#{element[0]}, '#{element[1]}')")
|
42
|
+
@@ing.savepoint "savepoint_#{element[0]}"
|
43
|
+
}
|
44
|
+
@@ing.rollback
|
45
|
+
end
|
46
|
+
|
47
|
+
# Generate a savepoint for each insert then rollback to specified savepoints verifying
|
48
|
+
# we have actually rolled back
|
49
|
+
def test_savepoint_named_rollback
|
50
|
+
@@ing.execute "start transaction"
|
51
|
+
@@ing.execute "create table savepoint_tests (id integer not null, txt varchar(100))"
|
52
|
+
@@data.each { |element|
|
53
|
+
@@ing.execute("insert into savepoint_tests values (#{element[0]}, '#{element[1]}')")
|
54
|
+
@@ing.savepoint "savepoint_#{element[0]}"
|
55
|
+
}
|
56
|
+
@@ing.rollback "savepoint_8"
|
57
|
+
assert_equal 8, @@ing.execute("select max(id) from savepoint_tests").flatten[0]
|
58
|
+
@@ing.rollback "savepoint_5"
|
59
|
+
assert_equal 5, @@ing.execute("select max(id) from savepoint_tests").flatten[0]
|
60
|
+
@@ing.rollback "savepoint_3"
|
61
|
+
assert_equal 3, @@ing.execute("select max(id) from savepoint_tests").flatten[0]
|
62
|
+
@@ing.rollback
|
63
|
+
end
|
64
|
+
|
65
|
+
# Test the ability to carry on working after a rollback has been issued against a named savepoint.
|
66
|
+
# Then carry on inserting then rollback again.
|
67
|
+
def test_savepoint_nested_transactions
|
68
|
+
@@ing.execute "start transaction"
|
69
|
+
@@ing.execute "create table savepoint_tests (id integer not null, txt varchar(100))"
|
70
|
+
@@data.each { |data_set|
|
71
|
+
@@ing.execute("insert into savepoint_tests values (#{data_set[0]}, '#{data_set[1]}')")
|
72
|
+
@@ing.savepoint "savepoint_#{data_set[0]}"
|
73
|
+
if @@rollback_points.has_key?(data_set[0])
|
74
|
+
@savepoint_no = @@rollback_points.values_at(data_set[0])
|
75
|
+
@@ing.rollback "savepoint_#{@savepoint_no}"
|
76
|
+
assert_equal @savepoint_no, @@ing.execute("select max(id) from savepoint_tests").flatten
|
77
|
+
end
|
78
|
+
}
|
79
|
+
@@ing.rollback
|
80
|
+
end
|
81
|
+
|
82
|
+
# Verify the driver raises a RuntimeError exception when rolling back to a non-existant
|
83
|
+
# savepoint
|
84
|
+
def test_savepoint_rollback_non_existent
|
85
|
+
@@ing.execute "start transaction"
|
86
|
+
@@ing.execute "create table savepoint_tests (id integer not null, txt varchar(100))"
|
87
|
+
@@data.each { |data_set|
|
88
|
+
@@ing.execute("insert into savepoint_tests values (#{data_set[0]}, '#{data_set[1]}')")
|
89
|
+
@@ing.savepoint "savepoint_#{data_set[0]}"
|
90
|
+
if (data_set[0]) == 5
|
91
|
+
@@ing.rollback "savepoint_3"
|
92
|
+
assert_equal 3, @@ing.execute("select max(id) from savepoint_tests").flatten[0]
|
93
|
+
end
|
94
|
+
}
|
95
|
+
assert_raise RuntimeError do
|
96
|
+
@@ing.rollback "savepoint_5"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Ingres requires that a transaction has been started using "start transaction" before
|
101
|
+
# a savepoint can be created
|
102
|
+
def test_savepoint_no_transaction
|
103
|
+
# Cannot start a savepoint with no active transaction
|
104
|
+
assert_raise RuntimeError do
|
105
|
+
@@ing.savepoint "savepoint_1"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|