activerecord-jdbc-alt-adapter 50.3.0-java

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.
Files changed (198) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +100 -0
  4. data/.yardopts +4 -0
  5. data/CONTRIBUTING.md +50 -0
  6. data/Gemfile +92 -0
  7. data/History.md +1191 -0
  8. data/LICENSE.txt +26 -0
  9. data/README.md +240 -0
  10. data/RUNNING_TESTS.md +127 -0
  11. data/Rakefile +336 -0
  12. data/Rakefile.jdbc +20 -0
  13. data/activerecord-jdbc-adapter.gemspec +55 -0
  14. data/activerecord-jdbc-alt-adapter.gemspec +56 -0
  15. data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
  16. data/lib/active_record/connection_adapters/db2_adapter.rb +1 -0
  17. data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
  18. data/lib/active_record/connection_adapters/firebird_adapter.rb +1 -0
  19. data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
  20. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
  21. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
  22. data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
  23. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
  24. data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
  25. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
  26. data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
  27. data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -0
  28. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
  29. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -0
  30. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
  31. data/lib/activerecord-jdbc-adapter.rb +1 -0
  32. data/lib/arel/visitors/compat.rb +60 -0
  33. data/lib/arel/visitors/db2.rb +137 -0
  34. data/lib/arel/visitors/derby.rb +112 -0
  35. data/lib/arel/visitors/firebird.rb +79 -0
  36. data/lib/arel/visitors/h2.rb +25 -0
  37. data/lib/arel/visitors/hsqldb.rb +32 -0
  38. data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
  39. data/lib/arel/visitors/sql_server.rb +225 -0
  40. data/lib/arel/visitors/sql_server/ng42.rb +294 -0
  41. data/lib/arel/visitors/sqlserver.rb +214 -0
  42. data/lib/arjdbc.rb +19 -0
  43. data/lib/arjdbc/abstract/connection_management.rb +35 -0
  44. data/lib/arjdbc/abstract/core.rb +74 -0
  45. data/lib/arjdbc/abstract/database_statements.rb +64 -0
  46. data/lib/arjdbc/abstract/statement_cache.rb +58 -0
  47. data/lib/arjdbc/abstract/transaction_support.rb +86 -0
  48. data/lib/arjdbc/db2.rb +4 -0
  49. data/lib/arjdbc/db2/adapter.rb +789 -0
  50. data/lib/arjdbc/db2/as400.rb +130 -0
  51. data/lib/arjdbc/db2/column.rb +167 -0
  52. data/lib/arjdbc/db2/connection_methods.rb +44 -0
  53. data/lib/arjdbc/derby.rb +3 -0
  54. data/lib/arjdbc/derby/active_record_patch.rb +13 -0
  55. data/lib/arjdbc/derby/adapter.rb +540 -0
  56. data/lib/arjdbc/derby/connection_methods.rb +20 -0
  57. data/lib/arjdbc/derby/schema_creation.rb +15 -0
  58. data/lib/arjdbc/discover.rb +104 -0
  59. data/lib/arjdbc/firebird.rb +4 -0
  60. data/lib/arjdbc/firebird/adapter.rb +434 -0
  61. data/lib/arjdbc/firebird/connection_methods.rb +23 -0
  62. data/lib/arjdbc/h2.rb +3 -0
  63. data/lib/arjdbc/h2/adapter.rb +303 -0
  64. data/lib/arjdbc/h2/connection_methods.rb +27 -0
  65. data/lib/arjdbc/hsqldb.rb +3 -0
  66. data/lib/arjdbc/hsqldb/adapter.rb +297 -0
  67. data/lib/arjdbc/hsqldb/connection_methods.rb +28 -0
  68. data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
  69. data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
  70. data/lib/arjdbc/informix.rb +5 -0
  71. data/lib/arjdbc/informix/adapter.rb +162 -0
  72. data/lib/arjdbc/informix/connection_methods.rb +9 -0
  73. data/lib/arjdbc/jdbc.rb +59 -0
  74. data/lib/arjdbc/jdbc/adapter.rb +475 -0
  75. data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
  76. data/lib/arjdbc/jdbc/base_ext.rb +15 -0
  77. data/lib/arjdbc/jdbc/callbacks.rb +53 -0
  78. data/lib/arjdbc/jdbc/column.rb +97 -0
  79. data/lib/arjdbc/jdbc/connection.rb +14 -0
  80. data/lib/arjdbc/jdbc/connection_methods.rb +37 -0
  81. data/lib/arjdbc/jdbc/error.rb +65 -0
  82. data/lib/arjdbc/jdbc/extension.rb +59 -0
  83. data/lib/arjdbc/jdbc/java.rb +13 -0
  84. data/lib/arjdbc/jdbc/railtie.rb +2 -0
  85. data/lib/arjdbc/jdbc/rake_tasks.rb +3 -0
  86. data/lib/arjdbc/jdbc/serialized_attributes_helper.rb +3 -0
  87. data/lib/arjdbc/jdbc/type_cast.rb +166 -0
  88. data/lib/arjdbc/jdbc/type_converter.rb +142 -0
  89. data/lib/arjdbc/mssql.rb +7 -0
  90. data/lib/arjdbc/mssql/adapter.rb +384 -0
  91. data/lib/arjdbc/mssql/column.rb +29 -0
  92. data/lib/arjdbc/mssql/connection_methods.rb +79 -0
  93. data/lib/arjdbc/mssql/database_statements.rb +134 -0
  94. data/lib/arjdbc/mssql/errors.rb +6 -0
  95. data/lib/arjdbc/mssql/explain_support.rb +129 -0
  96. data/lib/arjdbc/mssql/extensions.rb +36 -0
  97. data/lib/arjdbc/mssql/limit_helpers.rb +231 -0
  98. data/lib/arjdbc/mssql/lock_methods.rb +77 -0
  99. data/lib/arjdbc/mssql/old_adapter.rb +804 -0
  100. data/lib/arjdbc/mssql/old_column.rb +200 -0
  101. data/lib/arjdbc/mssql/quoting.rb +101 -0
  102. data/lib/arjdbc/mssql/schema_creation.rb +31 -0
  103. data/lib/arjdbc/mssql/schema_definitions.rb +74 -0
  104. data/lib/arjdbc/mssql/schema_statements.rb +329 -0
  105. data/lib/arjdbc/mssql/transaction.rb +69 -0
  106. data/lib/arjdbc/mssql/types.rb +52 -0
  107. data/lib/arjdbc/mssql/types/binary_types.rb +33 -0
  108. data/lib/arjdbc/mssql/types/date_and_time_types.rb +134 -0
  109. data/lib/arjdbc/mssql/types/deprecated_types.rb +40 -0
  110. data/lib/arjdbc/mssql/types/numeric_types.rb +71 -0
  111. data/lib/arjdbc/mssql/types/string_types.rb +56 -0
  112. data/lib/arjdbc/mssql/utils.rb +66 -0
  113. data/lib/arjdbc/mysql.rb +3 -0
  114. data/lib/arjdbc/mysql/adapter.rb +140 -0
  115. data/lib/arjdbc/mysql/connection_methods.rb +166 -0
  116. data/lib/arjdbc/oracle/adapter.rb +863 -0
  117. data/lib/arjdbc/postgresql.rb +3 -0
  118. data/lib/arjdbc/postgresql/adapter.rb +687 -0
  119. data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
  120. data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
  121. data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
  122. data/lib/arjdbc/postgresql/base/pgconn.rb +11 -0
  123. data/lib/arjdbc/postgresql/column.rb +51 -0
  124. data/lib/arjdbc/postgresql/connection_methods.rb +67 -0
  125. data/lib/arjdbc/postgresql/name.rb +24 -0
  126. data/lib/arjdbc/postgresql/oid_types.rb +266 -0
  127. data/lib/arjdbc/railtie.rb +11 -0
  128. data/lib/arjdbc/sqlite3.rb +3 -0
  129. data/lib/arjdbc/sqlite3/adapter.rb +678 -0
  130. data/lib/arjdbc/sqlite3/connection_methods.rb +59 -0
  131. data/lib/arjdbc/sybase.rb +2 -0
  132. data/lib/arjdbc/sybase/adapter.rb +47 -0
  133. data/lib/arjdbc/tasks.rb +13 -0
  134. data/lib/arjdbc/tasks/database_tasks.rb +31 -0
  135. data/lib/arjdbc/tasks/databases.rake +48 -0
  136. data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
  137. data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
  138. data/lib/arjdbc/tasks/h2_database_tasks.rb +31 -0
  139. data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
  140. data/lib/arjdbc/tasks/jdbc_database_tasks.rb +169 -0
  141. data/lib/arjdbc/tasks/mssql_database_tasks.rb +46 -0
  142. data/lib/arjdbc/util/quoted_cache.rb +60 -0
  143. data/lib/arjdbc/util/serialized_attributes.rb +98 -0
  144. data/lib/arjdbc/util/table_copier.rb +110 -0
  145. data/lib/arjdbc/version.rb +3 -0
  146. data/lib/generators/jdbc/USAGE +9 -0
  147. data/lib/generators/jdbc/jdbc_generator.rb +17 -0
  148. data/lib/jdbc_adapter.rb +2 -0
  149. data/lib/jdbc_adapter/rake_tasks.rb +4 -0
  150. data/lib/jdbc_adapter/version.rb +4 -0
  151. data/pom.xml +114 -0
  152. data/rails_generators/jdbc_generator.rb +15 -0
  153. data/rails_generators/templates/config/initializers/jdbc.rb +10 -0
  154. data/rails_generators/templates/lib/tasks/jdbc.rake +11 -0
  155. data/rakelib/01-tomcat.rake +51 -0
  156. data/rakelib/02-test.rake +132 -0
  157. data/rakelib/bundler_ext.rb +11 -0
  158. data/rakelib/db.rake +75 -0
  159. data/rakelib/rails.rake +223 -0
  160. data/src/java/arjdbc/ArJdbcModule.java +276 -0
  161. data/src/java/arjdbc/db2/DB2Module.java +76 -0
  162. data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +126 -0
  163. data/src/java/arjdbc/derby/DerbyModule.java +178 -0
  164. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +152 -0
  165. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +174 -0
  166. data/src/java/arjdbc/h2/H2Module.java +50 -0
  167. data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +85 -0
  168. data/src/java/arjdbc/hsqldb/HSQLDBModule.java +73 -0
  169. data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +75 -0
  170. data/src/java/arjdbc/jdbc/AdapterJavaService.java +43 -0
  171. data/src/java/arjdbc/jdbc/Callable.java +44 -0
  172. data/src/java/arjdbc/jdbc/ConnectionFactory.java +45 -0
  173. data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +156 -0
  174. data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
  175. data/src/java/arjdbc/jdbc/DriverWrapper.java +119 -0
  176. data/src/java/arjdbc/jdbc/JdbcResult.java +130 -0
  177. data/src/java/arjdbc/jdbc/RubyConnectionFactory.java +61 -0
  178. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +3979 -0
  179. data/src/java/arjdbc/mssql/MSSQLModule.java +90 -0
  180. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +508 -0
  181. data/src/java/arjdbc/mysql/MySQLModule.java +152 -0
  182. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +294 -0
  183. data/src/java/arjdbc/oracle/OracleModule.java +80 -0
  184. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +455 -0
  185. data/src/java/arjdbc/postgresql/ByteaUtils.java +157 -0
  186. data/src/java/arjdbc/postgresql/PgDateTimeUtils.java +52 -0
  187. data/src/java/arjdbc/postgresql/PostgreSQLModule.java +77 -0
  188. data/src/java/arjdbc/postgresql/PostgreSQLResult.java +192 -0
  189. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +948 -0
  190. data/src/java/arjdbc/sqlite3/SQLite3Module.java +73 -0
  191. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +525 -0
  192. data/src/java/arjdbc/util/CallResultSet.java +826 -0
  193. data/src/java/arjdbc/util/DateTimeUtils.java +699 -0
  194. data/src/java/arjdbc/util/ObjectSupport.java +65 -0
  195. data/src/java/arjdbc/util/QuotingUtils.java +137 -0
  196. data/src/java/arjdbc/util/StringCache.java +63 -0
  197. data/src/java/arjdbc/util/StringHelper.java +145 -0
  198. metadata +269 -0
