Skip to content

Instantly share code, notes, and snippets.

@mattetti
Created December 14, 2008 22:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattetti/046d73e2f0a93d9ffa66 to your computer and use it in GitHub Desktop.
Save mattetti/046d73e2f0a93d9ffa66 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'dm-core'
# DataMapper.setup(:legacy, "sqlite3:///#{Dir.pwd}/legacy.db")
# DataMapper.setup(:new, "sqlite3:///#{Dir.pwd}/new.db")
DataMapper.setup( :legacy,
:adapter => "mysql",
:encoding => "utf8",
:database => "dm_legacy",
:username => "root",
:host => "localhost" )
DataMapper.setup( :new,
:adapter => "mysql",
:encoding => "utf8",
:database => "dm_new",
:username => "root",
:host => "localhost" )
module DataMapper
module Types
class LegacyBlogId < DataMapper::Type
primitive String
def self.load(value, property)
case value
when 'en'
1
else
2
end
end
end
end
end
class LegacyArticle
include DataMapper::Resource
storage_names[:legacy] = 'articles'
property :id, Serial
property :text, Text
property :title, String, :length => 255
property :language, String, :default => "en"
property :created_on, DateTime
end
class NewArticle
include DataMapper::Resource
storage_names[:new] = 'items'
property :id, Serial
property :body, Text
property :main_title, String, :length => 255
property :blog_id, Integer, :default => 1
property :created_at, Date
property :created_on, DateTime
property :author_id, Integer, :default => 1
end
class Article
include DataMapper::Resource
storage_names[:legacy] = 'articles'
storage_names[:new] = 'items'
property :id, Serial
property :body, Text
property :title, String
property :created_on, DateTime
property :created_at, DateTime
property :author_id, Integer
property :blog_id, Integer
repository(:legacy) do
property :body, Text, :field => "text"
property :blog_id, LegacyBlogId, :field => "language"
property :created_at, DateTime, :field => "created_on"
# property :author_id Skip
end
repository(:new) do
property :title, String, :field => "main_title"
end
# quick hack to avoid yet another DM bug
def to_hash
property_hash = {}
Article.properties.defaults.map{|property| property_hash[property.name] = self.send(property.name)}
property_hash.except(:id)
end
# Monkey patch the copy method to work
def self.copy(source, destination, query={})
repository(destination) do
repository(source).read_many(DataMapper::Query.new(repository(source), self, query)).each do |resource|
self.create(resource.attributes.except(:id))
end
end
end
end
# Load some data in the legacy repo
repository(:legacy) do
LegacyArticle.auto_migrate!
LegacyArticle.create(:text => "this is a legacy body", :title => "this is the title", :language => "fr", :created_on => Time.now)
LegacyArticle.create(:text => "this is another legacy body", :title => "this is another title", :created_on => Time.now)
puts "legacy articles created"
end
# Load some data in the new repo
repository(:new) do
NewArticle.auto_migrate!
NewArticle.create(:body => "this is a new body", :main_title => "this is the title", :blog_id => 1, :created_on => Time.now, :created_on => Time.now)
NewArticle.create(:body => "this is another new body", :main_title => "this is another title", :blog_id => 2, :created_on => Time.now, :created_on => Time.now)
puts "new articles created"
end
begin
Article.copy(:legacy, :new)
rescue Exception => e
puts "Boo Model#copy didn't work! #{e}"
else
puts "Model#copy worked fine"
end
begin
old_article = repository(:legacy) { Article.first }
new_article = repository(:new) { Article.first }
fresh_article = repository(:new) { Article.new }
fresh_article.attributes = old_article.to_hash
repository(:new) { fresh_article.save }
rescue Exception => e
puts "new object with legacy attributes failed #{e}"
else
puts fresh_article.attributes.inspect
puts "new object with legacy attributes worked fine!"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment