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

Reply via email to