I modified that patch a little to work properly. I think it still have
some holes, but does enough for autoincrementing key support.
Also this patch adds some extra options to primary key definition:
   :sequence_name - string, name of sequence to be created
   :trigger_name - string, name of trigger
   :create_sequence - boolean
   :create_trigger - boolean

Here is my diff:

diff --git a/lib/sequel/adapters/shared/oracle.rb b/lib/sequel/
adapters/shared/oracle.rb
index 6bec81a..3a49c74 100644
--- a/lib/sequel/adapters/shared/oracle.rb
+++ b/lib/sequel/adapters/shared/oracle.rb
@@ -4,6 +4,27 @@ module Sequel
   module Oracle
     module DatabaseMethods
       TEMPORARY = 'GLOBAL TEMPORARY '.freeze
+      AUTOINCREMENT = ''.freeze
+
+      def create_sequence(name, opts={})
+        self << create_sequence_sql(name, opts)
+      end
+
+      def create_table(name, options={}, &block)
+        options = {:generator=>options} if options.is_a?
(Schema::Generator)
+        generator = options[:generator] || Schema::Generator.new
(self, &block)
+        drop_statement, create_statements = create_table_sql_list
(name, generator, options)
+        (execute_ddl(drop_statement) rescue nil) if drop_statement
+        (create_statements + index_sql_list(name,
generator.indexes)).each{|sql| execute_ddl(sql)}
+      end
+
+      def create_trigger(*args)
+        self << create_trigger_sql(*args)
+      end
+
+      def drop_sequence(name)
+        self << drop_sequence_sql(name)
+      end

       # Oracle uses the :oracle database type
       def database_type
@@ -21,12 +42,63 @@ module Sequel

       private

+      def auto_increment_sql
+        AUTOINCREMENT
+      end
+
       # SQL fragment for showing a table is temporary
       def temporary_table_sql
         TEMPORARY
       end
+
+      private
+
+      def create_sequence_sql(name, opts={})
+        "CREATE SEQUENCE #{quote_identifier(name)} start with #{opts
[:start_with]||1} increment by #{opts[:increment_by]||1} nomaxvalue"
+      end
+
+      def create_table_sql_list(name, generator, options={})
+        statements = [create_table_sql(name, generator, options)]
+        drop_seq_statement = nil
+        generator.columns.each do |c|
+          if c[:auto_increment]
+            c[:sequence_name] ||= "seq_#{name}_#{c[:name]}"
+            unless c[:create_sequence] == false
+              drop_seq_statement = drop_sequence_sql(c
[:sequence_name])
+              statements << create_sequence_sql(c[:sequence_name], c)
+            end
+            unless c[:create_trigger] == false
+              c[:trigger_name] ||= "BI_#{name}_#{c[:name]}"
+              trigger_definition = <<-end_sql
+              BEGIN
+                           IF :NEW.#{quote_identifier(c[:name])} IS NULL THEN
+                  SELECT #{c[:sequence_name]}.nextval INTO :NEW.#
{quote_identifier(c[:name])} FROM dual;
+                               END IF;
+              END;
+              end_sql
+              statements << create_trigger_sql(name, c
[:trigger_name], trigger_definition, {:events => [:insert]})
+            end
+          end
+        end
+        [drop_seq_statement, statements]
+      end
+
+      def create_trigger_sql(table, name, definition, opts={})
+        events = opts[:events] ? Array(opts[:events]) :
[:insert, :update, :delete]
+        sql = <<-end_sql
+          CREATE#{' OR REPLACE' if opts[:replace]} TRIGGER #
{quote_identifier(name)}
+          #{opts[:after] ? 'AFTER' : 'BEFORE'} #{events.map{|e|
e.to_s.upcase}.join(' OR ')} ON #{quote_schema_table(table)}
+          REFERENCING NEW AS NEW FOR EACH ROW
+          #{definition}
+        end_sql
+        sql
+      end
+
+      def drop_sequence_sql(name)
+        "DROP SEQUENCE #{quote_identifier(name)}"
+      end
     end
-
+
     module DatasetMethods
       include Dataset::UnsupportedIntersectExceptAll
       include Dataset::SQLStandardDateFormat

Best regards,
Mike
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to