[Groonga-commit] ranguba/groonga-client-model at 1c82582 [master] Support recording schema version

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Mar 1 21:15:50 JST 2017


Kouhei Sutou	2017-03-01 21:15:50 +0900 (Wed, 01 Mar 2017)

  New Revision: 1c82582ce2e65ebe43538d2eda095b94bf3c6057
  https://github.com/ranguba/groonga-client-model/commit/1c82582ce2e65ebe43538d2eda095b94bf3c6057

  Message:
    Support recording schema version

  Modified files:
    lib/groonga_client_model/migrator.rb

  Modified: lib/groonga_client_model/migrator.rb (+52 -6)
===================================================================
--- lib/groonga_client_model/migrator.rb    2017-03-01 16:57:15 +0900 (be31462)
+++ lib/groonga_client_model/migrator.rb    2017-03-01 21:15:50 +0900 (278a39e)
@@ -21,6 +21,8 @@ module GroongaClientModel
     def initialize(search_paths, target_version)
       @search_paths = Array(search_paths)
       @target_version = target_version
+      ensure_versions
+      @current_version =****@versi***** || 0
     end
 
     def migrate
@@ -30,15 +32,17 @@ module GroongaClientModel
           report(definition) do
             if forward?
               migration.up
+              add_version(client, definition.version)
             else
               migration.down
+              delete_version(client, definition.version)
             end
           end
         end
       end
     end
 
-    def each(&block)
+    def each
       paths = []
       @search_paths.each do |search_path|
         paths |= Dir.glob("#{search_path}/**/[0-9]*_*.rb").collect do |path|
@@ -53,20 +57,62 @@ module GroongaClientModel
       sorted_definitions = definitions.sort_by(&:version)
 
       if forward?
-        sorted_definitions.each(&block)
+        sorted_definitions.each do |definition|
+          yield(definition) if definition.version > @current_version
+        end
       else
-        sorted_definitions.reverse_each(&block)
+        sorted_definitions.reverse_each do |definition|
+          yield(definition) if definition.version <= @current_version
+        end
       end
     end
 
     private
+    def version_table_name
+      "schema_versions"
+    end
+
+    def ensure_versions
+      Client.open do |client|
+        table_name = version_table_name
+        exist = client.object_exist(name: table_name).body
+        if exist
+          @versions = client.request(:select).
+            parameter(:table, table_name).
+            sort_keys([:_key]).
+            limit(-1).
+            output_columns(["_key"]).
+            response.
+            records.
+            collect(&:_key)
+        else
+          client.request(:table_create).
+            parameter(:name, table_name).
+            flags_parameter(:flags, ["TABLE_PAT_KEY"]).
+            parameter(:key_type, "UInt64").
+            response
+          @versions = []
+        end
+      end
+    end
+
     def forward?
       @target_version.nil? or
-        (@target_version > current_version)
+        (@target_version > @current_version)
+    end
+
+    def add_version(client, version)
+      client.request(:load).
+        parameter(:table, version_table_name).
+        parameter(:values, [{"_key" => version}].to_json).
+        response
     end
 
-    def current_version
-      0 # TODO
+    def delete_version(client, version)
+      client.request(:delete).
+        parameter(:table, version_table_name).
+        parameter(:key, version).
+        response
     end
 
     def report(definition)
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index