usesguid_migrations 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/History.txt +3 -0
- data/LICENSE +20 -0
- data/README.rdoc +130 -0
- data/Rakefile +50 -0
- data/VERSION +1 -0
- data/lib/usesguid_migrations/active_record_extensions/base.rb +31 -0
- data/lib/usesguid_migrations/active_record_extensions/connection_adapters/mysql_adapter.rb +46 -0
- data/lib/usesguid_migrations/active_record_extensions/connection_adapters/schema_statements.rb +60 -0
- data/lib/usesguid_migrations/active_record_extensions/connection_adapters/table_definition.rb +38 -0
- data/lib/usesguid_migrations/active_record_extensions/schema.rb +29 -0
- data/lib/usesguid_migrations/active_record_extensions/schema_dumper.rb +138 -0
- data/lib/usesguid_migrations.rb +26 -0
- data/script/console +10 -0
- data/testdb.rake.txt +44 -0
- data/usesguid_migrations.gemspec +62 -0
- metadata +100 -0
data/.gitignore
ADDED
data/History.txt
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 C. Jason Harrelson (midas)
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
= usesguid_migrations
|
2
|
+
|
3
|
+
http://github.com/midas/usesguid_migrations/tree/master
|
4
|
+
|
5
|
+
|
6
|
+
== DESCRIPTION
|
7
|
+
|
8
|
+
To be used with http://github.com/BMorearty/usesguid/tree/master. It can be a pain to explicitly declare the correct
|
9
|
+
column types, etc. for your usesguid migrations. For instance:
|
10
|
+
|
11
|
+
create_table :users, :id => false, :force => true do |t|
|
12
|
+
t.binary :id, :limit => 22, :null => false
|
13
|
+
...
|
14
|
+
t.binary :account_id, :limit => 22, :null => false
|
15
|
+
end
|
16
|
+
|
17
|
+
execute "ALTER TABLE `users` MODIFY COLUMN `id` VARCHAR(22) BINARY CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;"
|
18
|
+
execute "ALTER TABLE `users` ADD PRIMARY KEY (id)"
|
19
|
+
execute "ALTER TABLE `users` MODIFY COLUMN `account_id` VARCHAR(22) BINARY CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;"
|
20
|
+
|
21
|
+
In addition, this technique will fail to keep you schema.rb file correctly up to date. The binary varchar(22) fields will actually be
|
22
|
+
output as:
|
23
|
+
|
24
|
+
t.string "id", :limit => 22, :null => false
|
25
|
+
t.string "account_id", :limit => 22
|
26
|
+
|
27
|
+
This will include no:
|
28
|
+
|
29
|
+
execute "ALTER TABLE `users` MODIFY COLUMN `id` VARCHAR(22) BINARY CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;"
|
30
|
+
execute "ALTER TABLE `users` ADD PRIMARY KEY (id)"
|
31
|
+
execute "ALTER TABLE `users` MODIFY COLUMN `account_id` VARCHAR(22) BINARY CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;"
|
32
|
+
|
33
|
+
So you will end up getting unique id collisions due to the non-case sensitivity of the string field in MySQL without a latin1_bin
|
34
|
+
collation.
|
35
|
+
|
36
|
+
Enter usesguid_migrations. This plugin will automatically create an id field (just as migrations currently do), but it will be of the
|
37
|
+
type necessary for usesguid to work correctly.
|
38
|
+
|
39
|
+
|
40
|
+
== FEATURES
|
41
|
+
|
42
|
+
* Automatically generate an id field with correct typing for usesguid
|
43
|
+
* Migration associated method for generating foreign keys with correct typing for usesguid
|
44
|
+
* Schema dumper will create schema.rb files with the correct typing for usesguid
|
45
|
+
|
46
|
+
|
47
|
+
== TO DO
|
48
|
+
|
49
|
+
* Add ability for the add_column and change_column methods to accept an option turning them into guids
|
50
|
+
* Tests, tests and more tests (if anyone has any ideas of how to accomplish this please let me know, I am currently at a loss of how to test something like this)
|
51
|
+
|
52
|
+
|
53
|
+
== REQUIREMENTS
|
54
|
+
|
55
|
+
* Rails 2.0 or above
|
56
|
+
* usesguid Gem (http://github.com/midas/usesguid)
|
57
|
+
|
58
|
+
|
59
|
+
== USAGE
|
60
|
+
|
61
|
+
Simply create a normal create table migration and an id field with correct typing for usesguid will be generated.
|
62
|
+
|
63
|
+
In addition, if you would like to declare a foreign key field that needs to be of the
|
64
|
+
correct type to use usesguid, just use the associated method:
|
65
|
+
|
66
|
+
create_table :whatevers, :force => true do |t|
|
67
|
+
t.references_with_guid :account
|
68
|
+
end
|
69
|
+
|
70
|
+
This will create a field named account_id that is of the correct type for usesguid. It will also assume that the column
|
71
|
+
is not nullable as it is more than likely a foreign key. to Make it nullable you must use th e:null => true option:
|
72
|
+
|
73
|
+
t.references_with_guid :account
|
74
|
+
|
75
|
+
or
|
76
|
+
|
77
|
+
t.references_with_guid :account, :null => true
|
78
|
+
|
79
|
+
If you need a table with a standard Rails id field just use the :guid option of the crate_table method.
|
80
|
+
|
81
|
+
create_table :users, :guid => false do |t|
|
82
|
+
...
|
83
|
+
t.references_with_guid :account # will still use a guid regardless of the :guid => false option in the create_table params above
|
84
|
+
end
|
85
|
+
|
86
|
+
If you need a table with no id at all, just use the normal :primary_key option of the create_table method and
|
87
|
+
you will have no id field automatically generated.
|
88
|
+
|
89
|
+
create_table :users, :primary_key => false do |t|
|
90
|
+
...
|
91
|
+
end
|
92
|
+
|
93
|
+
If you run into any issues with running tests or specs, it could be something strange happening in your schema.rb file. This
|
94
|
+
file is used to prepare the database for testing. To override this and make migrations be used to prepare the database, copy
|
95
|
+
and rename the testdb.rake.txt file to {project root}/lib/tasks/testdb.rake.
|
96
|
+
|
97
|
+
|
98
|
+
== INSTALL
|
99
|
+
|
100
|
+
From the command line:
|
101
|
+
|
102
|
+
sudo gem install usesguid_migrations
|
103
|
+
|
104
|
+
In Rails environment.rb:
|
105
|
+
|
106
|
+
config.gem "usesguid_migrations"
|
107
|
+
|
108
|
+
|
109
|
+
== LICENSE
|
110
|
+
|
111
|
+
Copyright (c) 2009 C. Jason Harrelson (midas)
|
112
|
+
|
113
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
114
|
+
a copy of this software and associated documentation files (the
|
115
|
+
"Software"), to deal in the Software without restriction, including
|
116
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
117
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
118
|
+
permit persons to whom the Software is furnished to do so, subject to
|
119
|
+
the following conditions:
|
120
|
+
|
121
|
+
The above copyright notice and this permission notice shall be
|
122
|
+
included in all copies or substantial portions of the Software.
|
123
|
+
|
124
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
125
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
126
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
127
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
128
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
129
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
130
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "usesguid_migrations"
|
8
|
+
gem.summary = %Q{Makes your migrations work with usesguid plugin without explicitly defining the keys migrations.}
|
9
|
+
gem.description = %Q{Makes your migrations work with usesguid plugin without explicitly defining the primary key id or foreign keys in migrations.}
|
10
|
+
gem.email = "jason@lookforwardenterprises.com"
|
11
|
+
gem.homepage = "http://github.com/midas/usesguid_migrations"
|
12
|
+
gem.authors = ["Jason Harrelson"]
|
13
|
+
gem.add_development_dependency "rspec"
|
14
|
+
gem.add_dependency "activerecord", ">= 2.3"
|
15
|
+
gem.add_dependency "usesguid"
|
16
|
+
end
|
17
|
+
Jeweler::GemcutterTasks.new
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'spec/rake/spectask'
|
23
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
24
|
+
spec.libs << 'lib' << 'spec'
|
25
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
26
|
+
end
|
27
|
+
|
28
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
29
|
+
spec.libs << 'lib' << 'spec'
|
30
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
31
|
+
spec.rcov = true
|
32
|
+
end
|
33
|
+
|
34
|
+
task :spec => :check_dependencies
|
35
|
+
|
36
|
+
task :default => :spec
|
37
|
+
|
38
|
+
require 'rake/rdoctask'
|
39
|
+
Rake::RDocTask.new do |rdoc|
|
40
|
+
if File.exist?('VERSION')
|
41
|
+
version = File.read('VERSION')
|
42
|
+
else
|
43
|
+
version = ""
|
44
|
+
end
|
45
|
+
|
46
|
+
rdoc.rdoc_dir = 'rdoc'
|
47
|
+
rdoc.title = "usesguid_migrations #{version}"
|
48
|
+
rdoc.rdoc_files.include('README*')
|
49
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
50
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module UsesguidMigrations
|
2
|
+
module ActiveRecordExtensions
|
3
|
+
module Base
|
4
|
+
|
5
|
+
def self.included( base )
|
6
|
+
base.extend( ClassMethods )
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def self.extended( base )
|
11
|
+
class << base
|
12
|
+
alias_method_chain :abstract_class?, :lfe_usesguid_migrations
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def abstract_class_with_lfe_usesguid_migrations?
|
17
|
+
abstract_class_without_lfe_usesguid_migrations? || !(name =~ /^Abstract/).nil?
|
18
|
+
end
|
19
|
+
|
20
|
+
def base_class?
|
21
|
+
self == base_class
|
22
|
+
end
|
23
|
+
|
24
|
+
def pluralized_table_name( table_name )
|
25
|
+
ActiveRecord::Base.pluralize_table_names ? table_name.to_s.pluralize : table_name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module UsesguidMigrations
|
2
|
+
module ActiveRecordExtensions
|
3
|
+
module ConnectionAdapters
|
4
|
+
module MysqlAdapter
|
5
|
+
|
6
|
+
def primary_key_name( table_name, name=nil )
|
7
|
+
results = execute( "SHOW CREATE TABLE `#{table_name}`", name )
|
8
|
+
keys = []
|
9
|
+
primary_key = nil
|
10
|
+
|
11
|
+
results.each do |row|
|
12
|
+
row[1].each do |line|
|
13
|
+
keys << $1 if line =~ /^ [`"](.+?)[`"] varchar\(22\) character set latin1 collate latin1_bin NOT NULL?,?$/
|
14
|
+
primary_key = $1 if line =~ /^ PRIMARY KEY \([`"](.+?)[`"]\)$/
|
15
|
+
primary_key = $1 if line =~ /^ PRIMARY KEY \([`"](.+?)[`"]\),$/
|
16
|
+
primary_key = $1 if line =~ /^ PRIMARY KEY \([`"](.+?)[`"]\), $/
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
return keys.include?( primary_key ) ? primary_key : nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def foreign_keys( table_name, name=nil )
|
24
|
+
results = execute( "SHOW CREATE TABLE `#{table_name}`", name )
|
25
|
+
|
26
|
+
null_foreign_keys = []
|
27
|
+
not_null_foreign_keys = []
|
28
|
+
primary_keys = []
|
29
|
+
|
30
|
+
results.each do |row|
|
31
|
+
row[1].each do |line|
|
32
|
+
null_foreign_keys << $1 if line =~ /^ [`"](.+?)[`"] varchar\(22\) character set latin1 collate latin1_bin default NULL?,?$/
|
33
|
+
not_null_foreign_keys << $1 if line =~ /^ [`"](.+?)[`"] varchar\(22\) character set latin1 collate latin1_bin NOT NULL?,?$/
|
34
|
+
primary_keys << $1 if line =~ /^ PRIMARY KEY \([`"](.+?)[`"]\)$/
|
35
|
+
primary_keys << $1 if line =~ /^ PRIMARY KEY \([`"](.+?)[`"]\),$/
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
return null_foreign_keys - primary_keys, not_null_foreign_keys - primary_keys
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/usesguid_migrations/active_record_extensions/connection_adapters/schema_statements.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
module UsesguidMigrations
|
2
|
+
module ActiveRecordExtensions
|
3
|
+
module ConnectionAdapters
|
4
|
+
module SchemaStatements
|
5
|
+
|
6
|
+
def self.included( base )
|
7
|
+
base.module_eval do
|
8
|
+
alias_method_chain :create_table, :lfe_usesguid_migrations
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_table_with_lfe_usesguid_migrations( table_name, options={} )
|
13
|
+
table_definition = ActiveRecord::ConnectionAdapters::TableDefinition.new( self )
|
14
|
+
#table_definition = TableDefinition.new( self )
|
15
|
+
|
16
|
+
if options[:guid] == false
|
17
|
+
table_definition.primary_key( options[:primary_key] || ActiveRecord::Base.get_primary_key( table_name ) ) unless options[:id] == false
|
18
|
+
else
|
19
|
+
table_definition.guid_primary_key( options[:primary_key] || ActiveRecord::Base.get_primary_key( table_name ) ) unless options[:id] == false
|
20
|
+
end
|
21
|
+
|
22
|
+
yield table_definition
|
23
|
+
|
24
|
+
if options[:force] && table_exists?( table_name )
|
25
|
+
drop_table( table_name, options )
|
26
|
+
end
|
27
|
+
|
28
|
+
create_sql = "CREATE#{' TEMPORARY' if options[:temporary]} TABLE "
|
29
|
+
create_sql << "#{quote_table_name( table_name )} ("
|
30
|
+
create_sql << table_definition.to_sql
|
31
|
+
create_sql << ") #{options[:options]}"
|
32
|
+
execute create_sql
|
33
|
+
|
34
|
+
# TODO this needs to be different for each adapter
|
35
|
+
unless table_name == "schema_migrations"
|
36
|
+
unless options[:id] == false || options[:guid] == false
|
37
|
+
execute "ALTER TABLE `#{table_name}` MODIFY COLUMN `#{table_definition.primary_key_name}` VARCHAR(22) BINARY CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;"
|
38
|
+
execute "ALTER TABLE `#{table_name}` ADD PRIMARY KEY (#{table_definition.primary_key_name})"
|
39
|
+
end
|
40
|
+
|
41
|
+
return if table_definition.associative_keys.nil?
|
42
|
+
|
43
|
+
table_definition.associative_keys.each do |assoc|
|
44
|
+
key = assoc.name
|
45
|
+
opts = assoc.options
|
46
|
+
sql = "ALTER TABLE `#{table_name}` MODIFY COLUMN `#{key}` VARCHAR(#{opts[:limit] || 22}) BINARY CHARACTER SET latin1 COLLATE latin1_bin"
|
47
|
+
if opts[:null] == false || opts[:null].nil?
|
48
|
+
sql << " NOT NULL;"
|
49
|
+
else
|
50
|
+
sql << ";"
|
51
|
+
end
|
52
|
+
execute( sql )
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module UsesguidMigrations
|
2
|
+
module ActiveRecordExtensions
|
3
|
+
module ConnectionAdapters
|
4
|
+
module TableDefinition
|
5
|
+
|
6
|
+
def self.included( base )
|
7
|
+
base.class_eval do
|
8
|
+
include InstanceMethods
|
9
|
+
attr_accessor :primary_key_name
|
10
|
+
attr_accessor :associative_keys
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module InstanceMethods
|
15
|
+
def guid_primary_key( name )
|
16
|
+
@primary_key_name = name
|
17
|
+
column( name, :binary, :limit => 22, :null => false )
|
18
|
+
end
|
19
|
+
|
20
|
+
def references_with_guid( name, options={} )
|
21
|
+
name = name.to_s
|
22
|
+
name = "#{name}_id" unless name.end_with?( "_id" )
|
23
|
+
guid( name, options )
|
24
|
+
end
|
25
|
+
|
26
|
+
def guid( name, options={} )
|
27
|
+
@associative_keys = [] if @associative_keys.nil?
|
28
|
+
options.merge!( :limit => 22 )
|
29
|
+
options.merge!( :null => false ) unless options[:null] == true # make not nullable the default for a guid column as it is likely a foreign key
|
30
|
+
@associative_keys << OpenStruct.new( :name => name, :options => options )
|
31
|
+
column( name, :binary, options )
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module UsesguidMigrations
|
2
|
+
module ActiveRecordExtensions
|
3
|
+
module Schema
|
4
|
+
|
5
|
+
def self.included( base )
|
6
|
+
base.extend( ClassMethods )
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def self.extended( base )
|
11
|
+
class << base
|
12
|
+
attr_accessor :defining
|
13
|
+
alias :defining? :defining
|
14
|
+
|
15
|
+
alias_method_chain :define, :lfe_usesguid_migrations
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def define_with_lfe_usesguid_migrations( info={}, &block )
|
20
|
+
self.defining = true
|
21
|
+
define_without_lfe_usesguid_migrations( info, &block )
|
22
|
+
ensure
|
23
|
+
self.defining = false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module UsesguidMigrations
|
2
|
+
module ActiveRecordExtensions
|
3
|
+
module SchemaDumper
|
4
|
+
|
5
|
+
def self.included( base )
|
6
|
+
base.class_eval do
|
7
|
+
private
|
8
|
+
alias_method_chain :table, :lfe_usesguid_migrations
|
9
|
+
alias_method_chain :indexes, :lfe_usesguid_migrations
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def table_with_lfe_usesguid_migrations( table, stream )
|
16
|
+
#table_without_lfe_usesguid_migrations( table, stream )
|
17
|
+
columns = @connection.columns( table )
|
18
|
+
begin
|
19
|
+
tbl = StringIO.new
|
20
|
+
|
21
|
+
guid_pk = @connection.primary_key_name( table )
|
22
|
+
guid_fks = @connection.foreign_keys( table )
|
23
|
+
|
24
|
+
if @connection.respond_to?( :pk_and_sequence_for )
|
25
|
+
pk, pk_seq = @connection.pk_and_sequence_for( table )
|
26
|
+
end
|
27
|
+
pk ||= 'id'
|
28
|
+
|
29
|
+
tbl.print " create_table #{table.inspect}"
|
30
|
+
if col = columns.detect { |c| c.name == pk }
|
31
|
+
tbl.print %Q(, :primary_key => "#{pk}") if pk != 'id'
|
32
|
+
if col.type == :string
|
33
|
+
tbl.print ", :id => false"
|
34
|
+
elsif col.type == :integer
|
35
|
+
tbl.print ", :guid => false"
|
36
|
+
end
|
37
|
+
else
|
38
|
+
tbl.print ", :id => false"
|
39
|
+
end
|
40
|
+
tbl.print ", :force => true"
|
41
|
+
tbl.puts " do |t|"
|
42
|
+
|
43
|
+
column_specs = columns.map do |column|
|
44
|
+
raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" if @types[column.type].nil?
|
45
|
+
next if column.name == pk
|
46
|
+
spec = {}
|
47
|
+
spec[:name] = column.name.inspect
|
48
|
+
spec[:type] = column.type.to_s
|
49
|
+
spec[:limit] = column.limit.inspect if column.limit != @types[column.type][:limit] && column.type != :decimal
|
50
|
+
spec[:precision] = column.precision.inspect if !column.precision.nil?
|
51
|
+
spec[:scale] = column.scale.inspect if !column.scale.nil?
|
52
|
+
spec[:null] = 'false' if !column.null
|
53
|
+
spec[:default] = default_string(column.default) if column.has_default?
|
54
|
+
(spec.keys - [:name, :type]).each{ |k| spec[k].insert(0, "#{k.inspect} => ") }
|
55
|
+
spec
|
56
|
+
end.compact
|
57
|
+
|
58
|
+
unless guid_pk.nil? || guid_pk.empty?
|
59
|
+
column_specs.insert( 0, { :name => "\"#{guid_pk}\"", :type => 'binary', :limit => ':limit => 22', :null => ':null => false' } )
|
60
|
+
end
|
61
|
+
|
62
|
+
names = column_specs.map { |h| h[:name] }
|
63
|
+
|
64
|
+
unless guid_fks.nil?
|
65
|
+
guid_fks.each do |fk|
|
66
|
+
pos = names.index( "\"#{fk}\"" )
|
67
|
+
if pos
|
68
|
+
spec = column_specs[pos]
|
69
|
+
spec[:type] = "binary"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# find all migration keys used in this table
|
75
|
+
keys = [:name, :limit, :precision, :scale, :default, :null] & column_specs.map(&:keys).flatten
|
76
|
+
|
77
|
+
# figure out the lengths for each column based on above keys
|
78
|
+
lengths = keys.map{ |key| column_specs.map{ |spec| spec[key] ? spec[key].length + 2 : 0 }.max }
|
79
|
+
|
80
|
+
# the string we're going to sprintf our values against, with standardized column widths
|
81
|
+
format_string = lengths.map{ |len| "%-#{len}s" }
|
82
|
+
|
83
|
+
# find the max length for the 'type' column, which is special
|
84
|
+
type_length = column_specs.map{ |column| column[:type].length }.max
|
85
|
+
|
86
|
+
# add column type definition to our format string
|
87
|
+
format_string.unshift " t.%-#{type_length}s "
|
88
|
+
|
89
|
+
format_string *= ''
|
90
|
+
|
91
|
+
column_specs.each do |colspec|
|
92
|
+
values = keys.zip(lengths).map{ |key, len| colspec.key?(key) ? colspec[key] + ", " : " " * len }
|
93
|
+
values.unshift colspec[:type]
|
94
|
+
tbl.print((format_string % values).gsub(/,\s*$/, ''))
|
95
|
+
tbl.puts
|
96
|
+
end
|
97
|
+
|
98
|
+
tbl.puts " end"
|
99
|
+
tbl.puts
|
100
|
+
|
101
|
+
indexes(table, tbl)
|
102
|
+
|
103
|
+
tbl.rewind
|
104
|
+
stream.print tbl.read
|
105
|
+
rescue => e
|
106
|
+
stream.puts "# Could not dump table #{table.inspect} because of following #{e.class}"
|
107
|
+
stream.puts "# #{e.message}"
|
108
|
+
stream.puts
|
109
|
+
end
|
110
|
+
|
111
|
+
stream
|
112
|
+
end
|
113
|
+
|
114
|
+
def indexes_with_lfe_usesguid_migrations( table, stream )
|
115
|
+
pk = @connection.primary_key_name( table )
|
116
|
+
null_foreign_keys, not_null_foreign_keys = @connection.foreign_keys( table )
|
117
|
+
|
118
|
+
unless pk.nil? || pk.empty?
|
119
|
+
stream.puts " execute \"ALTER TABLE `#{table}` MODIFY COLUMN `#{pk}` VARCHAR(22) BINARY CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;\""
|
120
|
+
stream.puts " execute \"ALTER TABLE `#{table}` ADD PRIMARY KEY (#{pk})\""
|
121
|
+
end
|
122
|
+
stream.puts if (null_foreign_keys.nil? || null_foreign_keys.empty?) && (not_null_foreign_keys.nil? || not_null_foreign_keys.empty?)
|
123
|
+
|
124
|
+
null_foreign_keys.each do |key|
|
125
|
+
stream.puts " execute \"ALTER TABLE `#{table}` MODIFY COLUMN `#{key}` VARCHAR(22) BINARY CHARACTER SET latin1 COLLATE latin1_bin NULL;\""
|
126
|
+
end
|
127
|
+
|
128
|
+
not_null_foreign_keys.each do |key|
|
129
|
+
stream.puts " execute \"ALTER TABLE `#{table}` MODIFY COLUMN `#{key}` VARCHAR(22) BINARY CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;\""
|
130
|
+
end
|
131
|
+
|
132
|
+
stream.puts unless (null_foreign_keys.nil? || null_foreign_keys.empty?) && (not_null_foreign_keys.nil? || not_null_foreign_keys.empty?)
|
133
|
+
|
134
|
+
indexes_without_lfe_usesguid_migrations( table, stream )
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'usesguid_migrations/active_record_extensions/base'
|
5
|
+
require 'usesguid_migrations/active_record_extensions/schema'
|
6
|
+
require 'usesguid_migrations/active_record_extensions/schema_dumper'
|
7
|
+
require 'usesguid_migrations/active_record_extensions/connection_adapters/mysql_adapter'
|
8
|
+
require 'usesguid_migrations/active_record_extensions/connection_adapters/schema_statements'
|
9
|
+
require 'usesguid_migrations/active_record_extensions/connection_adapters/table_definition'
|
10
|
+
|
11
|
+
module UsesguidMigrations
|
12
|
+
VERSION = '1.0.0'
|
13
|
+
end
|
14
|
+
|
15
|
+
ActiveRecord::Base.send( :include, UsesguidMigrations::ActiveRecordExtensions::Base ) if defined?( ActiveRecord::Base )
|
16
|
+
ActiveRecord::Schema.send( :include, UsesguidMigrations::ActiveRecordExtensions::Schema ) if defined?( ActiveRecord::Schema )
|
17
|
+
ActiveRecord::SchemaDumper.send( :include, UsesguidMigrations::ActiveRecordExtensions::SchemaDumper ) if defined?( ActiveRecord::SchemaDumper )
|
18
|
+
if defined?( ActiveRecord::ConnectionAdapters::SchemaStatements )
|
19
|
+
ActiveRecord::ConnectionAdapters::SchemaStatements.send( :include, UsesguidMigrations::ActiveRecordExtensions::ConnectionAdapters::SchemaStatements )
|
20
|
+
end
|
21
|
+
if defined?( ActiveRecord::ConnectionAdapters::TableDefinition )
|
22
|
+
ActiveRecord::ConnectionAdapters::TableDefinition.send( :include, UsesguidMigrations::ActiveRecordExtensions::ConnectionAdapters::TableDefinition )
|
23
|
+
end
|
24
|
+
if defined?( ActiveRecord::ConnectionAdapters::MysqlAdapter )
|
25
|
+
ActiveRecord::ConnectionAdapters::MysqlAdapter.send( :include, UsesguidMigrations::ActiveRecordExtensions::ConnectionAdapters::MysqlAdapter )
|
26
|
+
end
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/usesguid_migrations.rb'}"
|
9
|
+
puts "Loading usesguid_migrations gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/testdb.rake.txt
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Rake
|
2
|
+
module TaskManager
|
3
|
+
def redefine_task(task_class, *args, &block)
|
4
|
+
task_name, deps = resolve_args(args)
|
5
|
+
task_name = task_class.scope_name(@scope, task_name)
|
6
|
+
deps = [deps] unless deps.respond_to?(:to_ary)
|
7
|
+
deps = deps.collect {|d| d.to_s }
|
8
|
+
task = @tasks[task_name.to_s] = task_class.new(task_name, self)
|
9
|
+
task.application = self
|
10
|
+
#task.add_comment(@last_comment)
|
11
|
+
@last_comment = nil
|
12
|
+
task.enhance(deps, &block)
|
13
|
+
task
|
14
|
+
end
|
15
|
+
end
|
16
|
+
class Task
|
17
|
+
class << self
|
18
|
+
def redefine_task(args, &block)
|
19
|
+
Rake.application.redefine_task(self, args, &block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def redefine_task(args, &block)
|
26
|
+
Rake::Task.redefine_task(args, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
namespace :db do
|
30
|
+
namespace :test do
|
31
|
+
|
32
|
+
desc 'Prepare the test database and migrate schema'
|
33
|
+
redefine_task :prepare => :environment do
|
34
|
+
Rake::Task['db:test:migrate_schema'].invoke
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'Use the migrations to create the test database'
|
38
|
+
task :migrate_schema => 'db:test:purge' do
|
39
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
|
40
|
+
ActiveRecord::Migrator.migrate("db/migrate/")
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{usesguid_migrations}
|
8
|
+
s.version = "1.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jason Harrelson"]
|
12
|
+
s.date = %q{2009-11-13}
|
13
|
+
s.description = %q{Makes your migrations work with usesguid plugin without explicitly defining the primary key id or foreign keys in migrations.}
|
14
|
+
s.email = %q{jason@lookforwardenterprises.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".gitignore",
|
21
|
+
"History.txt",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"lib/usesguid_migrations.rb",
|
27
|
+
"lib/usesguid_migrations/active_record_extensions/base.rb",
|
28
|
+
"lib/usesguid_migrations/active_record_extensions/connection_adapters/mysql_adapter.rb",
|
29
|
+
"lib/usesguid_migrations/active_record_extensions/connection_adapters/schema_statements.rb",
|
30
|
+
"lib/usesguid_migrations/active_record_extensions/connection_adapters/table_definition.rb",
|
31
|
+
"lib/usesguid_migrations/active_record_extensions/schema.rb",
|
32
|
+
"lib/usesguid_migrations/active_record_extensions/schema_dumper.rb",
|
33
|
+
"script/console",
|
34
|
+
"testdb.rake.txt",
|
35
|
+
"usesguid_migrations.gemspec"
|
36
|
+
]
|
37
|
+
s.homepage = %q{http://github.com/midas/usesguid_migrations}
|
38
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
39
|
+
s.require_paths = ["lib"]
|
40
|
+
s.rubygems_version = %q{1.3.5}
|
41
|
+
s.summary = %q{Makes your migrations work with usesguid plugin without explicitly defining the keys migrations.}
|
42
|
+
|
43
|
+
if s.respond_to? :specification_version then
|
44
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
|
+
s.specification_version = 3
|
46
|
+
|
47
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
48
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
49
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 2.3"])
|
50
|
+
s.add_runtime_dependency(%q<usesguid>, [">= 0"])
|
51
|
+
else
|
52
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
53
|
+
s.add_dependency(%q<activerecord>, [">= 2.3"])
|
54
|
+
s.add_dependency(%q<usesguid>, [">= 0"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
58
|
+
s.add_dependency(%q<activerecord>, [">= 2.3"])
|
59
|
+
s.add_dependency(%q<usesguid>, [">= 0"])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: usesguid_migrations
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jason Harrelson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-13 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activerecord
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "2.3"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: usesguid
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
description: Makes your migrations work with usesguid plugin without explicitly defining the primary key id or foreign keys in migrations.
|
46
|
+
email: jason@lookforwardenterprises.com
|
47
|
+
executables: []
|
48
|
+
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
extra_rdoc_files:
|
52
|
+
- LICENSE
|
53
|
+
- README.rdoc
|
54
|
+
files:
|
55
|
+
- .gitignore
|
56
|
+
- History.txt
|
57
|
+
- LICENSE
|
58
|
+
- README.rdoc
|
59
|
+
- Rakefile
|
60
|
+
- VERSION
|
61
|
+
- lib/usesguid_migrations.rb
|
62
|
+
- lib/usesguid_migrations/active_record_extensions/base.rb
|
63
|
+
- lib/usesguid_migrations/active_record_extensions/connection_adapters/mysql_adapter.rb
|
64
|
+
- lib/usesguid_migrations/active_record_extensions/connection_adapters/schema_statements.rb
|
65
|
+
- lib/usesguid_migrations/active_record_extensions/connection_adapters/table_definition.rb
|
66
|
+
- lib/usesguid_migrations/active_record_extensions/schema.rb
|
67
|
+
- lib/usesguid_migrations/active_record_extensions/schema_dumper.rb
|
68
|
+
- script/console
|
69
|
+
- testdb.rake.txt
|
70
|
+
- usesguid_migrations.gemspec
|
71
|
+
has_rdoc: true
|
72
|
+
homepage: http://github.com/midas/usesguid_migrations
|
73
|
+
licenses: []
|
74
|
+
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options:
|
77
|
+
- --charset=UTF-8
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: "0"
|
85
|
+
version:
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
version:
|
92
|
+
requirements: []
|
93
|
+
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.3.5
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Makes your migrations work with usesguid plugin without explicitly defining the keys migrations.
|
99
|
+
test_files: []
|
100
|
+
|