activerecord-jdbc-adapter 1.3.0.beta1 → 1.3.0.beta2
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/.gitignore +12 -11
- data/.travis.yml +36 -7
- data/Appraisals +3 -3
- data/Gemfile +1 -1
- data/Gemfile.lock +13 -6
- data/History.txt +64 -0
- data/README.md +8 -1
- data/Rakefile +3 -1
- data/gemfiles/rails23.gemfile +1 -1
- data/gemfiles/rails23.gemfile.lock +6 -5
- data/gemfiles/rails30.gemfile +1 -1
- data/gemfiles/rails30.gemfile.lock +7 -6
- data/gemfiles/rails31.gemfile +1 -1
- data/gemfiles/rails31.gemfile.lock +6 -5
- data/gemfiles/rails32.gemfile +1 -1
- data/gemfiles/rails32.gemfile.lock +6 -5
- data/gemfiles/rails40.gemfile +2 -4
- data/gemfiles/rails40.gemfile.lock +37 -51
- data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
- data/lib/active_record/connection_adapters/db2_adapter.rb +1 -1
- data/lib/arel/visitors/db2.rb +5 -1
- data/lib/arel/visitors/hsqldb.rb +1 -0
- data/lib/arel/visitors/sql_server.rb +55 -13
- data/lib/arjdbc/db2/adapter.rb +197 -227
- data/lib/arjdbc/db2/as400.rb +124 -0
- data/lib/arjdbc/db2/connection_methods.rb +20 -1
- data/lib/arjdbc/derby/adapter.rb +17 -85
- data/lib/arjdbc/derby/connection_methods.rb +2 -1
- data/lib/arjdbc/discover.rb +55 -47
- data/lib/arjdbc/h2/adapter.rb +52 -18
- data/lib/arjdbc/h2/connection_methods.rb +10 -2
- data/lib/arjdbc/hsqldb/adapter.rb +33 -9
- data/lib/arjdbc/hsqldb/connection_methods.rb +10 -2
- data/lib/arjdbc/informix.rb +2 -1
- data/lib/arjdbc/jdbc.rb +5 -1
- data/lib/arjdbc/jdbc/adapter.rb +167 -89
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
- data/lib/arjdbc/jdbc/base_ext.rb +25 -3
- data/lib/arjdbc/jdbc/callbacks.rb +9 -8
- data/lib/arjdbc/jdbc/column.rb +8 -20
- data/lib/arjdbc/jdbc/connection.rb +69 -80
- data/lib/arjdbc/jdbc/extension.rb +6 -8
- data/lib/arjdbc/jdbc/jdbc.rake +3 -141
- data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
- data/lib/arjdbc/mssql/adapter.rb +108 -34
- data/lib/arjdbc/mssql/connection_methods.rb +3 -1
- data/lib/arjdbc/mssql/limit_helpers.rb +3 -2
- data/lib/arjdbc/mssql/lock_helpers.rb +5 -1
- data/lib/arjdbc/mysql/adapter.rb +127 -70
- data/lib/arjdbc/mysql/connection_methods.rb +5 -2
- data/lib/arjdbc/oracle/adapter.rb +124 -94
- data/lib/arjdbc/oracle/connection_methods.rb +2 -1
- data/lib/arjdbc/postgresql/adapter.rb +99 -67
- data/lib/arjdbc/postgresql/column_cast.rb +3 -5
- data/lib/arjdbc/postgresql/connection_methods.rb +6 -6
- data/lib/arjdbc/railtie.rb +3 -1
- data/lib/arjdbc/sqlite3/adapter.rb +60 -43
- data/lib/arjdbc/sqlite3/connection_methods.rb +9 -9
- data/lib/arjdbc/sybase.rb +1 -1
- data/lib/arjdbc/tasks.rb +13 -0
- data/lib/arjdbc/tasks/database_tasks.rb +50 -0
- data/lib/arjdbc/tasks/databases.rake +89 -0
- data/lib/arjdbc/tasks/databases3.rake +203 -0
- data/lib/arjdbc/tasks/databases4.rake +39 -0
- data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
- data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
- data/lib/arjdbc/tasks/h2_database_tasks.rb +29 -0
- data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
- data/lib/arjdbc/tasks/jdbc_database_tasks.rb +122 -0
- data/lib/arjdbc/tasks/mssql_database_tasks.rb +36 -0
- data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
- data/lib/arjdbc/tasks/oracle_database_tasks.rb +62 -0
- data/lib/arjdbc/version.rb +1 -1
- data/pom.xml +11 -12
- data/rails_generators/jdbc_generator.rb +1 -1
- data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
- data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
- data/rakelib/02-test.rake +42 -15
- data/rakelib/compile.rake +29 -2
- data/rakelib/db.rake +2 -1
- data/rakelib/rails.rake +23 -6
- data/src/java/arjdbc/ArJdbcModule.java +175 -0
- data/src/java/arjdbc/db2/DB2Module.java +2 -1
- data/src/java/arjdbc/derby/DerbyModule.java +5 -24
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +3 -2
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +3 -46
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1001 -259
- data/src/java/arjdbc/mssql/MSSQLModule.java +2 -1
- data/src/java/arjdbc/mysql/MySQLModule.java +4 -3
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +12 -7
- data/src/java/arjdbc/oracle/OracleModule.java +2 -1
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +2 -1
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +12 -0
- data/test/db/db2.rb +14 -7
- data/test/db/db2/rake_test.rb +82 -0
- data/test/db/db2/rake_test_data.sql +35 -0
- data/test/db/db2/simple_test.rb +20 -0
- data/test/db/db2/unit_test.rb +3 -1
- data/test/db/derby.rb +7 -5
- data/test/db/derby/rake_test.rb +96 -0
- data/test/db/derby/simple_test.rb +10 -2
- data/test/db/h2.rb +6 -8
- data/test/db/h2/identity_column_test.rb +35 -0
- data/test/db/h2/offset_test.rb +49 -0
- data/test/db/h2/rake_test.rb +98 -0
- data/test/db/h2/schema_dump_test.rb +5 -1
- data/test/db/hsqldb.rb +6 -10
- data/test/db/hsqldb/rake_test.rb +101 -0
- data/test/db/hsqldb/schema_dump_test.rb +5 -1
- data/test/db/hsqldb/simple_test.rb +8 -0
- data/test/db/jndi_config.rb +1 -3
- data/test/db/jndi_pooled_config.rb +1 -3
- data/test/db/mssql/limit_offset_test.rb +23 -14
- data/test/db/mssql/rake_test.rb +143 -0
- data/test/db/mysql/_rails_test_mysql.32.out +1069 -1252
- data/test/db/mysql/nonstandard_primary_key_test.rb +21 -24
- data/test/db/mysql/rake_test.rb +97 -0
- data/test/db/mysql/schema_dump_test.rb +11 -11
- data/test/db/mysql/simple_test.rb +52 -3
- data/test/db/mysql/statement_escaping_test.rb +46 -0
- data/test/db/oracle/rake_test.rb +100 -0
- data/test/db/oracle/simple_test.rb +48 -0
- data/test/db/postgres/_rails_test_postgres.32.out +998 -1370
- data/test/db/postgres/active_schema_unit_test.rb +68 -0
- data/test/db/postgres/connection_test.rb +10 -2
- data/test/db/postgres/data_types_test.rb +2 -2
- data/test/db/postgres/ltree_test.rb +6 -5
- data/test/db/postgres/native_types_test.rb +1 -5
- data/test/db/postgres/rake_test.rb +117 -0
- data/test/db/postgres/schema_dump_test.rb +9 -2
- data/test/db/postgres/schema_test.rb +4 -2
- data/test/db/postgres/simple_test.rb +57 -16
- data/test/db/sqlite3.rb +3 -10
- data/test/db/sqlite3/_rails_test_sqlite3.32.out +1070 -1298
- data/test/db/sqlite3/rake_test.rb +71 -0
- data/test/db/sqlite3/simple_test.rb +9 -9
- data/test/has_many_through.rb +4 -1
- data/test/jdbc/db2.rb +14 -1
- data/test/jdbc_column_test.rb +23 -0
- data/test/{generic_jdbc_connection_test.rb → jdbc_connection_test.rb} +22 -17
- data/test/jndi_callbacks_test.rb +26 -28
- data/test/jndi_test.rb +7 -16
- data/test/models/data_types.rb +2 -1
- data/test/models/thing.rb +1 -0
- data/test/rails/mysql.rb +13 -0
- data/test/rails/sqlite3/version.rb +6 -0
- data/test/rails_stub.rb +31 -0
- data/test/rake_test_support.rb +298 -0
- data/test/serialize.rb +2 -4
- data/test/{helper.rb → shared_helper.rb} +0 -0
- data/test/simple.rb +167 -93
- data/test/test_helper.rb +52 -16
- metadata +388 -354
- data/lib/pg.rb +0 -26
- data/test/abstract_db_create.rb +0 -139
- data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -36
- data/test/db/mssql/db_create_test.rb +0 -29
- data/test/db/mysql/db_create_test.rb +0 -33
- data/test/db/postgres/db_create_test.rb +0 -44
- data/test/db/postgres/db_drop_test.rb +0 -17
|
@@ -40,9 +40,10 @@ import org.jruby.runtime.builtin.IRubyObject;
|
|
|
40
40
|
*/
|
|
41
41
|
public class MSSQLModule {
|
|
42
42
|
|
|
43
|
-
public static
|
|
43
|
+
public static RubyModule load(final RubyModule arJdbc) {
|
|
44
44
|
RubyModule mssql = arJdbc.defineModuleUnder("MSSQL");
|
|
45
45
|
mssql.defineAnnotatedMethods( MSSQLModule.class );
|
|
46
|
+
return mssql;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
@JRubyMethod(name = "quote_string", required = 1, frame = false)
|
|
@@ -42,9 +42,10 @@ import org.jruby.util.ByteList;
|
|
|
42
42
|
|
|
43
43
|
public class MySQLModule {
|
|
44
44
|
|
|
45
|
-
public static
|
|
46
|
-
RubyModule
|
|
47
|
-
|
|
45
|
+
public static RubyModule load(final RubyModule arJdbc) {
|
|
46
|
+
RubyModule mysql = arJdbc.defineModuleUnder("MySQL");
|
|
47
|
+
mysql.defineAnnotatedMethods(MySQLModule.class);
|
|
48
|
+
return mysql;
|
|
48
49
|
}
|
|
49
50
|
|
|
50
51
|
//private final static byte[] ZERO = new byte[] {'\\','0'};
|
|
@@ -80,19 +80,24 @@ public class MySQLRubyJdbcConnection extends RubyJdbcConnection {
|
|
|
80
80
|
return super.jdbcToRuby(runtime, column, type, resultSet);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
public static RubyClass createMySQLJdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
|
|
84
|
-
RubyClass clazz = RubyJdbcConnection.getConnectionAdapters(runtime).defineClassUnder("MySQLJdbcConnection",
|
|
85
|
-
jdbcConnection, MYSQL_JDBCCONNECTION_ALLOCATOR);
|
|
86
|
-
clazz.defineAnnotatedMethods(MySQLRubyJdbcConnection.class);
|
|
87
|
-
|
|
88
|
-
return clazz;
|
|
89
|
-
}
|
|
90
83
|
private static ObjectAllocator MYSQL_JDBCCONNECTION_ALLOCATOR = new ObjectAllocator() {
|
|
91
84
|
public IRubyObject allocate(Ruby runtime, RubyClass klass) {
|
|
92
85
|
return new MySQLRubyJdbcConnection(runtime, klass);
|
|
93
86
|
}
|
|
94
87
|
};
|
|
88
|
+
|
|
89
|
+
public static RubyClass createMySQLJdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
|
|
90
|
+
RubyClass clazz = getConnectionAdapters(runtime).
|
|
91
|
+
defineClassUnder("MySQLJdbcConnection", jdbcConnection, MYSQL_JDBCCONNECTION_ALLOCATOR);
|
|
92
|
+
clazz.defineAnnotatedMethods(MySQLRubyJdbcConnection.class);
|
|
93
|
+
return clazz;
|
|
94
|
+
}
|
|
95
95
|
|
|
96
|
+
/*
|
|
97
|
+
public static RubyClass getMySQLJdbcConnectionClass(final Ruby runtime) {
|
|
98
|
+
return getConnectionAdapters(runtime).getClass("MySQLJdbcConnection");
|
|
99
|
+
} */
|
|
100
|
+
|
|
96
101
|
@Override
|
|
97
102
|
protected IRubyObject indexes(final ThreadContext context, final String tableName, final String name, final String schemaName) {
|
|
98
103
|
return withConnection(context, new Callable<IRubyObject>() {
|
|
@@ -40,9 +40,10 @@ import org.jruby.runtime.builtin.IRubyObject;
|
|
|
40
40
|
*/
|
|
41
41
|
public class OracleModule {
|
|
42
42
|
|
|
43
|
-
public static
|
|
43
|
+
public static RubyModule load(final RubyModule arJdbc) {
|
|
44
44
|
RubyModule oracle = arJdbc.defineModuleUnder("Oracle");
|
|
45
45
|
oracle.defineAnnotatedMethods( OracleModule.class );
|
|
46
|
+
return oracle;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
@JRubyMethod(name = "quote_string", required = 1, frame = false)
|
|
@@ -39,9 +39,10 @@ import org.jruby.util.ByteList;
|
|
|
39
39
|
*/
|
|
40
40
|
public class SQLite3Module {
|
|
41
41
|
|
|
42
|
-
public static
|
|
42
|
+
public static RubyModule load(final RubyModule arJdbc) {
|
|
43
43
|
RubyModule sqlite3 = arJdbc.defineModuleUnder("SQLite3");
|
|
44
44
|
sqlite3.defineAnnotatedMethods( SQLite3Module.class );
|
|
45
|
+
return sqlite3;
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
@JRubyMethod(name = "quote_string", required = 1, frame = false)
|
|
@@ -92,6 +92,18 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
@Override
|
|
96
|
+
protected Statement createStatement(final ThreadContext context, final Connection connection)
|
|
97
|
+
throws SQLException {
|
|
98
|
+
final Statement statement = connection.createStatement();
|
|
99
|
+
IRubyObject statementEscapeProcessing = getConfigValue(context, "statement_escape_processing");
|
|
100
|
+
if ( ! statementEscapeProcessing.isNil() ) {
|
|
101
|
+
statement.setEscapeProcessing(statementEscapeProcessing.isTrue());
|
|
102
|
+
}
|
|
103
|
+
// else leave as is by default
|
|
104
|
+
return statement;
|
|
105
|
+
}
|
|
106
|
+
|
|
95
107
|
@Override
|
|
96
108
|
protected IRubyObject jdbcToRuby(final Ruby runtime, final int column, int type, final ResultSet resultSet)
|
|
97
109
|
throws SQLException {
|
data/test/db/db2.rb
CHANGED
|
@@ -9,24 +9,31 @@ config[:port] = ENV['DB2PORT'] if ENV['DB2PORT']
|
|
|
9
9
|
config[:username] = ENV['DB2USER'] if ENV['DB2USER'] # db2inst1
|
|
10
10
|
config[:password] = ENV['DB2PASS'] if ENV['DB2PASS']
|
|
11
11
|
|
|
12
|
+
# for AS400 specify the full JDBC URL "jdbc:as400://..."
|
|
13
|
+
config[:url] = ENV['DB2URL'] if ENV['DB2URL']
|
|
14
|
+
|
|
12
15
|
# DB2 does not like "_" in database names :
|
|
13
16
|
# SQL0104N An unexpected token "weblog_development" was found
|
|
14
17
|
# create the sample database using `db2sampl` command
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
config[:
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
unless config[:url]
|
|
19
|
+
database = ENV['DB2DATABASE'] || 'SAMPLE'
|
|
20
|
+
if config[:host]
|
|
21
|
+
config[:database] = database
|
|
22
|
+
else
|
|
23
|
+
config[:url] = "jdbc:db2:#{database}" # local instance
|
|
24
|
+
end
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
require 'jdbc/db2'
|
|
23
28
|
# Download IBM DB2 JCC driver from :
|
|
24
29
|
# https://www-304.ibm.com/support/docview.wss?rs=4020&uid=swg21385217
|
|
30
|
+
# or http://sourceforge.net/projects/jt400/ for AS400
|
|
31
|
+
jdbc_db2 = (config[:url] || '') =~ /\:as400/ ? Jdbc::AS400 : Jdbc::DB2
|
|
25
32
|
begin
|
|
26
|
-
Java::JavaClass.for_name(
|
|
33
|
+
Java::JavaClass.for_name(jdbc_db2.driver_name)
|
|
27
34
|
rescue NameError
|
|
28
35
|
begin
|
|
29
|
-
|
|
36
|
+
jdbc_db2.load_driver
|
|
30
37
|
rescue LoadError => e
|
|
31
38
|
puts "Please setup a JDBC driver to run the DB2 tests !"
|
|
32
39
|
raise e
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'rake_test_support'
|
|
2
|
+
require 'db/db2'
|
|
3
|
+
|
|
4
|
+
class DB2RakeDbCreateTest < Test::Unit::TestCase
|
|
5
|
+
include RakeTestSupport
|
|
6
|
+
|
|
7
|
+
def db_name; nil; end # using same DB (db:create is a bit IBM-plicated)
|
|
8
|
+
|
|
9
|
+
test 'rake db:test:purge' do
|
|
10
|
+
# Rake::Task["db:create"].invoke
|
|
11
|
+
create_rake_test_database do |connection|
|
|
12
|
+
create_schema_migrations_table(connection)
|
|
13
|
+
connection.create_table('ibmers_test') { |t| t.string :name }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
Rake::Task["db:test:purge"].invoke
|
|
17
|
+
|
|
18
|
+
establish_test_connection
|
|
19
|
+
assert_false ActiveRecord::Base.connection.table_exists?('ibmers_test')
|
|
20
|
+
ActiveRecord::Base.connection.disconnect!
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test 'rake db:structure:dump (and db:structure:load)' do
|
|
24
|
+
# Rake::Task["db:create"].invoke
|
|
25
|
+
create_rake_test_database do |connection|
|
|
26
|
+
drop_all_database_tables(connection)
|
|
27
|
+
create_sample_database_data(connection)
|
|
28
|
+
create_schema_migrations_table(connection)
|
|
29
|
+
connection.create_table('ibmers') { |t| t.string :name; t.timestamps }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
structure_sql = File.join('db', structure_sql_filename)
|
|
33
|
+
begin
|
|
34
|
+
Dir.mkdir 'db' # db/structure.sql
|
|
35
|
+
Rake::Task["db:structure:dump"].invoke
|
|
36
|
+
|
|
37
|
+
assert File.exists?(structure_sql)
|
|
38
|
+
assert_match /CREATE TABLE ibmers/im, File.read(structure_sql)
|
|
39
|
+
|
|
40
|
+
# db:structure:load
|
|
41
|
+
drop_all_database_tables
|
|
42
|
+
create_rake_test_database
|
|
43
|
+
Rake::Task["db:structure:load"].invoke
|
|
44
|
+
|
|
45
|
+
establish_test_connection
|
|
46
|
+
assert ActiveRecord::Base.connection.table_exists?('ibmers')
|
|
47
|
+
ActiveRecord::Base.connection.disconnect!
|
|
48
|
+
ensure
|
|
49
|
+
File.delete(structure_sql) if File.exists?(structure_sql)
|
|
50
|
+
Dir.rmdir 'db'
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
setup { rm_r 'db' if File.exist?('db') }
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def establish_test_connection
|
|
59
|
+
config = db_config.dup
|
|
60
|
+
config.merge! :database => db_name if db_name
|
|
61
|
+
ActiveRecord::Base.establish_connection config
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def create_sample_database_data(connection)
|
|
65
|
+
filename = File.expand_path('rake_test_data.sql', File.dirname(__FILE__))
|
|
66
|
+
File.read(filename).split(/;\n\n/).each { |ddl| connection.execute(ddl) }
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def drop_all_database_tables(connection = nil)
|
|
70
|
+
established = nil
|
|
71
|
+
connection ||= begin
|
|
72
|
+
ActiveRecord::Base.connection
|
|
73
|
+
rescue
|
|
74
|
+
ActiveRecord::Base.establish_connection db_config
|
|
75
|
+
established = true
|
|
76
|
+
ActiveRecord::Base.connection
|
|
77
|
+
end
|
|
78
|
+
connection.tables.each { |table| connection.drop_table(table) }
|
|
79
|
+
ActiveRecord::Base.connection.disconnect! if established
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
CREATE TABLE EMPLOYEE (
|
|
2
|
+
EMPNO CHAR(6) NOT NULL,
|
|
3
|
+
FIRSTNME VARCHAR(12) NOT NULL,
|
|
4
|
+
MIDINIT CHAR(1),
|
|
5
|
+
LASTNAME VARCHAR(15) NOT NULL,
|
|
6
|
+
WORKDEPT CHAR(3),
|
|
7
|
+
PHONENO CHAR(4),
|
|
8
|
+
HIREDATE DATE,
|
|
9
|
+
JOB CHAR(8),
|
|
10
|
+
EDLEVEL SMALLINT NOT NULL,
|
|
11
|
+
SEX CHAR(1),
|
|
12
|
+
BIRTHDATE DATE,
|
|
13
|
+
SALARY DECIMAL(9,2),
|
|
14
|
+
BONUS DECIMAL(9,2),
|
|
15
|
+
COMM DECIMAL(9,2)
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
ALTER TABLE EMPLOYEE ADD CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPNO);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE EMP_PHOTO (
|
|
21
|
+
EMPNO CHAR(6) NOT NULL,
|
|
22
|
+
PHOTO_FORMAT VARCHAR(10) NOT NULL,
|
|
23
|
+
PICTURE BLOB(102400)
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
ALTER TABLE EMP_PHOTO ADD CONSTRAINT PK_EMP_PHOTO PRIMARY KEY (EMPNO, PHOTO_FORMAT);
|
|
27
|
+
|
|
28
|
+
CREATE TABLE EMP_RESUME (
|
|
29
|
+
EMPNO CHAR(6) NOT NULL,
|
|
30
|
+
RESUME_FORMAT VARCHAR(10) NOT NULL,
|
|
31
|
+
RESUME CLOB(5120)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
ALTER TABLE EMP_RESUME ADD CONSTRAINT PK_EMP_RESUME PRIMARY KEY (EMPNO, RESUME_FORMAT);
|
|
35
|
+
|
data/test/db/db2/simple_test.rb
CHANGED
|
@@ -42,6 +42,26 @@ class DB2SimpleTest < Test::Unit::TestCase
|
|
|
42
42
|
assert_equal false, e.sample_boolean?
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
+
def test_emulates_booleans_by_default
|
|
46
|
+
assert_true ArJdbc::DB2.emulate_booleans
|
|
47
|
+
end if ar_version('3.0')
|
|
48
|
+
|
|
49
|
+
def test_boolean_emulation_can_be_disabled
|
|
50
|
+
db_type = DbType.create! :sample_boolean => true
|
|
51
|
+
column = DbType.columns.find { |col| col.name.to_s == 'sample_boolean' }
|
|
52
|
+
assert_equal :boolean, column.type
|
|
53
|
+
ArJdbc::DB2.emulate_booleans = false
|
|
54
|
+
|
|
55
|
+
DbType.reset_column_information
|
|
56
|
+
column = DbType.columns.find { |col| col.name.to_s == 'sample_boolean' }
|
|
57
|
+
assert_equal :integer, column.type
|
|
58
|
+
|
|
59
|
+
assert_equal 1, db_type.reload.sample_boolean
|
|
60
|
+
ensure
|
|
61
|
+
ArJdbc::DB2.emulate_booleans = true
|
|
62
|
+
DbType.reset_column_information
|
|
63
|
+
end if ar_version('3.0')
|
|
64
|
+
|
|
45
65
|
def test_find_by_sql_WITH_statement
|
|
46
66
|
user = User.create! :login => 'ferko'
|
|
47
67
|
Entry.create! :title => 'aaa', :user_id => user.id
|
data/test/db/db2/unit_test.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'test_helper'
|
|
2
2
|
require 'arjdbc/db2'
|
|
3
|
+
require 'arjdbc/db2/as400'
|
|
3
4
|
|
|
4
5
|
class DB2UnitTest < Test::Unit::TestCase
|
|
5
6
|
|
|
@@ -52,7 +53,8 @@ class DB2UnitTest < Test::Unit::TestCase
|
|
|
52
53
|
private
|
|
53
54
|
|
|
54
55
|
def new_adapter_stub(config = {})
|
|
55
|
-
config = config.merge({ :adapter => 'jdbc'
|
|
56
|
+
config = config.merge({ :adapter => 'jdbc' })
|
|
57
|
+
config[:adapter_spec] ||= config[:url] =~ /as400/ ? ArJdbc::AS400 : ArJdbc::DB2
|
|
56
58
|
connection = stub('connection'); logger = nil
|
|
57
59
|
connection.stub_everything
|
|
58
60
|
adapter = ActiveRecord::ConnectionAdapters::JdbcAdapter.new connection, logger, config
|
data/test/db/derby.rb
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
require 'test_helper'
|
|
2
2
|
|
|
3
|
-
config = {
|
|
4
|
-
:adapter => 'derby',
|
|
5
|
-
:database => "derby-testdb"
|
|
6
|
-
}
|
|
3
|
+
config = { :adapter => 'derby', :database => 'test.derby' }
|
|
7
4
|
|
|
8
5
|
ActiveRecord::Base.establish_connection(config)
|
|
9
6
|
|
|
10
|
-
at_exit
|
|
7
|
+
at_exit do
|
|
8
|
+
Dir.glob('test*.derby').each do |dir|
|
|
9
|
+
FileUtils.rm_rf(dir)
|
|
10
|
+
File.delete(dir) if File.exist?(dir)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
require 'rake_test_support'
|
|
2
|
+
require 'db/derby'
|
|
3
|
+
|
|
4
|
+
class DerbyRakeTest < Test::Unit::TestCase
|
|
5
|
+
include RakeTestSupport
|
|
6
|
+
|
|
7
|
+
def db_name; 'test-rake.derby'; end
|
|
8
|
+
|
|
9
|
+
def do_teardown
|
|
10
|
+
drop_rake_test_database(:silence)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
test 'rake db:create' do
|
|
14
|
+
Rake::Task["db:create"].invoke
|
|
15
|
+
assert_true File.directory?('test-rake.derby')
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
test 'rake db:drop' do
|
|
19
|
+
create_rake_test_database
|
|
20
|
+
|
|
21
|
+
Rake::Task["db:drop"].invoke
|
|
22
|
+
assert_false File.directory?('test-rake.derby')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
test 'rake db:test:purge' do
|
|
26
|
+
ActiveRecord::Base.connection.disconnect!
|
|
27
|
+
# Rake::Task["db:create"].invoke
|
|
28
|
+
create_rake_test_database do |connection|
|
|
29
|
+
connection.create_table('users') { |t| t.string :name }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
Rake::Task["db:test:purge"].invoke
|
|
33
|
+
|
|
34
|
+
ActiveRecord::Base.establish_connection db_config.merge :database => db_name
|
|
35
|
+
assert_false ActiveRecord::Base.connection.table_exists?('users')
|
|
36
|
+
ActiveRecord::Base.connection.disconnect!
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
test 'rake db:structure:dump (and db:structure:load)' do
|
|
40
|
+
# NOTE: need to change db name esp. when run with other (rake) tests
|
|
41
|
+
# since Derby can not handle too much create/rm - gets inconsistent
|
|
42
|
+
db_name = @db_name = 'test-dump-rake.derby'
|
|
43
|
+
create_rake_test_database(db_name) do |connection|
|
|
44
|
+
create_schema_migrations_table(connection)
|
|
45
|
+
connection.create_table('users') { |t| t.string :name; t.timestamps }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
structure_sql = File.join('db', structure_sql_filename)
|
|
49
|
+
begin
|
|
50
|
+
Dir.mkdir 'db' # db/structure.sql
|
|
51
|
+
Rake::Task["db:structure:dump"].invoke
|
|
52
|
+
|
|
53
|
+
assert File.exists?(structure_sql)
|
|
54
|
+
assert_match /CREATE TABLE "?USERS"?/i, File.read(structure_sql)
|
|
55
|
+
|
|
56
|
+
# db:structure:load
|
|
57
|
+
ActiveRecord::Base.connection.disconnect!
|
|
58
|
+
# drop_rake_test_database(:silence)
|
|
59
|
+
ActiveRecord::Base.establish_connection db_config.merge :database => db_name
|
|
60
|
+
ActiveRecord::Base.connection.drop_table('users')
|
|
61
|
+
ActiveRecord::Base.connection.drop_table('schema_migrations')
|
|
62
|
+
ActiveRecord::Base.connection.disconnect!
|
|
63
|
+
|
|
64
|
+
Rake::Task["db:structure:load"].invoke
|
|
65
|
+
|
|
66
|
+
ActiveRecord::Base.establish_connection db_config.merge :database => db_name
|
|
67
|
+
assert ActiveRecord::Base.connection.table_exists?('users')
|
|
68
|
+
ActiveRecord::Base.connection.disconnect!
|
|
69
|
+
ensure
|
|
70
|
+
File.delete(structure_sql) if File.exists?(structure_sql)
|
|
71
|
+
Dir.rmdir 'db'
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# test 'rake db:charset' do
|
|
76
|
+
# expect_rake_output('UTF-8')
|
|
77
|
+
# Rake::Task["db:charset"].invoke
|
|
78
|
+
# end
|
|
79
|
+
|
|
80
|
+
def create_rake_test_database(db_name = self.db_name)
|
|
81
|
+
ActiveRecord::Base.establish_connection db_config.merge :database => db_name
|
|
82
|
+
if block_given?
|
|
83
|
+
yield ActiveRecord::Base.connection
|
|
84
|
+
end
|
|
85
|
+
ActiveRecord::Base.connection.disconnect!
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def drop_rake_test_database(silence = nil)
|
|
89
|
+
if silence
|
|
90
|
+
FileUtils.rm_rf(@db_name) if File.exists?(@db_name)
|
|
91
|
+
else
|
|
92
|
+
FileUtils.rm_rf(@db_name)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
@@ -8,6 +8,13 @@ class DerbySimpleTest < Test::Unit::TestCase
|
|
|
8
8
|
include ActiveRecord3TestMethods
|
|
9
9
|
include CustomSelectTestMethods
|
|
10
10
|
|
|
11
|
+
# @override
|
|
12
|
+
def test_empty_insert_statement
|
|
13
|
+
# "INSERT INTO table VALUES ( DEFAULT ) " not supported by Derby DB
|
|
14
|
+
pend if ar_version('4.0')
|
|
15
|
+
super
|
|
16
|
+
end
|
|
17
|
+
|
|
11
18
|
# Check that a table-less VALUES(xxx) query (like SELECT works.
|
|
12
19
|
def test_values
|
|
13
20
|
value = nil
|
|
@@ -28,7 +35,7 @@ class DerbySimpleTest < Test::Unit::TestCase
|
|
|
28
35
|
end
|
|
29
36
|
|
|
30
37
|
def test_text_and_string_conversions
|
|
31
|
-
e = DbType.
|
|
38
|
+
e = DbType.create!(:sample_string => '', :sample_text => '').reload
|
|
32
39
|
|
|
33
40
|
# Derby will normally reject any non text value.
|
|
34
41
|
# The adapter has been patched to convert non text values to strings
|
|
@@ -122,7 +129,8 @@ class DerbySimpleTest < Test::Unit::TestCase
|
|
|
122
129
|
["sample_integer_neg_default", :integer, { :default => -1 }],
|
|
123
130
|
["sample_text", :text, { }],
|
|
124
131
|
["big_decimal", :integer, { :precision => 31, :scale => 0 }],
|
|
125
|
-
|
|
132
|
+
["decimal_with_scale", :decimal, { :precision => 15, :scale => 3 }],
|
|
133
|
+
].sort{ |a,b| a[0] <=> b[0] }
|
|
126
134
|
|
|
127
135
|
column_names = (expected_types.map{|et| et[0]} + DbType.column_names).sort.uniq
|
|
128
136
|
result = []
|