Title: [1010] trunk/activerecord-jdbc: 10021: very preliminary sybase support (
Mark Atkinson)
- Revision
- 1010
- Author
- nicksieger
- Date
- 2008-06-03 23:17:02 -0400 (Tue, 03 Jun 2008)
Log Message
10021: very preliminary sybase support (Mark Atkinson)
Not usable until collision w/ sqlserver driver is resolved.
Modified Paths
Added Paths
Diff
Modified: trunk/activerecord-jdbc/History.txt (1009 => 1010)
--- trunk/activerecord-jdbc/History.txt 2008-06-04 03:16:57 UTC (rev 1009)
+++ trunk/activerecord-jdbc/History.txt 2008-06-04 03:17:02 UTC (rev 1010)
@@ -14,6 +14,7 @@
- 20172: don't quote table names for MSSQL (Thor Marius Henrichsen)
- 19729: check for primary key existence in postgres during insert (Martin Luder)
- 18846: retrying failing SQL statements is harmful when not autocommitting (Craig McMillan)
+- 10021: very preliminary sybase support. (Mark Atkinson) Not usable until collision w/ sqlserver driver is resolved.
== 0.8
Modified: trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter_spec.rb (1009 => 1010)
--- trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter_spec.rb 2008-06-04 03:16:57 UTC (rev 1009)
+++ trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter_spec.rb 2008-06-04 03:17:02 UTC (rev 1010)
@@ -10,3 +10,4 @@
require 'jdbc_adapter/jdbc_mssql'
require 'jdbc_adapter/jdbc_cachedb'
require 'jdbc_adapter/jdbc_sqlite3'
+require 'jdbc_adapter/jdbc_sybase'
Added: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_sybase.rb (0 => 1010)
--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_sybase.rb (rev 0)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_sybase.rb 2008-06-04 03:17:02 UTC (rev 1010)
@@ -0,0 +1,39 @@
+module JdbcSpec
+ module Sybase
+ def self.adapter_selector
+ [/sybase/i, lambda{|cfg,adapt| adapt.extend(JdbcSpec::Sybase)}]
+ end
+
+ def add_limit_offset!(sql, options) # :nodoc:
+ @limit = options[:limit]
+ @offset = options[:offset]
+ if use_temp_table?
+ # Use temp table to hack offset with Sybase
+ sql.sub!(/ FROM /i, ' INTO #artemp FROM ')
+ elsif zero_limit?
+ # "SET ROWCOUNT 0" turns off limits, so we havesy
+ # to use a cheap trick.
+ if sql =~ /WHERE/i
+ sql.sub!(/WHERE/i, 'WHERE 1 = 2 AND ')
+ elsif sql =~ /ORDER\s+BY/i
+ sql.sub!(/ORDER\s+BY/i, 'WHERE 1 = 2 ORDER BY')
+ else
+ sql << 'WHERE 1 = 2'
+ end
+ end
+ end
+
+ # If limit is not set at all, we can ignore offset;
+ # if limit *is* set but offset is zero, use normal select
+ # with simple SET ROWCOUNT. Thus, only use the temp table
+ # if limit is set and offset > 0.
+ def use_temp_table?
+ [EMAIL PROTECTED] && [EMAIL PROTECTED] && @offset > 0
+ end
+
+ def zero_limit?
+ [EMAIL PROTECTED] && @limit == 0
+ end
+
+ end
+end
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel