Skip to content

Commit

Permalink
Allow use of a block in create_column_family
Browse files Browse the repository at this point in the history
  • Loading branch information
mwynholds committed Jan 11, 2011
1 parent 2bbf858 commit 4aeb031
Show file tree
Hide file tree
Showing 11 changed files with 309 additions and 240 deletions.
3 changes: 3 additions & 0 deletions Gemfile.lock
Expand Up @@ -63,6 +63,8 @@ GEM
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.16)
mocha (0.9.10)
rake
polyglot (0.3.1)
predicated (0.2.2)
rack (1.2.1)
Expand Down Expand Up @@ -134,6 +136,7 @@ DEPENDENCIES
activesupport
bluecloth
cassandra (>= 0.9)
mocha
rails (>= 3.0)
rake
rspec-rails
Expand Down
1 change: 1 addition & 0 deletions active_column.gemspec
Expand Up @@ -29,4 +29,5 @@ Gem::Specification.new do |s|
s.add_development_dependency 'wrong'
s.add_development_dependency 'yard'
s.add_development_dependency 'bluecloth'
s.add_development_dependency 'mocha'
end
1 change: 1 addition & 0 deletions lib/active_column.rb
Expand Up @@ -13,6 +13,7 @@ module ActiveColumn
autoload :Version, 'active_column/version'

require 'active_column/errors'
require 'active_column/migrator'
require 'active_column/migration'

module Tasks
Expand Down
22 changes: 10 additions & 12 deletions lib/active_column/configuration.rb
Expand Up @@ -2,24 +2,22 @@ module ActiveColumn

module Configuration

def configurations
@@configurations
end

def configuration=(configurations)
@@configurations = configurations
end

def config(env = Rails.env)
configurations[env || 'development']
end

def connection
@@connection
end

def connection=(connection)
@@connection = connection
@@keyspace_tasks = ActiveColumn::Tasks::Keyspace.new
@@column_family_tasks = ActiveColumn::Tasks::ColumnFamily.new
end

def keyspace_tasks
@@keyspace_tasks
end

def column_family_tasks
@@column_family_tasks
end

end
Expand Down
235 changes: 17 additions & 218 deletions lib/active_column/migration.rb
@@ -1,32 +1,5 @@
module ActiveColumn

class IrreversibleMigration < ActiveColumnError
end

class DuplicateMigrationVersionError < ActiveColumnError#:nodoc:
def initialize(version)
super("Multiple migrations have the version number #{version}")
end
end

class DuplicateMigrationNameError < ActiveColumnError#:nodoc:
def initialize(name)
super("Multiple migrations have the name #{name}")
end
end

class UnknownMigrationVersionError < ActiveColumnError #:nodoc:
def initialize(version)
super("No migration with version number #{version}")
end
end

class IllegalMigrationNameError < ActiveColumnError#:nodoc:
def initialize(name)
super("Illegal name for migration file: #{name}\n\t(only lower case letters, numbers, and '_' allowed)")
end
end

class Migration

@@verbose = true
Expand Down Expand Up @@ -56,11 +29,17 @@ def self.migrate(direction)
end

def self.create_column_family(name, options = {})
ActiveColumn::Tasks::ColumnFamily.new.create(name, options)
if block_given?
cf_opts = ColumnFamilyOptions.new
yield cf_opts
options.merge! cf_opts.options
end

ActiveColumn::Tasks::ColumnFamily.create(name, options)
end

def self.drop_column_family(name)
ActiveColumn::Tasks::ColumnFamily.new.drop(name)
ActiveColumn::Tasks::ColumnFamily.drop(name)
end

def self.write(text="")
Expand Down Expand Up @@ -118,201 +97,21 @@ def load_migration

end

class Migrator

def self.migrate(migrations_path, target_version = nil)
case
when target_version.nil?
up(migrations_path, target_version)
when current_version == 0 && target_version == 0
when current_version > target_version
down(migrations_path, target_version)
else
up(migrations_path, target_version)
end
end

def self.rollback(migrations_path, steps = 1)
move(:down, migrations_path, steps)
end

def self.forward(migrations_path, steps = 1)
move(:up, migrations_path, steps)
end

def self.up(migrations_path, target_version = nil)
self.new(:up, migrations_path, target_version).migrate
end

def self.down(migrations_path, target_version = nil)
self.new(:down, migrations_path, target_version).migrate
end

