lib/spontaneous/data_mapper/content_table.rb
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