@@ -0,0 +1,65 @@
1
+
2
+ package arjdbc.util;
3
+
4
+ import java.util.List;
5
+ import org.jruby.Ruby;
6
+ import org.jruby.RubyBasicObject;
7
+ import org.jruby.RubyString;
8
+ import org.jruby.runtime.ThreadContext;
9
+ import org.jruby.runtime.builtin.IRubyObject;
10
+ import org.jruby.runtime.builtin.Variable;
11
+
12
+ public abstract class ObjectSupport {
13
+
14
+ @SuppressWarnings("unchecked")
15
+ public static RubyString inspect(final RubyBasicObject self) {
16
+ return inspect(self, (List) self.getInstanceVariableList());
17
+ }
18
+
19
+ public static RubyString inspect(final RubyBasicObject self, final List<Variable> variableList) {
20
+ final Ruby runtime = self.getRuntime();
21
+ return RubyString.newString(runtime, inspect(runtime, self, variableList));
22
+ }
23
+
24
+ private static StringBuilder inspect(final Ruby runtime, final RubyBasicObject self,
25
+ final List<Variable> variableList) {
26
+ final StringBuilder part = new StringBuilder();
27
+ String cname = self.getMetaClass().getRealClass().getName();
28
+ part.append("#<").append(cname).append(":0x");
29
+ part.append(Integer.toHexString(System.identityHashCode(self)));
30
+
31
+ if (runtime.isInspecting(self)) {
32
+ /* 6:tags 16:addr 1:eos */
33
+ part.append(" ...>");
34
+ return part;
35
+ }
36
+ try {
37
+ runtime.registerInspecting(self);
38
+ final ThreadContext context = runtime.getCurrentContext();
39
+ return inspectObj(context, variableList, part);
40
+ } finally {
41
+ runtime.unregisterInspecting(self);
42
+ }
43
+ }
44
+
45
+ private static StringBuilder inspectObj(final ThreadContext context,
46
+ final List<Variable> variableList,
47
+ final StringBuilder part) {
48
+ String sep = "";
49
+
50
+ for ( final Variable ivar : variableList ) {
51
+ part.append(sep).append(' ').append( ivar.getName() ).append('=');
52
+ final Object ival = ivar.getValue();
53
+ if ( ival instanceof IRubyObject ) {
54
+ part.append( ((IRubyObject) ival).callMethod(context, "inspect") );
55
+ }
56
+ else { // allow the variable to come formatted (as is) already :
57
+ part.append( ival ); // ival == null ? "nil" : ival.toString()
58
+ }
59
+ sep = ",";
60
+ }
61
+ part.append('>');
62
+ return part;
63
+ }
64
+
65
+ }
@@ -0,0 +1,137 @@
1
+ /*
2
+ * The MIT License
3
+ *
4
+ * Copyright 2013 Karol Bucek.
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in
14
+ * all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ * THE SOFTWARE.
23
+ */
24
+ package arjdbc.util;
25
+
26
+ import org.jruby.RubyString;
27
+ import org.jruby.runtime.Helpers;
28
+ import org.jruby.runtime.ThreadContext;
29
+ import org.jruby.runtime.builtin.IRubyObject;
30
+ import org.jruby.util.ByteList;
31
+
32
+ /**
33
+ * Shared (common) quoting helpers.
34
+ *
35
+ * <br>
36
+ * NOTE: This is internal API !
37
+ * <br>
38
+ *
39
+ * @author kares
40
+ */
41
+ public abstract class QuotingUtils {
42
+
43
+ public static final ByteList BYTES_0 = new ByteList(new byte[] { '0' }, false);
44
+
45
+ public static final ByteList BYTES_1 = new ByteList(new byte[] { '1' }, false);
46
+
47
+ // e.g. string.gsub("'", "''") -> quoteCharWith(string, '\'', '\'');
48
+ public static RubyString quoteCharWith(
49
+ final ThreadContext context,
50
+ final RubyString string,
51
+ final char value, final char quote) {
52
+ return quoteCharWith(context, string, value, quote, 0, 8);
53
+ }
54
+
55
+ public static RubyString quoteCharWith(
56
+ final ThreadContext context,
57
+ final RubyString string,
58
+ final char value, final char quote,
59
+ final int newOffset, final int newSizeDiff) {
60
+
61
+ final ByteList stringBytes = string.getByteList();
62
+ final byte[] bytes = stringBytes.unsafeBytes();
63
+ final int begin = stringBytes.getBegin();
64
+ final int realSize = stringBytes.getRealSize();
65
+
66
+ ByteList quotedBytes = null; int appendFrom = begin;
67
+ for ( int i = begin; i < begin + realSize; i++ ) {
68
+ if ( bytes[i] == value ) {
69
+ if ( quotedBytes == null ) {
70
+ quotedBytes = new ByteList(
71
+ new byte[realSize + newOffset + newSizeDiff],
72
+ stringBytes.getEncoding(), false
73
+ );
74
+ quotedBytes.setBegin(newOffset);
75
+ quotedBytes.setRealSize(0);
76
+ }
77
+ quotedBytes.append(bytes, appendFrom, i - appendFrom);
78
+ quotedBytes.append(quote).append(value); // e.g. "'" => "''"
79
+ appendFrom = i + 1;
80
+ }
81
+ }
82
+ if ( quotedBytes != null ) { // append what's left in the end :
83
+ quotedBytes.append(bytes, appendFrom, begin + realSize - appendFrom);
84
+ }
85
+ else return string; // nothing changed, can return original
86
+
87
+ return context.runtime.newString(quotedBytes);
88
+ }
89
+
90
+ public static RubyString quoteCharAndDecorateWith(
91
+ final ThreadContext context, final RubyString string,
92
+ final char value, final char quote,
93
+ final byte prefix, final byte suffix) {
94
+
95
+ final ByteList str = string.getByteList();
96
+ final RubyString quotedString = // part.gsub('v', 'vv')
97
+ quoteCharWith(context, string, value, quote, 1, 4 + 1);
98
+ if ( quotedString == string ) {
99
+ final int realSize = str.getRealSize();
100
+ final ByteList quoted = new ByteList(
101
+ new byte[realSize + 2], string.getEncoding(), false
102
+ );
103
+ quoted.setRealSize(0);
104
+ quoted.append(prefix);
105
+ quoted.append(str.unsafeBytes(), str.getBegin(), realSize);
106
+ quoted.append(suffix);
107
+ return context.runtime.newString(quoted);
108
+ }
109
+ // we got a new string with a reserve of 1 byte front and back :
110
+ final ByteList quoted = quotedString.getByteList();
111
+ quoted.setBegin(0);
112
+ quoted.unsafeBytes()[0] = prefix;
113
+ quoted.setRealSize(quoted.getRealSize() + 1);
114
+ quoted.append(suffix);
115
+ return quotedString;
116
+ }
117
+
118
+ public static final ByteList BYTES_SINGLE_Q = new ByteList(new byte[] { '\'' }, false);
119
+ public static final ByteList BYTES_SINGLE_Q_x2 = new ByteList(new byte[] { '\'', '\'' }, false);
120
+
121
+ // string.gsub("'", "''") :
122
+ public static IRubyObject quoteSingleQuotesWithFallback(
123
+ final ThreadContext context, final IRubyObject string) {
124
+ // string.gsub("'", "''") :
125
+ if ( string instanceof RubyString ) {
126
+ final char single = '\'';
127
+ return quoteCharWith(context, (RubyString) string, single, single);
128
+ }
129
+ else { // ActiveSupport::Multibyte::Chars
130
+ return Helpers.invoke(context, string, "gsub",
131
+ context.runtime.newString(BYTES_SINGLE_Q),
132
+ context.runtime.newString(BYTES_SINGLE_Q_x2)
133
+ );
134
+ }
135
+ }
136
+
137
+ }
@@ -0,0 +1,63 @@
1
+ /*
2
+ * The MIT License
3
+ *
4
+ * Copyright 2014 Karol Bucek.
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in
14
+ * all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ * THE SOFTWARE.
23
+ */
24
+ package arjdbc.util;
25
+
26
+ import java.lang.ref.SoftReference;
27
+ import java.util.concurrent.ConcurrentHashMap;
28
+
29
+ import org.jruby.Ruby;
30
+ import org.jruby.RubyString;
31
+ import org.jruby.runtime.ThreadContext;
32
+ import org.jruby.util.ByteList;
33
+
34
+ /**
35
+ * Cache of _unicode_ strings.
36
+ *
37
+ * @author kares
38
+ */
39
+ public final class StringCache {
40
+
41
+ final ConcurrentHashMap<String, SoftReference<ByteList>> cache = new ConcurrentHashMap<>(64);
42
+
43
+ public RubyString get(final ThreadContext context, final String key) {
44
+ final ByteList bytes;
45
+ final SoftReference<ByteList> ref = cache.get(key);
46
+ if ( ref == null || (bytes = ref.get()) == null ) return store(context, key);
47
+ return (RubyString) RubyString.newUnicodeString(context.runtime, bytes).freeze(context);
48
+ }
49
+
50
+ private RubyString store(final ThreadContext context, final String key) {
51
+ final Ruby runtime = context.runtime;
52
+ final RubyString str = RubyString.newUnicodeString(runtime, key);
53
+ cache.putIfAbsent(key, new SoftReference<>(str.getByteList()));
54
+ // not clearing up orphans - but since its to be used for column/table names ...
55
+ // should be fine - DB drivers tend do also cache some meta-data information
56
+ return (RubyString) str.freeze(context);
57
+ }
58
+
59
+ public void clear() {
60
+ cache.clear();
61
+ }
62
+
63
+ }
@@ -0,0 +1,145 @@
1
+ /*
2
+ * The MIT License
3
+ *
4
+ * Copyright 2014 Karol Bucek.
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in
14
+ * all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ * THE SOFTWARE.
23
+ */
24
+ package arjdbc.util;
25
+
26
+ import java.io.IOException;
27
+ import java.io.InputStream;
28
+
29
+ import org.jcodings.Encoding;
30
+ import org.jruby.Ruby;
31
+ import org.jruby.RubyString;
32
+ import org.jruby.util.ByteList;
33
+
34
+ /**
35
+ * Some (Ruby) byte string helpers.
36
+ *
37
+ * @author kares
38
+ */
39
+ public abstract class StringHelper {
40
+
41
+ public static byte decByte(final int digit) {
42
+ switch (digit) {
43
+ case 0 : return '0';
44
+ case 1 : return '1';
45
+ case 2 : return '2';
46
+ case 3 : return '3';
47
+ case 4 : return '4';
48
+ case 5 : return '5';
49
+ case 6 : return '6';
50
+ case 7 : return '7';
51
+ case 8 : return '8';
52
+ case 9 : return '9';
53
+ }
54
+ throw new IllegalStateException("unexpected digit: " + digit);
55
+ }
56
+
57
+ public static RubyString newString(final Ruby runtime, final byte[] bytes) {
58
+ return RubyString.newString(runtime, new ByteList(bytes, false));
59
+ }
60
+
61
+ public static RubyString newDefaultInternalString(final Ruby runtime, final byte[] bytes) {
62
+ final ByteList byteList = new ByteList(bytes, false);
63
+ Encoding enc = runtime.getDefaultInternalEncoding();
64
+ if (enc == null) enc = runtime.getEncodingService().getJavaDefault();
65
+ return RubyString.newString(runtime, byteList, enc);
66
+ }
67
+
68
+ public static RubyString newDefaultInternalString(final Ruby runtime, final CharSequence str) {
69
+ Encoding enc = runtime.getDefaultInternalEncoding();
70
+ if (enc == null) enc = runtime.getEncodingService().getJavaDefault();
71
+ return new RubyString(runtime, runtime.getString(), str, enc);
72
+ }
73
+
74
+ // NOTE: a 'better' RubyString.newInternalFromJavaExternal - to be back-ported in JRuby 9.2
75
+ public static RubyString newDefaultInternalString(final Ruby runtime, final String str) {
76
+ Encoding enc = runtime.getDefaultInternalEncoding();
77
+ if (enc == null) enc = runtime.getEncodingService().getJavaDefault();
78
+ return RubyString.newString(runtime, str, enc);
79
+ }
80
+
81
+ public static int readBytes(final ByteList output, final InputStream input)
82
+ throws IOException {
83
+ return readBytes(output, input, output.unsafeBytes().length - output.getBegin());
84
+ }
85
+
86
+ public static int readBytes(final ByteList output, final InputStream input, int buffSize)
87
+ throws IOException {
88
+ int read = 0;
89
+ while ( true ) {
90
+ output.ensure( output.getRealSize() + buffSize );
91
+ final int begin = output.getBegin();
92
+ final int size = output.getRealSize();
93
+ int n = input.read(output.unsafeBytes(), begin + size, buffSize);
94
+ if ( n == -1 ) break;
95
+ output.setRealSize( size + n ); read += n;
96
+ }
97
+ return read;
98
+ }
99
+
100
+ public static boolean startsWithIgnoreCase(final ByteList bytes, final byte[] start) {
101
+ int p = nonWhitespaceIndex(bytes, bytes.getBegin());
102
+ final byte[] stringBytes = bytes.unsafeBytes();
103
+ if ( stringBytes[p] == '(' ) {
104
+ p = nonWhitespaceIndex(bytes, p + 1);
105
+ }
106
+
107
+ for ( int i = 0; i < bytes.getRealSize() && i < start.length; i++ ) {
108
+ if ( Character.toLowerCase(stringBytes[p + i]) != start[i] ) return false;
109
+ }
110
+ return true;
111
+ }
112
+
113
+ public static int nonWhitespaceIndex(final ByteList string, final int off) {
114
+ final int end = string.getBegin() + string.getRealSize();
115
+ final byte[] stringBytes = string.unsafeBytes();
116
+ for ( int i = off; i < end; i++ ) {
117
+ if ( ! Character.isWhitespace( stringBytes[i] ) ) return i;
118
+ }
119
+ return end;
120
+ }
121
+
122
+ @SuppressWarnings("deprecation")
123
+ private static int nonSpaceIndex(final byte[] str, int beg, int len) {
124
+ for ( int i = beg; i < len; i++ ) {
125
+ if ( ! Character.isSpace( (char) str[i] ) ) return i;
126
+ }
127
+ return len;
128
+ }
129
+
130
+ private static int nonDigitIndex(final byte[] str, int beg, int len) {
131
+ for ( int i = beg; i < len; i++ ) {
132
+ if ( ! Character.isDigit( (char) str[i] ) ) return i;
133
+ }
134
+ return len;
135
+ }
136
+
137
+ private static int extractIntValue(final byte[] str, int beg, int end) {
138
+ int n = 0;
139
+ for ( int i = beg; i < end; i++ ) {
140
+ n = 10 * n + ( str[i] - '0' );
141
+ }
142
+ return n;
143
+ }
144
+
145
+ }
metadata ADDED
@@ -0,0 +1,269 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activerecord-jdbc-alt-adapter
3
+ version: !ruby/object:Gem::Version
4
+ version: 50.3.0
5
+ platform: java
6
+ authors:
7
+ - Nick Sieger, Ola Bini, Karol Bucek and JRuby contributors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-05-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: 5.0.0
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 5.0.3
22
+ name: activerecord
23
+ prerelease: false
24
+ type: :runtime
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 5.0.0
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.0.3
33
+ description: Fork of the ActiveRecord JDBC adapter with support for SQL Server/Azure
34
+ SQL,
35
+ email:
36
+ - nick@nicksieger.com
37
+ - ola.bini@gmail.com
38
+ - self@kares.org
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - ".gitignore"
44
+ - ".travis.yml"
45
+ - ".yardopts"
46
+ - CONTRIBUTING.md
47
+ - Gemfile
48
+ - History.md
49
+ - LICENSE.txt
50
+ - README.md
51
+ - RUNNING_TESTS.md
52
+ - Rakefile
53
+ - Rakefile.jdbc
54
+ - activerecord-jdbc-adapter.gemspec
55
+ - activerecord-jdbc-alt-adapter.gemspec
56
+ - lib/active_record/connection_adapters/as400_adapter.rb
57
+ - lib/active_record/connection_adapters/db2_adapter.rb
58
+ - lib/active_record/connection_adapters/derby_adapter.rb
59
+ - lib/active_record/connection_adapters/firebird_adapter.rb
60
+ - lib/active_record/connection_adapters/h2_adapter.rb
61
+ - lib/active_record/connection_adapters/hsqldb_adapter.rb
62
+ - lib/active_record/connection_adapters/informix_adapter.rb
63
+ - lib/active_record/connection_adapters/jdbc_adapter.rb
64
+ - lib/active_record/connection_adapters/jndi_adapter.rb
65
+ - lib/active_record/connection_adapters/mariadb_adapter.rb
66
+ - lib/active_record/connection_adapters/mssql_adapter.rb
67
+ - lib/active_record/connection_adapters/mysql2_adapter.rb
68
+ - lib/active_record/connection_adapters/mysql_adapter.rb
69
+ - lib/active_record/connection_adapters/postgresql_adapter.rb
70
+ - lib/active_record/connection_adapters/sqlite3_adapter.rb
71
+ - lib/active_record/connection_adapters/sqlserver_adapter.rb
72
+ - lib/activerecord-jdbc-adapter.rb
73
+ - lib/arel/visitors/compat.rb
74
+ - lib/arel/visitors/db2.rb
75
+ - lib/arel/visitors/derby.rb
76
+ - lib/arel/visitors/firebird.rb
77
+ - lib/arel/visitors/h2.rb
78
+ - lib/arel/visitors/hsqldb.rb
79
+ - lib/arel/visitors/postgresql_jdbc.rb
80
+ - lib/arel/visitors/sql_server.rb
81
+ - lib/arel/visitors/sql_server/ng42.rb
82
+ - lib/arel/visitors/sqlserver.rb
83
+ - lib/arjdbc.rb
84
+ - lib/arjdbc/abstract/connection_management.rb
85
+ - lib/arjdbc/abstract/core.rb
86
+ - lib/arjdbc/abstract/database_statements.rb
87
+ - lib/arjdbc/abstract/statement_cache.rb
88
+ - lib/arjdbc/abstract/transaction_support.rb
89
+ - lib/arjdbc/db2.rb
90
+ - lib/arjdbc/db2/adapter.rb
91
+ - lib/arjdbc/db2/as400.rb
92
+ - lib/arjdbc/db2/column.rb
93
+ - lib/arjdbc/db2/connection_methods.rb
94
+ - lib/arjdbc/derby.rb
95
+ - lib/arjdbc/derby/active_record_patch.rb
96
+ - lib/arjdbc/derby/adapter.rb
97
+ - lib/arjdbc/derby/connection_methods.rb
98
+ - lib/arjdbc/derby/schema_creation.rb
99
+ - lib/arjdbc/discover.rb
100
+ - lib/arjdbc/firebird.rb
101
+ - lib/arjdbc/firebird/adapter.rb
102
+ - lib/arjdbc/firebird/connection_methods.rb
103
+ - lib/arjdbc/h2.rb
104
+ - lib/arjdbc/h2/adapter.rb
105
+ - lib/arjdbc/h2/connection_methods.rb
106
+ - lib/arjdbc/hsqldb.rb
107
+ - lib/arjdbc/hsqldb/adapter.rb
108
+ - lib/arjdbc/hsqldb/connection_methods.rb
109
+ - lib/arjdbc/hsqldb/explain_support.rb
110
+ - lib/arjdbc/hsqldb/schema_creation.rb
111
+ - lib/arjdbc/informix.rb
112
+ - lib/arjdbc/informix/adapter.rb
113
+ - lib/arjdbc/informix/connection_methods.rb
114
+ - lib/arjdbc/jdbc.rb
115
+ - lib/arjdbc/jdbc/adapter.rb
116
+ - lib/arjdbc/jdbc/adapter_java.jar
117
+ - lib/arjdbc/jdbc/adapter_require.rb
118
+ - lib/arjdbc/jdbc/base_ext.rb
119
+ - lib/arjdbc/jdbc/callbacks.rb
120
+ - lib/arjdbc/jdbc/column.rb
121
+ - lib/arjdbc/jdbc/connection.rb
122
+ - lib/arjdbc/jdbc/connection_methods.rb
123
+ - lib/arjdbc/jdbc/error.rb
124
+ - lib/arjdbc/jdbc/extension.rb
125
+ - lib/arjdbc/jdbc/java.rb
126
+ - lib/arjdbc/jdbc/railtie.rb
127
+ - lib/arjdbc/jdbc/rake_tasks.rb
128
+ - lib/arjdbc/jdbc/serialized_attributes_helper.rb
129
+ - lib/arjdbc/jdbc/type_cast.rb
130
+ - lib/arjdbc/jdbc/type_converter.rb
131
+ - lib/arjdbc/mssql.rb
132
+ - lib/arjdbc/mssql/adapter.rb
133
+ - lib/arjdbc/mssql/column.rb
134
+ - lib/arjdbc/mssql/connection_methods.rb
135
+ - lib/arjdbc/mssql/database_statements.rb
136
+ - lib/arjdbc/mssql/errors.rb
137
+ - lib/arjdbc/mssql/explain_support.rb
138
+ - lib/arjdbc/mssql/extensions.rb
139
+ - lib/arjdbc/mssql/limit_helpers.rb
140
+ - lib/arjdbc/mssql/lock_methods.rb
141
+ - lib/arjdbc/mssql/old_adapter.rb
142
+ - lib/arjdbc/mssql/old_column.rb
143
+ - lib/arjdbc/mssql/quoting.rb
144
+ - lib/arjdbc/mssql/schema_creation.rb
145
+ - lib/arjdbc/mssql/schema_definitions.rb
146
+ - lib/arjdbc/mssql/schema_statements.rb
147
+ - lib/arjdbc/mssql/transaction.rb
148
+ - lib/arjdbc/mssql/types.rb
149
+ - lib/arjdbc/mssql/types/binary_types.rb
150
+ - lib/arjdbc/mssql/types/date_and_time_types.rb
151
+ - lib/arjdbc/mssql/types/deprecated_types.rb
152
+ - lib/arjdbc/mssql/types/numeric_types.rb
153
+ - lib/arjdbc/mssql/types/string_types.rb
154
+ - lib/arjdbc/mssql/utils.rb
155
+ - lib/arjdbc/mysql.rb
156
+ - lib/arjdbc/mysql/adapter.rb
157
+ - lib/arjdbc/mysql/connection_methods.rb
158
+ - lib/arjdbc/oracle/adapter.rb
159
+ - lib/arjdbc/postgresql.rb
160
+ - lib/arjdbc/postgresql/adapter.rb
161
+ - lib/arjdbc/postgresql/base/array_decoder.rb
162
+ - lib/arjdbc/postgresql/base/array_encoder.rb
163
+ - lib/arjdbc/postgresql/base/array_parser.rb
164
+ - lib/arjdbc/postgresql/base/pgconn.rb
165
+ - lib/arjdbc/postgresql/column.rb
166
+ - lib/arjdbc/postgresql/connection_methods.rb
167
+ - lib/arjdbc/postgresql/name.rb
168
+ - lib/arjdbc/postgresql/oid_types.rb
169
+ - lib/arjdbc/railtie.rb
170
+ - lib/arjdbc/sqlite3.rb
171
+ - lib/arjdbc/sqlite3/adapter.rb
172
+ - lib/arjdbc/sqlite3/connection_methods.rb
173
+ - lib/arjdbc/sybase.rb
174
+ - lib/arjdbc/sybase/adapter.rb
175
+ - lib/arjdbc/tasks.rb
176
+ - lib/arjdbc/tasks/database_tasks.rb
177
+ - lib/arjdbc/tasks/databases.rake
178
+ - lib/arjdbc/tasks/db2_database_tasks.rb
179
+ - lib/arjdbc/tasks/derby_database_tasks.rb
180
+ - lib/arjdbc/tasks/h2_database_tasks.rb
181
+ - lib/arjdbc/tasks/hsqldb_database_tasks.rb
182
+ - lib/arjdbc/tasks/jdbc_database_tasks.rb
183
+ - lib/arjdbc/tasks/mssql_database_tasks.rb
184
+ - lib/arjdbc/util/quoted_cache.rb
185
+ - lib/arjdbc/util/serialized_attributes.rb
186
+ - lib/arjdbc/util/table_copier.rb
187
+ - lib/arjdbc/version.rb
188
+ - lib/generators/jdbc/USAGE
189
+ - lib/generators/jdbc/jdbc_generator.rb
190
+ - lib/jdbc_adapter.rb
191
+ - lib/jdbc_adapter/rake_tasks.rb
192
+ - lib/jdbc_adapter/version.rb
193
+ - pom.xml
194
+ - rails_generators/jdbc_generator.rb
195
+ - rails_generators/templates/config/initializers/jdbc.rb
196
+ - rails_generators/templates/lib/tasks/jdbc.rake
197
+ - rakelib/01-tomcat.rake
198
+ - rakelib/02-test.rake
199
+ - rakelib/bundler_ext.rb
200
+ - rakelib/db.rake
201
+ - rakelib/rails.rake
202
+ - src/java/arjdbc/ArJdbcModule.java
203
+ - src/java/arjdbc/db2/DB2Module.java
204
+ - src/java/arjdbc/db2/DB2RubyJdbcConnection.java
205
+ - src/java/arjdbc/derby/DerbyModule.java
206
+ - src/java/arjdbc/derby/DerbyRubyJdbcConnection.java
207
+ - src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java
208
+ - src/java/arjdbc/h2/H2Module.java
209
+ - src/java/arjdbc/h2/H2RubyJdbcConnection.java
210
+ - src/java/arjdbc/hsqldb/HSQLDBModule.java
211
+ - src/java/arjdbc/informix/InformixRubyJdbcConnection.java
212
+ - src/java/arjdbc/jdbc/AdapterJavaService.java
213
+ - src/java/arjdbc/jdbc/Callable.java
214
+ - src/java/arjdbc/jdbc/ConnectionFactory.java
215
+ - src/java/arjdbc/jdbc/DataSourceConnectionFactory.java
216
+ - src/java/arjdbc/jdbc/DriverConnectionFactory.java
217
+ - src/java/arjdbc/jdbc/DriverWrapper.java
218
+ - src/java/arjdbc/jdbc/JdbcResult.java
219
+ - src/java/arjdbc/jdbc/RubyConnectionFactory.java
220
+ - src/java/arjdbc/jdbc/RubyJdbcConnection.java
221
+ - src/java/arjdbc/mssql/MSSQLModule.java
222
+ - src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java
223
+ - src/java/arjdbc/mysql/MySQLModule.java
224
+ - src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java
225
+ - src/java/arjdbc/oracle/OracleModule.java
226
+ - src/java/arjdbc/oracle/OracleRubyJdbcConnection.java
227
+ - src/java/arjdbc/postgresql/ByteaUtils.java
228
+ - src/java/arjdbc/postgresql/PgDateTimeUtils.java
229
+ - src/java/arjdbc/postgresql/PostgreSQLModule.java
230
+ - src/java/arjdbc/postgresql/PostgreSQLResult.java
231
+ - src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java
232
+ - src/java/arjdbc/sqlite3/SQLite3Module.java
233
+ - src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java
234
+ - src/java/arjdbc/util/CallResultSet.java
235
+ - src/java/arjdbc/util/DateTimeUtils.java
236
+ - src/java/arjdbc/util/ObjectSupport.java
237
+ - src/java/arjdbc/util/QuotingUtils.java
238
+ - src/java/arjdbc/util/StringCache.java
239
+ - src/java/arjdbc/util/StringHelper.java
240
+ homepage: https://github.com/JesseChavez/activerecord-jdbc-adapter
241
+ licenses:
242
+ - BSD-2-Clause
243
+ metadata: {}
244
+ post_install_message:
245
+ rdoc_options:
246
+ - "--main"
247
+ - README.md
248
+ - "-SHN"
249
+ - "-f"
250
+ - darkfish
251
+ require_paths:
252
+ - lib
253
+ required_ruby_version: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ required_rubygems_version: !ruby/object:Gem::Requirement
259
+ requirements:
260
+ - - ">="
261
+ - !ruby/object:Gem::Version
262
+ version: '0'
263
+ requirements: []
264
+ rubyforge_project:
265
+ rubygems_version: 2.7.9
266
+ signing_key:
267
+ specification_version: 4
268
+ summary: ActiveRecord JDBC adapter, for use within JRuby on Rails and SQL Server
269
+ test_files: []