module Spontaneous module DataMapper class ContentTable REVISION_PADDING = 5 def self.revision_table?(base_name, table_name) /\A__r\d+_#{base_name}\z/ === table_name.to_s end def self.pad_revision_number(revision_number) revision_number.to_s.rjust(REVISION_PADDING, "0") end def self.revision_table(base_name, revision_number) return base_name if revision_number.nil? "__r#{pad_revision_number(revision_number)}_#{base_name}".to_sym end # Extracts the revision number from a table name # # revision_number :content, :__r00034_content # => 34 # def self.revision_from_table(base_name, table_name) return nil if base_name == table_name return nil unless revision_table?(base_name, table_name) if (match = /\A__r(\d+)_#{base_name}\z/.match(table_name.to_s)) rev = match[1] return rev.to_i(10) end nil end attr_reader :name, :database def initialize(name, database) @name, @database = name, database end def columns dataset.columns end def primary_key :id end def dataset(revision = nil, visible_only = false) ds = @database[revision_table(revision)] ds.filter!(hidden: false) if visible_only ds end def logger @database.logger end def logger=(logger) @database.logger = logger end alias_method :db, :database def qualify(revision, col) Sequel::SQL::QualifiedIdentifier.new(revision_table(revision), col) end def quote_identifier(identifier) dataset.quote_identifier(identifier) end def revision_table(revision_number) self.class.revision_table(@name, revision_number) end def revision_from_table(table) self.class.revision_from_table(@name, table) end def revision_table?(table_name) self.class.revision_table?(@name, table_name) end def pad_revision_number(revision_number) self.class.pad_revision_number(revision_number) end def revision_history_table :"spontaneous_#{@name}_history" end def revision_archive_table :"spontaneous_#{@name}_archive" end def revision_history_dataset @database[revision_history_table] end def revision_archive_dataset @database[revision_archive_table] end end end end