skiima 0.1.000

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +20 -0
  2. data/.travis.yml +8 -0
  3. data/CHANGELOG +8 -0
  4. data/Gemfile +30 -0
  5. data/Guardfile +14 -0
  6. data/README.md +87 -0
  7. data/Rakefile +56 -0
  8. data/lib/skiima/db_adapters/base_mysql_adapter.rb +308 -0
  9. data/lib/skiima/db_adapters/mysql2_adapter.rb +114 -0
  10. data/lib/skiima/db_adapters/mysql_adapter.rb +287 -0
  11. data/lib/skiima/db_adapters/postgresql_adapter.rb +509 -0
  12. data/lib/skiima/db_adapters.rb +187 -0
  13. data/lib/skiima/dependency.rb +84 -0
  14. data/lib/skiima/locales/en.yml +20 -0
  15. data/lib/skiima/locales/fr.yml +2 -0
  16. data/lib/skiima/version.rb +4 -0
  17. data/lib/skiima.rb +270 -0
  18. data/lib/skiima_helpers.rb +49 -0
  19. data/skiima.gemspec +53 -0
  20. data/spec/config/database.yml +56 -0
  21. data/spec/db/skiima/depends.yml +61 -0
  22. data/spec/db/skiima/empty_depends.yml +0 -0
  23. data/spec/db/skiima/init_test_db/database.skiima_test.mysql.current.sql +2 -0
  24. data/spec/db/skiima/init_test_db/database.skiima_test.postgresql.current.sql +2 -0
  25. data/spec/db/skiima/test_column_names/table.test_column_names.mysql.current.sql +8 -0
  26. data/spec/db/skiima/test_column_names/table.test_column_names.postgresql.current.sql +18 -0
  27. data/spec/db/skiima/test_index/index.test_index.mysql.current.sql +2 -0
  28. data/spec/db/skiima/test_index/index.test_index.postgresql.current.sql +2 -0
  29. data/spec/db/skiima/test_proc/proc.test_proc.mysql.current.sql +8 -0
  30. data/spec/db/skiima/test_proc/proc.test_proc_drop.mysql.current.drop.sql +1 -0
  31. data/spec/db/skiima/test_proc/proc.test_proc_drop.mysql.current.sql +8 -0
  32. data/spec/db/skiima/test_rule/rule.test_rule.postgresql.current.sql +6 -0
  33. data/spec/db/skiima/test_schema/schema.test_schema.postgresql.current.sql +2 -0
  34. data/spec/db/skiima/test_table/table.test_table.mysql.current.sql +7 -0
  35. data/spec/db/skiima/test_table/table.test_table.postgresql.current.sql +4 -0
  36. data/spec/db/skiima/test_view/view.test_view.mysql.current.sql +5 -0
  37. data/spec/db/skiima/test_view/view.test_view.postgresql.current.sql +6 -0
  38. data/spec/helpers/mysql_spec_helper.rb +0 -0
  39. data/spec/helpers/postgresql_spec_helper.rb +11 -0
  40. data/spec/mysql2_spec.rb +57 -0
  41. data/spec/mysql_spec.rb +100 -0
  42. data/spec/postgresql_spec.rb +138 -0
  43. data/spec/skiima/db_adapters/mysql_adapter_spec.rb +38 -0
  44. data/spec/skiima/db_adapters/postgresql_adapter_spec.rb +20 -0
  45. data/spec/skiima/db_adapters_spec.rb +31 -0
  46. data/spec/skiima/dependency_spec.rb +94 -0
  47. data/spec/skiima_spec.rb +97 -0
  48. data/spec/spec_helper.rb +35 -0
  49. metadata +195 -0
