activerecord-jdbc-adapter 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +33 -0
- data/Manifest.txt +17 -0
- data/README.txt +48 -20
- data/Rakefile +2 -169
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +11 -5
- data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +12 -0
- data/lib/jdbc_adapter.rb +1 -1
- data/lib/jdbc_adapter/jdbc.rake +43 -30
- data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
- data/lib/jdbc_adapter/jdbc_db2.rb +2 -2
- data/lib/jdbc_adapter/jdbc_derby.rb +11 -0
- data/lib/jdbc_adapter/jdbc_hsqldb.rb +6 -1
- data/lib/jdbc_adapter/jdbc_mimer.rb +14 -7
- data/lib/jdbc_adapter/jdbc_mssql.rb +18 -2
- data/lib/jdbc_adapter/jdbc_mysql.rb +3 -0
- data/lib/jdbc_adapter/jdbc_oracle.rb +24 -14
- data/lib/jdbc_adapter/jdbc_postgre.rb +38 -18
- data/lib/jdbc_adapter/jdbc_sqlite3.rb +96 -26
- data/lib/jdbc_adapter/missing_functionality_helper.rb +40 -34
- data/lib/jdbc_adapter/rake_tasks.rb +1 -1
- data/lib/jdbc_adapter/tsql_helper.rb +1 -0
- data/lib/jdbc_adapter/version.rb +1 -1
- data/lib/pg.rb +4 -0
- data/rails_generators/jdbc_generator.rb +15 -0
- data/rails_generators/templates/jdbc.rake +8 -0
- data/rails_generators/templates/jdbc.rb +7 -0
- data/rakelib/compile.rake +23 -0
- data/rakelib/package.rake +85 -0
- data/rakelib/rails.rake +41 -0
- data/rakelib/test.rake +71 -0
- data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +1 -0
- data/src/java/jdbc_adapter/JdbcDerbySpec.java +11 -46
- data/src/java/jdbc_adapter/JdbcMySQLSpec.java +3 -2
- data/src/java/jdbc_adapter/MssqlRubyJdbcConnection.java +71 -0
- data/src/java/jdbc_adapter/PostgresRubyJdbcConnection.java +24 -4
- data/src/java/jdbc_adapter/RubyJdbcConnection.java +57 -44
- data/test/abstract_db_create.rb +45 -0
- data/test/db/mysql.rb +2 -2
- data/test/db/postgres.rb +2 -2
- data/test/helper.rb +5 -0
- data/test/jdbc_adapter/jdbc_db2_test.rb +5 -0
- data/test/jdbc_common.rb +2 -0
- data/test/models/entry.rb +3 -0
- data/test/models/validates_uniqueness_of_string.rb +19 -0
- data/test/mysql_db_create_test.rb +25 -0
- data/test/mysql_nonstandard_primary_key_test.rb +42 -0
- data/test/mysql_simple_test.rb +5 -0
- data/test/postgres_db_create_test.rb +21 -0
- data/test/postgres_nonseq_pkey_test.rb +40 -0
- data/test/simple.rb +62 -1
- data/test/sqlite3_simple_test.rb +153 -10
- metadata +26 -5
@@ -102,9 +102,10 @@ public class JdbcMySQLSpec {
|
|
102
102
|
|
103
103
|
newBytes.insert(0, BACKQUOTE);
|
104
104
|
newBytes.append(bytes);
|
105
|
-
int i = 0;
|
106
|
-
while ((i = newBytes.indexOf('.')) != -1) {
|
105
|
+
int i = 0, j = 0;
|
106
|
+
while ((i = newBytes.indexOf('.', j)) != -1) {
|
107
107
|
newBytes.replace(i, 1, QUOTED_DOT);
|
108
|
+
j = i+3;
|
108
109
|
}
|
109
110
|
newBytes.append(BACKQUOTE);
|
110
111
|
|
@@ -0,0 +1,71 @@
|
|
1
|
+
/*
|
2
|
+
**** BEGIN LICENSE BLOCK *****
|
3
|
+
* Copyright (c) 2006-2009 Nick Sieger <nick@nicksieger.com>
|
4
|
+
* Copyright (c) 2006-2007 Ola Bini <ola.bini@gmail.com>
|
5
|
+
* Copyright (c) 2008-2009 Thomas E Enebo <enebo@acm.org>
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
* a copy of this software and associated documentation files (the
|
9
|
+
* "Software"), to deal in the Software without restriction, including
|
10
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
* the following conditions:
|
14
|
+
*
|
15
|
+
* The above copyright notice and this permission notice shall be
|
16
|
+
* included in all copies or substantial portions of the Software.
|
17
|
+
*
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
22
|
+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
23
|
+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
24
|
+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25
|
+
***** END LICENSE BLOCK *****/
|
26
|
+
package jdbc_adapter;
|
27
|
+
|
28
|
+
import java.sql.ResultSet;
|
29
|
+
import java.sql.SQLException;
|
30
|
+
import java.sql.Types;
|
31
|
+
import org.jruby.Ruby;
|
32
|
+
import org.jruby.RubyClass;
|
33
|
+
import org.jruby.runtime.ObjectAllocator;
|
34
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
35
|
+
|
36
|
+
/**
|
37
|
+
*
|
38
|
+
* @author nicksieger
|
39
|
+
*/
|
40
|
+
public class MssqlRubyJdbcConnection extends RubyJdbcConnection {
|
41
|
+
|
42
|
+
protected MssqlRubyJdbcConnection(Ruby runtime, RubyClass metaClass) {
|
43
|
+
super(runtime, metaClass);
|
44
|
+
}
|
45
|
+
|
46
|
+
public static RubyClass createMssqlJdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
|
47
|
+
RubyClass clazz = RubyJdbcConnection.getConnectionAdapters(runtime).defineClassUnder("MssqlJdbcConnection",
|
48
|
+
jdbcConnection, MSSQL_JDBCCONNECTION_ALLOCATOR);
|
49
|
+
clazz.defineAnnotatedMethods(MssqlRubyJdbcConnection.class);
|
50
|
+
|
51
|
+
return clazz;
|
52
|
+
}
|
53
|
+
private static ObjectAllocator MSSQL_JDBCCONNECTION_ALLOCATOR = new ObjectAllocator() {
|
54
|
+
|
55
|
+
public IRubyObject allocate(Ruby runtime, RubyClass klass) {
|
56
|
+
return new MssqlRubyJdbcConnection(runtime, klass);
|
57
|
+
}
|
58
|
+
};
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Treat LONGVARCHAR as CLOB on Mssql for purposes of converting a JDBC value to Ruby.
|
62
|
+
*/
|
63
|
+
@Override
|
64
|
+
protected IRubyObject jdbcToRuby(Ruby runtime, int column, int type, ResultSet resultSet)
|
65
|
+
throws SQLException {
|
66
|
+
if (type == Types.LONGVARCHAR) {
|
67
|
+
type = Types.CLOB;
|
68
|
+
}
|
69
|
+
return super.jdbcToRuby(runtime, column, type, resultSet);
|
70
|
+
}
|
71
|
+
}
|
@@ -1,8 +1,28 @@
|
|
1
1
|
/*
|
2
|
-
|
3
|
-
*
|
4
|
-
|
5
|
-
|
2
|
+
**** BEGIN LICENSE BLOCK *****
|
3
|
+
* Copyright (c) 2006-2009 Nick Sieger <nick@nicksieger.com>
|
4
|
+
* Copyright (c) 2006-2007 Ola Bini <ola.bini@gmail.com>
|
5
|
+
* Copyright (c) 2008-2009 Thomas E Enebo <enebo@acm.org>
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
* a copy of this software and associated documentation files (the
|
9
|
+
* "Software"), to deal in the Software without restriction, including
|
10
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
* the following conditions:
|
14
|
+
*
|
15
|
+
* The above copyright notice and this permission notice shall be
|
16
|
+
* included in all copies or substantial portions of the Software.
|
17
|
+
*
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
22
|
+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
23
|
+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
24
|
+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25
|
+
***** END LICENSE BLOCK *****/
|
6
26
|
package jdbc_adapter;
|
7
27
|
|
8
28
|
import org.jruby.Ruby;
|
@@ -76,7 +76,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
76
76
|
private static final String[] TABLE_TYPE = new String[]{"TABLE"};
|
77
77
|
|
78
78
|
private static RubyObjectAdapter rubyApi;
|
79
|
-
|
79
|
+
|
80
80
|
protected RubyJdbcConnection(Ruby runtime, RubyClass metaClass) {
|
81
81
|
super(runtime, metaClass);
|
82
82
|
}
|
@@ -103,9 +103,13 @@ public class RubyJdbcConnection extends RubyObject {
|
|
103
103
|
|
104
104
|
@JRubyMethod(name = "begin")
|
105
105
|
public IRubyObject begin(ThreadContext context) throws SQLException {
|
106
|
-
|
107
|
-
|
108
|
-
|
106
|
+
final Ruby runtime = context.getRuntime();
|
107
|
+
return (IRubyObject) withConnectionAndRetry(context, new SQLBlock() {
|
108
|
+
public Object call(Connection c) throws SQLException {
|
109
|
+
getConnection(true).setAutoCommit(false);
|
110
|
+
return runtime.getNil();
|
111
|
+
}
|
112
|
+
});
|
109
113
|
}
|
110
114
|
|
111
115
|
@JRubyMethod(name = {"columns", "columns_internal"}, required = 1, optional = 2)
|
@@ -126,7 +130,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
126
130
|
|
127
131
|
DatabaseMetaData metadata = c.getMetaData();
|
128
132
|
|
129
|
-
if(args.length > 2) schemaName = args[2]
|
133
|
+
if(args.length > 2 && schemaName == null) schemaName = toStringOrNull(args[2]);
|
130
134
|
|
131
135
|
if (schemaName != null) schemaName = caseConvertIdentifierForJdbc(metadata, schemaName);
|
132
136
|
table_name = caseConvertIdentifierForJdbc(metadata, table_name);
|
@@ -296,7 +300,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
296
300
|
DatabaseMetaData metadata = c.getMetaData();
|
297
301
|
String tableName = caseConvertIdentifierForJdbc(metadata, tableNameArg);
|
298
302
|
String schemaName = caseConvertIdentifierForJdbc(metadata, schemaNameArg);
|
299
|
-
|
303
|
+
|
300
304
|
ResultSet resultSet = null;
|
301
305
|
List indexes = new ArrayList();
|
302
306
|
try {
|
@@ -383,13 +387,13 @@ public class RubyJdbcConnection extends RubyObject {
|
|
383
387
|
public IRubyObject native_database_types() {
|
384
388
|
return getInstanceVariable("@native_database_types");
|
385
389
|
}
|
386
|
-
|
390
|
+
|
387
391
|
|
388
392
|
@JRubyMethod(name = "primary_keys", required = 1)
|
389
393
|
public IRubyObject primary_keys(ThreadContext context, IRubyObject tableName) throws SQLException {
|
390
394
|
return context.getRuntime().newArray(primaryKeys(context, tableName.toString()));
|
391
395
|
}
|
392
|
-
|
396
|
+
|
393
397
|
protected List primaryKeys(final ThreadContext context, final String tableNameArg) {
|
394
398
|
return (List) withConnectionAndRetry(context, new SQLBlock() {
|
395
399
|
public Object call(Connection c) throws SQLException {
|
@@ -419,26 +423,32 @@ public class RubyJdbcConnection extends RubyObject {
|
|
419
423
|
return setConnection(getConnectionFactory().newConnection());
|
420
424
|
}
|
421
425
|
|
426
|
+
|
422
427
|
@JRubyMethod(name = "rollback")
|
423
428
|
public IRubyObject rollback(ThreadContext context) throws SQLException {
|
424
|
-
|
429
|
+
final Ruby runtime = context.getRuntime();
|
430
|
+
return (IRubyObject) withConnectionAndRetry(context, new SQLBlock() {
|
431
|
+
public Object call(Connection c) throws SQLException {
|
432
|
+
Connection connection = getConnection(true);
|
425
433
|
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
434
|
+
if (!connection.getAutoCommit()) {
|
435
|
+
try {
|
436
|
+
connection.rollback();
|
437
|
+
} finally {
|
438
|
+
connection.setAutoCommit(true);
|
439
|
+
}
|
431
440
|
}
|
432
|
-
}
|
433
441
|
|
434
|
-
|
442
|
+
return runtime.getNil();
|
443
|
+
}
|
444
|
+
});
|
435
445
|
}
|
436
446
|
|
437
447
|
@JRubyMethod(name = "select?", required = 1, meta = true, frame = false)
|
438
448
|
public static IRubyObject select_p(ThreadContext context, IRubyObject recv, IRubyObject _sql) {
|
439
449
|
ByteList sql = rubyApi.convertToRubyString(_sql).getByteList();
|
440
450
|
|
441
|
-
return context.getRuntime().newBoolean(startsWithNoCaseCmp(sql, SELECT) ||
|
451
|
+
return context.getRuntime().newBoolean(startsWithNoCaseCmp(sql, SELECT) ||
|
442
452
|
startsWithNoCaseCmp(sql, SHOW) || startsWithNoCaseCmp(sql, CALL));
|
443
453
|
}
|
444
454
|
|
@@ -453,7 +463,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
453
463
|
|
454
464
|
return runtime.getNil();
|
455
465
|
}
|
456
|
-
|
466
|
+
|
457
467
|
@JRubyMethod(name = "tables")
|
458
468
|
public IRubyObject tables(ThreadContext context) {
|
459
469
|
return tables(context, null, null, null, TABLE_TYPE);
|
@@ -561,7 +571,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
561
571
|
public static String caseConvertIdentifierForRails(DatabaseMetaData metadata, String value)
|
562
572
|
throws SQLException {
|
563
573
|
if (value == null) return null;
|
564
|
-
|
574
|
+
|
565
575
|
return metadata.storesUpperCaseIdentifiers() ? value.toLowerCase() : value;
|
566
576
|
}
|
567
577
|
|
@@ -570,10 +580,10 @@ public class RubyJdbcConnection extends RubyObject {
|
|
570
580
|
* storage case. Methods like DatabaseMetaData.getPrimaryKeys() needs the table name to match
|
571
581
|
* the internal storage name. Arbtrary queries and the like DO NOT need to do this.
|
572
582
|
*/
|
573
|
-
public static String caseConvertIdentifierForJdbc(DatabaseMetaData metadata, String value)
|
583
|
+
public static String caseConvertIdentifierForJdbc(DatabaseMetaData metadata, String value)
|
574
584
|
throws SQLException {
|
575
585
|
if (value == null) return null;
|
576
|
-
|
586
|
+
|
577
587
|
if (metadata.storesUpperCaseIdentifiers()) {
|
578
588
|
return value.toUpperCase();
|
579
589
|
} else if (metadata.storesLowerCaseIdentifiers()) {
|
@@ -618,13 +628,12 @@ public class RubyJdbcConnection extends RubyObject {
|
|
618
628
|
return arg.isNil() ? null : arg.toString();
|
619
629
|
}
|
620
630
|
|
621
|
-
|
631
|
+
protected IRubyObject doubleToRuby(Ruby runtime, ResultSet resultSet, double doubleValue)
|
622
632
|
throws SQLException, IOException {
|
623
|
-
if (
|
624
|
-
|
625
|
-
return runtime.newFloat(floatValue);
|
633
|
+
if (doubleValue == 0 && resultSet.wasNull()) return runtime.getNil();
|
634
|
+
return runtime.newFloat(doubleValue);
|
626
635
|
}
|
627
|
-
|
636
|
+
|
628
637
|
protected Connection getConnection() {
|
629
638
|
return getConnection(false);
|
630
639
|
}
|
@@ -642,7 +651,8 @@ public class RubyJdbcConnection extends RubyObject {
|
|
642
651
|
IRubyObject connection_factory = getInstanceVariable("@connection_factory");
|
643
652
|
JdbcConnectionFactory factory = null;
|
644
653
|
try {
|
645
|
-
factory = (JdbcConnectionFactory)
|
654
|
+
factory = (JdbcConnectionFactory) JavaEmbedUtils.rubyToJava(
|
655
|
+
connection_factory.getRuntime(), connection_factory, JdbcConnectionFactory.class);
|
646
656
|
} catch (Exception e) {
|
647
657
|
factory = null;
|
648
658
|
}
|
@@ -713,23 +723,26 @@ public class RubyJdbcConnection extends RubyObject {
|
|
713
723
|
} else {
|
714
724
|
return !c.isClosed();
|
715
725
|
}
|
716
|
-
} catch (
|
726
|
+
} catch (Exception sx) {
|
717
727
|
return true;
|
718
728
|
}
|
719
729
|
}
|
720
730
|
|
721
|
-
|
731
|
+
protected IRubyObject integerToRuby(Ruby runtime, ResultSet resultSet, long longValue)
|
722
732
|
throws SQLException, IOException {
|
723
733
|
if (longValue == 0 && resultSet.wasNull()) return runtime.getNil();
|
724
734
|
|
725
735
|
return runtime.newFixnum(longValue);
|
726
736
|
}
|
727
737
|
|
728
|
-
|
738
|
+
protected IRubyObject jdbcToRuby(Ruby runtime, int column, int type, ResultSet resultSet)
|
729
739
|
throws SQLException {
|
730
740
|
try {
|
731
741
|
switch (type) {
|
732
|
-
case Types.BINARY:
|
742
|
+
case Types.BINARY:
|
743
|
+
case Types.BLOB:
|
744
|
+
case Types.LONGVARBINARY:
|
745
|
+
case Types.VARBINARY:
|
733
746
|
case Types.LONGVARCHAR:
|
734
747
|
return streamToRuby(runtime, resultSet, resultSet.getBinaryStream(column));
|
735
748
|
case Types.CLOB:
|
@@ -739,7 +752,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
739
752
|
case Types.INTEGER: case Types.SMALLINT: case Types.TINYINT:
|
740
753
|
return integerToRuby(runtime, resultSet, resultSet.getLong(column));
|
741
754
|
case Types.REAL:
|
742
|
-
return
|
755
|
+
return doubleToRuby(runtime, resultSet, resultSet.getDouble(column));
|
743
756
|
default:
|
744
757
|
return stringToRuby(runtime, resultSet, resultSet.getString(column));
|
745
758
|
}
|
@@ -748,7 +761,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
748
761
|
}
|
749
762
|
}
|
750
763
|
|
751
|
-
|
764
|
+
protected void populateFromResultSet(ThreadContext context, Ruby runtime, List results,
|
752
765
|
ResultSet resultSet, ColumnData[] columns) throws SQLException {
|
753
766
|
int columnCount = columns.length;
|
754
767
|
|
@@ -763,7 +776,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
763
776
|
}
|
764
777
|
|
765
778
|
|
766
|
-
|
779
|
+
protected IRubyObject readerToRuby(Ruby runtime, ResultSet resultSet, Reader reader)
|
767
780
|
throws SQLException, IOException {
|
768
781
|
if (reader == null && resultSet.wasNull()) return runtime.getNil();
|
769
782
|
|
@@ -850,7 +863,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
850
863
|
}
|
851
864
|
}
|
852
865
|
|
853
|
-
|
866
|
+
protected IRubyObject streamToRuby(Ruby runtime, ResultSet resultSet, InputStream is)
|
854
867
|
throws SQLException, IOException {
|
855
868
|
if (is == null && resultSet.wasNull()) return runtime.getNil();
|
856
869
|
|
@@ -868,7 +881,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
868
881
|
return runtime.newString(str);
|
869
882
|
}
|
870
883
|
|
871
|
-
|
884
|
+
protected IRubyObject stringToRuby(Ruby runtime, ResultSet resultSet, String string)
|
872
885
|
throws SQLException, IOException {
|
873
886
|
if (string == null && resultSet.wasNull()) return runtime.getNil();
|
874
887
|
|
@@ -890,7 +903,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
890
903
|
|
891
904
|
String realschema = schemapat;
|
892
905
|
String realtablepat = tablepat;
|
893
|
-
|
906
|
+
|
894
907
|
if (realtablepat != null) realtablepat = caseConvertIdentifierForJdbc(metadata, realtablepat);
|
895
908
|
if (realschema != null) realschema = caseConvertIdentifierForJdbc(metadata, realschema);
|
896
909
|
|
@@ -898,7 +911,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
898
911
|
List arr = new ArrayList();
|
899
912
|
while (rs.next()) {
|
900
913
|
String name;
|
901
|
-
|
914
|
+
|
902
915
|
if (downCase) {
|
903
916
|
name = rs.getString(TABLE_NAME).toLowerCase();
|
904
917
|
} else {
|
@@ -917,7 +930,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
917
930
|
};
|
918
931
|
}
|
919
932
|
|
920
|
-
|
933
|
+
protected IRubyObject timestampToRuby(Ruby runtime, ResultSet resultSet, Timestamp time)
|
921
934
|
throws SQLException, IOException {
|
922
935
|
if (time == null && resultSet.wasNull()) return runtime.getNil();
|
923
936
|
|
@@ -959,14 +972,14 @@ public class RubyJdbcConnection extends RubyObject {
|
|
959
972
|
// valid precision 1 decimal also. Seems sketchy to me...
|
960
973
|
if (numberAsBoolean && precision != 1 &&
|
961
974
|
resultSet.getInt(DATA_TYPE) == java.sql.Types.DECIMAL) precision = -1;
|
962
|
-
|
975
|
+
|
963
976
|
String type = resultSet.getString(TYPE_NAME);
|
964
977
|
if (precision > 0) {
|
965
978
|
type += "(" + precision;
|
966
979
|
if(scale > 0) type += "," + scale;
|
967
980
|
type += ")";
|
968
981
|
}
|
969
|
-
|
982
|
+
|
970
983
|
return type;
|
971
984
|
}
|
972
985
|
|
@@ -992,7 +1005,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
992
1005
|
IRubyObject column = jdbcCol.callMethod(context, "new",
|
993
1006
|
new IRubyObject[] {
|
994
1007
|
getInstanceVariable("@config"),
|
995
|
-
RubyString.newUnicodeString(runtime,
|
1008
|
+
RubyString.newUnicodeString(runtime,
|
996
1009
|
caseConvertIdentifierForRails(metadata, rs.getString(COLUMN_NAME))),
|
997
1010
|
defaultValueFromResultSet(runtime, rs),
|
998
1011
|
RubyString.newUnicodeString(runtime, typeFromResultSet(rs, isOracle)),
|
@@ -1031,7 +1044,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
1031
1044
|
*
|
1032
1045
|
* @param downCase should column names only be in lower case?
|
1033
1046
|
*/
|
1034
|
-
protected
|
1047
|
+
protected IRubyObject unmarshalResult(ThreadContext context, DatabaseMetaData metadata,
|
1035
1048
|
ResultSet resultSet, boolean downCase) throws SQLException {
|
1036
1049
|
Ruby runtime = context.getRuntime();
|
1037
1050
|
List results = new ArrayList();
|
@@ -1099,7 +1112,7 @@ public class RubyJdbcConnection extends RubyObject {
|
|
1099
1112
|
|
1100
1113
|
return end;
|
1101
1114
|
}
|
1102
|
-
|
1115
|
+
|
1103
1116
|
private static byte[] CALL = new byte[]{'c', 'a', 'l', 'l'};
|
1104
1117
|
private static byte[] INSERT = new byte[] {'i', 'n', 's', 'e', 'r', 't'};
|
1105
1118
|
private static byte[] SELECT = new byte[] {'s', 'e', 'l', 'e', 'c', 't'};
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'jdbc_common'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
module AbstractDbCreate
|
5
|
+
def setup
|
6
|
+
@prevapp = Rake.application
|
7
|
+
Rake.application = Rake::Application.new
|
8
|
+
verbose(true)
|
9
|
+
@prevenv = Object.const_get("RAILS_ENV") rescue nil
|
10
|
+
@prevroot = Object.const_get("RAILS_ENV") rescue nil
|
11
|
+
Object.const_set("RAILS_ENV", "unittest")
|
12
|
+
Object.const_set("RAILS_ROOT", ".")
|
13
|
+
@prevconfigs = ActiveRecord::Base.configurations
|
14
|
+
ActiveRecord::Base.connection.disconnect!
|
15
|
+
@db_name = 'test_rake_db_create'
|
16
|
+
require 'initializer'
|
17
|
+
the_db_name = @db_name
|
18
|
+
the_db_config = db_config
|
19
|
+
Rails::Configuration.class_eval do
|
20
|
+
define_method(:database_configuration) do
|
21
|
+
{ "unittest" => the_db_config.merge({:database => the_db_name}).stringify_keys! }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
load rails_databases_rake_file
|
25
|
+
load File.dirname(__FILE__) + '/../lib/jdbc_adapter/jdbc.rake' if jruby?
|
26
|
+
task :environment; task :rails_env # dummy environment, rails_env tasks
|
27
|
+
end
|
28
|
+
|
29
|
+
def teardown
|
30
|
+
Rake::Task["db:drop"].invoke
|
31
|
+
Rake.application = @prevapp
|
32
|
+
Object.const_set("RAILS_ENV", @prevenv) if @prevenv
|
33
|
+
Object.const_set("RAILS_ROOT", @prevroot) if @prevroot
|
34
|
+
ActiveRecord::Base.configurations = @prevconfigs
|
35
|
+
ActiveRecord::Base.establish_connection(db_config)
|
36
|
+
end
|
37
|
+
|
38
|
+
def rails_databases_rake_file
|
39
|
+
ar_version = $LOADED_FEATURES.grep(%r{active_record/version}).first
|
40
|
+
ar_lib_path = $LOAD_PATH.detect {|p| p if File.exist?File.join(p, ar_version)}
|
41
|
+
ar_lib_path = ar_lib_path.sub(%r{activerecord/lib}, 'railties/lib') # edge rails
|
42
|
+
rails_lib_path = ar_lib_path.sub(/activerecord/, 'rails') # gem rails
|
43
|
+
"#{rails_lib_path}/tasks/databases.rake"
|
44
|
+
end
|
45
|
+
end
|