def self.run(direction, migrations_path, target_version)
self.new(direction, migrations_path, target_version).run
end

def self.migrations_path
'ks/migrate'
end

def self.schema_migrations_column_family
:schema_migrations
end

def self.get_all_versions
cas = ActiveColumn.connection
cas.get(schema_migrations_column_family, 'all').map {|(name, _value)| name.to_i}.sort
end

def self.current_version
sm_cf = schema_migrations_column_family
cf = ActiveColumn::Tasks::ColumnFamily.new
if cf.exists?(sm_cf)
get_all_versions.max || 0
else
0
end
end

private

def self.move(direction, migrations_path, steps)
migrator = self.new(direction, migrations_path)
start_index = migrator.migrations.index(migrator.current_migration)

if start_index
finish = migrator.migrations[start_index + steps]
version = finish ? finish.version : 0
send(direction, migrations_path, version)
end
end

public

def initialize(direction, migrations_path, target_version = nil)
cf = ActiveColumn::Tasks::ColumnFamily.new
sm_cf = self.class.schema_migrations_column_family

unless cf.exists?(sm_cf)
cf.create(sm_cf, :comparator_type => 'LongType')
end

@direction, @migrations_path, @target_version = direction, migrations_path, target_version
end

def current_version
migrated.last || 0
end

def current_migration
migrations.detect { |m| m.version == current_version }
end
private

def run
target = migrations.detect { |m| m.version == @target_version }
raise UnknownMigrationVersionError.new(@target_version) if target.nil?
unless (up? && migrated.include?(target.version.to_i)) || (down? && !migrated.include?(target.version.to_i))
target.migrate(@direction)
record_version_state_after_migrating(target)
class ColumnFamilyOptions
Cassandra::ColumnFamily::FIELDS.values.each do |f|
name = f[:name]
define_method("#{name}=") do|val|
@options[name.to_sym] = val
end
end

def migrate
current = migrations.detect { |m| m.version == current_version }
target = migrations.detect { |m| m.version == @target_version }
attr_reader :options

if target.nil? && !@target_version.nil? && @target_version > 0
raise UnknownMigrationVersionError.new(@target_version)
end

start = up? ? 0 : (migrations.index(current) || 0)
finish = migrations.index(target) || migrations.size - 1
runnable = migrations[start..finish]

# skip the last migration if we're headed down, but not ALL the way down
runnable.pop if down? && !target.nil?

runnable.each do |migration|
#puts "Migrating to #{migration.name} (#{migration.version})"

# On our way up, we skip migrating the ones we've already migrated
next if up? && migrated.include?(migration.version.to_i)

# On our way down, we skip reverting the ones we've never migrated
if down? && !migrated.include?(migration.version.to_i)
migration.announce 'never migrated, skipping'; migration.write
next
end

migration.migrate(@direction)
record_version_state_after_migrating(migration)
end
def initialize
@options = {}
end

def migrations
@migrations ||= begin
files = Dir["#{@migrations_path}/[0-9]*_*.rb"]

migrations = files.inject([]) do |klasses, file|
version, name = file.scan(/([0-9]+)_([_a-z0-9]*).rb/).first

raise IllegalMigrationNameError.new(file) unless version
version = version.to_i

if klasses.detect { |m| m.version == version }
raise DuplicateMigrationVersionError.new(version)
end

if klasses.detect { |m| m.name == name.camelize }
raise DuplicateMigrationNameError.new(name.camelize)
end

migration = MigrationProxy.new
migration.name = name.camelize
migration.version = version
migration.filename = file
klasses << migration
end

migrations = migrations.sort_by { |m| m.version }
down? ? migrations.reverse : migrations
end
end

def pending_migrations
already_migrated = migrated
migrations.reject { |m| already_migrated.include?(m.version.to_i) }
end

def migrated
@migrated_versions ||= self.class.get_all_versions
end

private

def record_version_state_after_migrating(migration)
cas = ActiveColumn.connection
sm_cf = self.class.schema_migrations_column_family

@migrated_versions ||= []
if down?
@migrated_versions.delete(migration.version)
cas.remove sm_cf, 'all', migration.version
else
@migrated_versions.push(migration.version).sort!
cas.insert sm_cf, 'all', { migration.version => migration.name }
end
end

def up?
@direction == :up
end

def down?
@direction == :down
end

end

end

0 comments on commit 4aeb031

Please sign in to comment.