@@ -0,0 +1,84 @@
1
+ module Skiima
2
+ module Dependency
3
+ class Script
4
+ attr_accessor :group, :adapter, :version
5
+ attr_accessor :type, :name, :attr
6
+ attr_accessor :filename, :content, :sql
7
+
8
+ def initialize(group, adapter, version, scriptname)
9
+ @group, @adapter, @version = group.to_s, adapter.to_s, version.to_s
10
+ set_attr(scriptname)
11
+ end
12
+
13
+ def filename
14
+ @filename = [@type,@name,@adapter.to_s,@version,'sql'].join('.')
15
+ end
16
+
17
+ def read_content(direction, root)
18
+ @content = case
19
+ when (direction == :up) then File.open(File.join(root, group, filename)).read
20
+ when (direction == :down && down_script?) then File.open(File.join(root, group, down_filename)).read
21
+ end
22
+ end
23
+
24
+ def interpolate_sql(char, vars = {})
25
+ @sql = Skiima.interpolate_sql(char, @content, vars)
26
+ end
27
+
28
+ private
29
+
30
+ def set_attr(scr_name)
31
+ scr_name = scr_name.split('.')
32
+ @type, @name = scr_name.shift, scr_name.shift
33
+ @attr = scr_name
34
+ end
35
+
36
+ def down_filename
37
+ filename.sub('.sql', '.drop.sql')
38
+ end
39
+
40
+ def down_script?
41
+ File.exist?(down_filename)
42
+ end
43
+ end
44
+
45
+ class Reader
46
+ attr_accessor :scripts
47
+ attr_accessor :depends, :adapter, :version
48
+
49
+ def initialize(depends, adapter, opts = {})
50
+ @depends, @adapter = depends, adapter.to_sym
51
+ @version = opts[:version] || :current
52
+ end
53
+
54
+ def adapter
55
+ case @adapter.to_s
56
+ when 'mysql', 'mysql2' then :mysql
57
+ else @adapter
58
+ end
59
+ end
60
+
61
+ def get_group(g)
62
+ raise Skiima::SqlGroupNotFound unless depends.has_key?(g)
63
+ depends[g]
64
+ end
65
+
66
+ def get_adapter(grp)
67
+ grp.has_key?(adapter) ? (grp[adapter] || {}) : {}
68
+ end
69
+
70
+ def get_scripts(group, version_grp)
71
+ scr = (version_grp.has_key?(version) ? (version_grp[version] || {}) : {})
72
+ sc = scr.map {|s| Skiima::Dependency::Script.new(group, adapter, version, s)}
73
+ end
74
+
75
+ def get_load_order(*groups)
76
+ @scripts = groups.inject([]) do |memo, g|
77
+ grp = Skiima.symbolize_keys(get_group(g))
78
+ grp = Skiima.symbolize_keys(get_adapter(grp))
79
+ memo = memo + get_scripts(g, grp)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,20 @@
1
+ ---
2
+ en:
3
+ simple: easy
4
+ date:
5
+ relative: "%{relative_time} ago"
6
+
7
+ messages:
8
+ errors:
9
+ open_db_yaml: Could not open Skiima Database Config!
10
+ open_depends_yaml: Could not open Skiima Depends Config!
11
+ create:
12
+ start: Creating objects for @class
13
+ error: Encountered errors creating @class objects -
14
+ no_error: All @class objects created successfully!
15
+ delimiter: =================================
16
+ drop:
17
+ start: Dropping objects for @class
18
+ error: Encountered errors dropping @class objects -
19
+ no_error: All @class objects dropped successfully!
20
+ delimiter: =================================
@@ -0,0 +1,2 @@
1
+ fr:
2
+ translate: S'il vous plait, est-ce que vous ce traduire pour moi?
@@ -0,0 +1,4 @@
1
+ # encoding: utf-8
2
+ module Skiima
3
+ VERSION = "0.1.000"
4
+ end
data/lib/skiima.rb ADDED
@@ -0,0 +1,270 @@
1
+ # encoding: utf-8
2
+ require 'skiima/version'
3
+
4
+ require 'yaml'
5
+ require 'logger'
6
+ require 'fast_gettext'
7
+ require 'erubis'
8
+
9
+ require 'skiima_helpers'
10
+
11
+ # include FastGettext unless it already is
12
+ include FastGettext unless ::Object.included_modules.include?(FastGettext)
13
+
14
+ module Skiima
15
+ include FastGettext::Translation
16
+ extend SkiimaHelpers
17
+ extend ModuleHelpers
18
+
19
+ # require 'skiima/base'
20
+ autoload :Dependency, 'skiima/dependency'
21
+ autoload :DbAdapters, 'skiima/db_adapters'
22
+
23
+ set_defaults(:config, {
24
+ :root_path => 'specify/in/config/block',
25
+ :config_path => 'config',
26
+ :database_yaml => 'database.yml',
27
+ :scripts_path => 'db/skiima',
28
+ :depends_yaml => 'depends.yml',
29
+ :interpolator => '&',
30
+ :locale => 'en',
31
+ :logging_out => 'STDOUT',
32
+ :logging_level => '3' })
33
+ #should time zone be added to configs?
34
+
35
+ class << self
36
+ def setup
37
+ yield self
38
+ set_translation_repository
39
+ end
40
+
41
+ def new(env, opts = {})
42
+ Skiima::Loader.new(env, opts)
43
+ end
44
+
45
+ def up(*args)
46
+ opts = args.last.is_a?(Hash) ? args.pop : {}
47
+ ski = Skiima.new(env, opts).up(*args)
48
+ ensure
49
+ ski.connection.close
50
+ end
51
+
52
+ def down(*args)
53
+ opts = args.last.is_a?(Hash) ? args.pop : {}
54
+ Skiima.new(env, opts).down(*args)
55
+ ensure
56
+ ski.connection.close
57
+ end
58
+
59
+ def msg(*args)
60
+ locale = args.last.is_a?(Symbol) ? args.pop : default_locale
61
+ lookup = args.join('.')
62
+ Skiima._(lookup)
63
+ end
64
+
65
+ def log_message(logger, msg)
66
+ logger.debug msg
67
+ end
68
+
69
+ def default_locale
70
+ ::Skiima.locale
71
+ end
72
+
73
+ def set_translation_repository
74
+ FastGettext.add_text_domain('skiima', :path => File.join(File.dirname(__FILE__), 'skiima', 'locales'), :type => :yaml)
75
+ Skiima.text_domain = 'skiima'
76
+ Skiima.locale = locale.to_s
77
+ end
78
+
79
+ def self.exe_with_connection(db, &block)
80
+ resolver = Skiima::DbAdapters::Resolver.new db
81
+ connection = nil
82
+
83
+ begin
84
+ connection = self.send(resolver.adapter_method, db)
85
+ yield connection
86
+ rescue => ex
87
+ puts "Oh Noes!!"
88
+ ensure
89
+ connection.close
90
+ end
91
+ end
92
+
93
+ def interpolate_sql(char, sql, vars = {})
94
+ vars.inject(sql) do |memo, (k,v)|
95
+ memo = memo.gsub("#{char}#{k.to_s}", v)
96
+ end
97
+ end
98
+
99
+ def full_scripts_path(root = self.root_path, config = self.scripts_path)
100
+ File.join(root, config)
101
+ end
102
+
103
+ def full_database_path(root = self.root_path, config = self.config_path, db = self.database_yaml)
104
+ File.join(root, config, db)
105
+ end
106
+
107
+ def full_depends_path(root = self.root_path, config = self.scripts_path, depends = self.depends_yaml)
108
+ File.join(root, config, depends)
109
+ end
110
+
111
+ def read_db_yaml(file)
112
+ Skiima.symbolize_keys(self.read_yaml_or_throw(file, MissingFileException, "#{Skiima.msg('errors.open_db_yaml')} #{file}"))
113
+ end
114
+
115
+ def read_depends_yaml(file)
116
+ Skiima.symbolize_keys(self.read_yaml_or_throw(file, MissingFileException, "#{Skiima.msg('errors.open_depends_yaml')} #{file}"))
117
+ end
118
+
119
+ def read_sql_file(folder, file)
120
+ File.open(File.join(Skiima.full_scripts_path, folder, file)).read
121
+ end
122
+
123
+ def read_yaml_or_throw(file, errclass, errmsg)
124
+ yaml = begin
125
+ input = File.read(file)
126
+ eruby = Erubis::Eruby.new(input)
127
+ YAML::load(eruby.result(binding())) || {}
128
+ rescue => ex
129
+ raise errclass, errmsg
130
+ end
131
+
132
+ Skiima.symbolize_keys(yaml)
133
+ end
134
+
135
+ def method_missing(method, *args, &block)
136
+ setter = method.to_s.gsub(/=$/, '').to_sym if method.to_s =~ /=$/
137
+
138
+ val = case
139
+ when (@@config.keys.include?(method)) then @@config[method]
140
+ when (setter and @@config.keys.include?(setter)) then @@config[setter] = args.first
141
+ end
142
+
143
+ val || super
144
+ end
145
+ end
146
+
147
+ #BaseExceptions
148
+ class BaseException < ::StandardError; end
149
+ class MissingFileException < BaseException; end
150
+ class SqlGroupNotFound < BaseException; end
151
+ class SqlScriptNotFound < BaseException; end
152
+
153
+ #DbAdapterExceptions
154
+ class AdapterNotSpecified < BaseException; end
155
+ class LoadError < BaseException; end
156
+ class StatementInvalid < BaseException; end
157
+
158
+ class Loader
159
+ attr_accessor :config, :logger
160
+ attr_accessor :db, :connection
161
+ attr_accessor :scripts
162
+
163
+ def initialize(env, opts = {})
164
+ db_config = Skiima.symbolize_keys(opts[:db] || {})
165
+
166
+ self.config = Skiima.config.merge(opts)
167
+ create_logger
168
+ @db = Skiima.symbolize_keys(Skiima.read_db_yaml(full_database_path)[env].merge(db_config))
169
+ make_connection
170
+ @depends = Skiima.read_depends_yaml(full_depends_path)
171
+ end
172
+
173
+ def up(*args)
174
+ opts = args.last.is_a?(Hash) ? args.pop : {}
175
+ reader = Skiima::Dependency::Reader.new(@depends, @db[:adapter], opts)
176
+ scripts = reader.get_load_order(*args)
177
+ scripts.each do |s|
178
+ s.read_content(:up, full_scripts_path)
179
+ s.interpolate_sql(interpolator, interpolation_vars)
180
+ end
181
+ scripts.each {|s| connection.execute(s.sql)}
182
+ end
183
+
184
+ def down(*args)
185
+ opts = args.last.is_a?(Hash) ? args.pop : {}
186
+ reader = Skiima::Dependency::Reader.new(@depends, @db[:adapter], opts)
187
+ scripts = reader.get_load_order(*args).reverse
188
+ scripts.each do |s|
189
+ s.read_content(:down, full_scripts_path)
190
+ s.content ||= connection.drop(s.type, s.name, {:attr => s.attr}.merge(opts))
191
+ s.interpolate_sql(interpolator, interpolation_vars)
192
+ end
193
+ scripts.each {|s| connection.execute(s.sql)}
194
+ end
195
+
196
+ def make_connection
197
+ resolver = Skiima::DbAdapters::Resolver.new(@db)
198
+ @connection = Skiima.send(resolver.adapter_method, logger, @db)
199
+ end
200
+
201
+ def log_action(msg, &block)
202
+ begin
203
+ logger.debug "[#{Time.now}] Started: #{msg}"
204
+ results = yield
205
+ logger.debug "[#{Time.now}] Finished: #{msg}"
206
+ results
207
+ rescue
208
+ logger.error "[#{Time.now}] Error: #{msg}"
209
+ raise
210
+ end
211
+ end
212
+
213
+ def log_message(msg)
214
+ Skiima.log_message(logger, msg)
215
+ end
216
+
217
+ def interpolation_vars(vars = {})
218
+ { :database => db[:database] }.merge(vars)
219
+ end
220
+
221
+ def method_missing(method, *args, &block)
222
+ setter = method.to_s.gsub(/=$/, '').to_sym if method.to_s =~ /=$/
223
+
224
+ val = case
225
+ when (@config.keys.include?(method)) then @config[method]
226
+ when (setter and @config.keys.include?(setter)) then @config[setter] = args
227
+ end
228
+
229
+ val || super
230
+ end
231
+
232
+ private
233
+
234
+ def full_database_path
235
+ Skiima.full_database_path(self.root_path, self.config_path, self.database_yaml)
236
+ end
237
+
238
+ def full_depends_path
239
+ Skiima.full_depends_path(self.root_path, self.scripts_path, self.depends_yaml)
240
+ end
241
+
242
+ def full_scripts_path
243
+ Skiima.full_scripts_path(self.root_path, self.scripts_path)
244
+ end
245
+
246
+ def get_logger_out(str)
247
+ case str
248
+ when /STDOUT/i then ::STDOUT
249
+ when /STDERR/i then ::STDERR
250
+ else File.join(root_path, str)
251
+ end
252
+ end
253
+
254
+ def get_logger_level(str)
255
+ case str
256
+ when '4', /fatal/i then ::Logger::FATAL
257
+ when '3', /error/i then ::Logger::ERROR
258
+ when '2', /warn/i then ::Logger::WARN
259
+ when '1', /info/i then ::Logger::INFO
260
+ when '0', /debug/i then ::Logger::DEBUG
261
+ else ::Logger::ERROR
262
+ end
263
+ end
264
+
265
+ def create_logger
266
+ self.logger = ::Logger.new(get_logger_out(@config[:logging_out]))
267
+ self.logger.level = get_logger_level(@config[:logging_level])
268
+ end
269
+ end
270
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+ module SkiimaHelpers
3
+ def symbolize_keys(hash)
4
+ hash.inject({}) do |options, (key, value)|
5
+ options[(key.to_sym rescue key) || key] = value
6
+ options
7
+ end
8
+ end
9
+ end
10
+
11
+ module ModuleHelpers
12
+ def set_defaults(sym, val)
13
+ add_module_attr_reader(sym)
14
+ add_module_attr_writer(sym)
15
+ class_variable_set("@@#{sym.to_s}", val)
16
+ end
17
+
18
+ alias_method :set_default, :set_defaults
19
+
20
+ def add_module_attr_writer(sym)
21
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
22
+ def self.#{sym}=(obj)
23
+ @@#{sym} = obj
24
+ end
25
+ EOS
26
+
27
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
28
+ def #{sym}=(obj)
29
+ @@#{sym} = obj
30
+ end
31
+ EOS
32
+ end
33
+
34
+ def add_module_attr_reader(sym)
35
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
36
+ @@#{sym} = nil unless defined? @@#{sym}
37
+
38
+ def self.#{sym}
39
+ @@#{sym}
40
+ end
41
+ EOS
42
+
43
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
44
+ def #{sym}
45
+ @@#{sym}
46
+ end
47
+ EOS
48
+ end
49
+ end
data/skiima.gemspec ADDED
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "skiima/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "skiima"
7
+ s.version = Skiima::VERSION
8
+ s.authors = ["David Conner"]
9
+ s.email = ["dconner.pro@gmail.com"]
10
+ s.homepage = "http://github.com/dcunited001/skiima"
11
+ s.summary = %q{A SQL object manager for Rails projects}
12
+ s.description = %q{Skiima helps to manage SQL objects like views and functions}
13
+
14
+ s.rubyforge_project = "skiima"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency "fast_gettext", '~> 0.6.0'
23
+ s.add_dependency "erubis", '~> 2.7.0'
24
+
25
+ s.add_development_dependency "bundler", '>= 1.0.21'
26
+ s.add_development_dependency "minitest", '~> 2.9.1'
27
+ s.add_development_dependency "minitest-matchers", '~> 1.1.3'
28
+ s.add_development_dependency "mocha", '~> 0.10.0'
29
+
30
+ end
31
+
32
+ # Logging
33
+ # TODO: add logging messages
34
+ # TODO: convert to i18n messages
35
+
36
+ # SQL Objects
37
+ # add functions
38
+ # add procs
39
+ # add triggers
40
+
41
+ # Adapters
42
+ # SQL Server Adapter
43
+
44
+ # Skiima Options
45
+ # add a way to just return a list of scripts to be executed
46
+
47
+ # Refactor:
48
+ # reorganize modules
49
+
50
+ # Thor tasks ??
51
+ # TODO: thor task to load all sets
52
+ # TODO: thor task to load specific sets
53
+ # TODO: delegate rake tasks to thor (how?)
@@ -0,0 +1,56 @@
1
+ ---
2
+ production:
3
+ adapter: postgresql
4
+ encoding: utf8
5
+ database: skiima_production
6
+ username: skiima
7
+ password: test
8
+
9
+ development:
10
+ adapter: postgresql
11
+ encoding: utf8
12
+ database: skiima_development
13
+ username: skiima
14
+ password: test
15
+
16
+ test:
17
+ adapter: postgresql
18
+ encoding: utf8
19
+ database: skiima_test
20
+ username: skiima
21
+ password: test
22
+
23
+ postgresql_test:
24
+ adapter: postgresql
25
+ encoding: utf8
26
+ database: postgresql_test
27
+ username: skiima
28
+ password: test
29
+
30
+ mysql_test:
31
+ adapter: mysql
32
+ encoding: utf8
33
+ reconnect: false
34
+ database: mysql_test
35
+ pool: 5
36
+ username: skiima
37
+ password: test
38
+ socket: /tmp/mysql.sock
39
+
40
+ mysql2_test:
41
+ adapter: mysql2
42
+ encoding: utf8
43
+ reconnect: false
44
+ database: mysql_test
45
+ pool: 5
46
+ username: skiima
47
+ password: test
48
+ socket: /tmp/mysql.sock
49
+
50
+ sqlserver_test:
51
+ adapter: sqlserver
52
+ encoding: utf8
53
+ database: skiima_test
54
+ username: skiima
55
+ password: test
56
+
@@ -0,0 +1,61 @@
1
+ ---
2
+ init_test_db:
3
+ mysql:
4
+ current:
5
+ - database.skiima_test
6
+ postgresql:
7
+ current:
8
+ - database.skiima_test
9
+ test_table:
10
+ mysql:
11
+ current:
12
+ - table.test_table
13
+ postgresql:
14
+ current:
15
+ - table.test_table
16
+ test_column_names:
17
+ mysql:
18
+ current:
19
+ - table.test_column_names
20
+ postgresql:
21
+ current:
22
+ - table.test_column_names
23
+ test_index:
24
+ mysql:
25
+ current:
26
+ - index.test_index.test_table
27
+ postgresql:
28
+ current:
29
+ - index.test_index.test_table
30
+ test_schema:
31
+ mysql:
32
+ current:
33
+ - schema.test_schema
34
+ postgresql:
35
+ current:
36
+ - schema.test_schema
37
+ test_view:
38
+ mysql:
39
+ current:
40
+ - view.test_view
41
+ postgresql:
42
+ current:
43
+ - view.test_view
44
+ test_rule:
45
+ postgresql:
46
+ current:
47
+ - rule.test_rule.test_view
48
+ test_proc:
49
+ mysql:
50
+ current:
51
+ - proc.test_proc.test_proc
52
+ - proc.test_proc.test_proc_drop
53
+ blank_group:
54
+ mysql:
55
+ postgresql:
56
+ only_pg:
57
+ mysql:
58
+ postgresql:
59
+ current:
60
+ - table.only_pg
61
+ - view.pg_only
File without changes
@@ -0,0 +1,2 @@
1
+ DROP DATABASE IF EXISTS &database;
2
+ CREATE DATABASE &database;
@@ -0,0 +1,2 @@
1
+ DROP DATABASE IF EXISTS &database;
2
+ CREATE DATABASE &database;
@@ -0,0 +1,8 @@
1
+ DROP TABLE IF EXISTS test_column_names;
2
+ --==================
3
+ CREATE TABLE `test_column_names` (
4
+ `id` int(11) NOT NULL AUTO_INCREMENT,
5
+ `first_name` varchar(40) NOT NULL,
6
+ `last_name` varchar(40) NOT NULL,
7
+ PRIMARY KEY (`id`)
8
+ ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
@@ -0,0 +1,18 @@
1
+ DROP TABLE IF EXISTS test_column_names;
2
+ CREATE TABLE test_column_names (
3
+ id integer PRIMARY KEY,
4
+ email character varying(255),
5
+ encrypted_password character varying(128),
6
+ reset_password_token character varying(255),
7
+ reset_password_sent_at timestamp without time zone,
8
+ remember_created_at timestamp without time zone,
9
+ sign_in_count integer default 0,
10
+ current_sign_in_at timestamp without time zone,
11
+ last_sign_in_at timestamp without time zone,
12
+ current_sign_in_ip character varying(255),
13
+ last_sign_in_ip character varying(255),
14
+ created_at timestamp without time zone not null,
15
+ updated_at timestamp without time zone not null,
16
+ alias character varying(255),
17
+ first_name character varying(255),
18
+ last_name character varying(255));
@@ -0,0 +1,2 @@
1
+ # Drop index if exists is not available with Mysql
2
+ CREATE INDEX test_index ON test_table (id) USING BTREE;
@@ -0,0 +1,2 @@
1
+ DROP INDEX IF EXISTS test_index;
2
+ CREATE UNIQUE INDEX test_index ON test_table (id);
@@ -0,0 +1,8 @@
1
+ DROP PROCEDURE IF EXISTS `test_proc`;
2
+ --============
3
+ CREATE PROCEDURE `test_proc`(test INT)
4
+ BEGIN
5
+
6
+ SELECT test;
7
+
8
+ END;
@@ -0,0 +1 @@
1
+ DROP PROCEDURE IF EXISTS `test_proc_drop`;
@@ -0,0 +1,8 @@
1
+ DROP PROCEDURE IF EXISTS `test_proc_drop`;
2
+ --============
3
+ CREATE PROCEDURE `test_proc_drop`(test INT)
4
+ BEGIN
5
+
6
+ SELECT test;
7
+
8
+ END;
@@ -0,0 +1,6 @@
1
+ DROP RULE IF EXISTS test_rule on test_view;
2
+ CREATE RULE test_rule AS
3
+ ON DELETE TO test_view DO INSTEAD
4
+
5
+ DELETE FROM test_table tt
6
+ WHERE tt.id = OLD.test_id
@@ -0,0 +1,2 @@
1
+ DROP SCHEMA IF EXISTS test_schema;
2
+ CREATE SCHEMA test_schema;
@@ -0,0 +1,7 @@
1
+ DROP TABLE IF EXISTS test_table;
2
+ --==================
3
+ CREATE TABLE `test_table` (
4
+ `id` int(11) NOT NULL AUTO_INCREMENT,
5
+ `name` varchar(40) NOT NULL,
6
+ PRIMARY KEY (`id`)
7
+ ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;