mysql2psql 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ class MysqlReaderTest < Test::Unit::TestCase
4
+
5
+ class << self
6
+ def startup
7
+ seed_test_database
8
+ @@options = get_test_config_by_label(:localmysql_to_file_convert_nothing)
9
+ @@reader=get_test_reader(@@options)
10
+ end
11
+ def shutdown
12
+ delete_files_for_test_config(@@options)
13
+ end
14
+ end
15
+ def setup
16
+ end
17
+ def teardown
18
+ end
19
+ def reader
20
+ @@reader
21
+ end
22
+
23
+ def test_db_connection
24
+ assert_nothing_raised do
25
+ reader.mysql.ping
26
+ end
27
+ end
28
+ def test_tables_collection
29
+ values = reader.tables.select{|t| t.name == 'numeric_types_basics'}
30
+ assert_true values.length==1
31
+ assert_equal 'numeric_types_basics', values[0].name
32
+ end
33
+ def test_paginated_read
34
+ expected_rows=3
35
+ page_size=2
36
+ expected_pages=(1.0 * expected_rows / page_size).ceil
37
+
38
+ row_count=my_row_count=0
39
+ table = reader.tables.select{|t| t.name == 'numeric_types_basics'}[0]
40
+ reader.paginated_read(table, page_size) do |row,counter|
41
+ row_count=counter
42
+ my_row_count+=1
43
+ end
44
+ assert_equal expected_rows, row_count
45
+ assert_equal expected_rows, my_row_count
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ require 'mysql2psql/postgres_db_writer'
4
+
5
+ class PostgresDbWriterBaseTest < Test::Unit::TestCase
6
+
7
+ class << self
8
+ def startup
9
+ seed_test_database
10
+ @@options=get_test_config_by_label(:localmysql_to_db_convert_nothing)
11
+ end
12
+ def shutdown
13
+ delete_files_for_test_config(@@options)
14
+ end
15
+ end
16
+ def setup
17
+ end
18
+ def teardown
19
+ end
20
+ def options
21
+ @@options
22
+ end
23
+
24
+ def test_pg_connection
25
+ assert_nothing_raised do
26
+ reader = Mysql2psql::PostgresDbWriter.new(options)
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,30 @@
1
+ module Test::Unit
2
+
3
+ class TestCase
4
+
5
+ def self.must(name, &block)
6
+ test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
7
+ defined = instance_method(test_name) rescue false
8
+ raise "#{test_name} is already defined in #{self}" if defined
9
+ if block_given?
10
+ define_method(test_name, &block)
11
+ else
12
+ define_method(test_name) do
13
+ flunk "No implementation provided for #{name}"
14
+ end
15
+ end
16
+ end
17
+
18
+ end
19
+ end
20
+
21
+
22
+ module Test::Unit::Assertions
23
+ def assert_false(object, message="")
24
+ assert_equal(false, object, message)
25
+ end
26
+ def assert_true(object, message="")
27
+ assert_equal(true, object, message)
28
+ end
29
+ end
30
+
@@ -0,0 +1,88 @@
1
+ require 'rubygems'
2
+ begin
3
+ gem 'test-unit'
4
+ require "test/unit"
5
+ rescue LoadError
6
+ # assume using stdlib Test:Unit
7
+ require 'test/unit'
8
+ end
9
+
10
+ require 'ext_test_unit'
11
+
12
+ def seed_test_database
13
+ options=get_test_config_by_label(:localmysql_to_file_convert_nothing)
14
+ seedfilepath = "#{File.dirname(__FILE__)}/../fixtures/seed_integration_tests.sql"
15
+ rc=system("mysql -u#{options.mysqlusername} #{options.mysqldatabase} < #{seedfilepath}")
16
+ raise StandardError unless rc
17
+ return true
18
+ rescue
19
+ raise StandardError.new("Failed to seed integration test db. See README for setup requirements.")
20
+ ensure
21
+ delete_files_for_test_config(options)
22
+ end
23
+
24
+ def get_test_reader(options)
25
+ require 'mysql2psql/mysql_reader'
26
+ Mysql2psql::MysqlReader.new(options)
27
+ rescue
28
+ raise StandardError.new("Failed to initialize integration test db. See README for setup requirements.")
29
+ end
30
+
31
+ def get_test_file_writer(options)
32
+ require 'mysql2psql/postgres_file_writer'
33
+ Mysql2psql::PostgresFileWriter.new(options.destfile)
34
+ rescue => e
35
+ puts e.inspect
36
+ raise StandardError.new("Failed to initialize file writer from #{options.inspect}. See README for setup requirements.")
37
+ end
38
+
39
+ def get_test_converter(options)
40
+ require 'mysql2psql/converter'
41
+ reader=get_test_reader(options)
42
+ writer=get_test_file_writer(options)
43
+ Mysql2psql::Converter.new(reader,writer,options)
44
+ rescue
45
+ raise StandardError.new("Failed to initialize converter from #{options.inspect}. See README for setup requirements.")
46
+ end
47
+
48
+ def get_temp_file(basename)
49
+ require 'tempfile'
50
+ f = Tempfile.new(basename)
51
+ path = f.path
52
+ f.close!()
53
+ path
54
+ end
55
+
56
+
57
+ def get_new_test_config(to_file = true, include_tables = [], exclude_tables = [], supress_data = false, supress_ddl = false, force_truncate = false)
58
+ require 'mysql2psql/config'
59
+ require 'mysql2psql/config_base'
60
+ to_filename = to_file ? get_temp_file('mysql2psql_tmp_output') : nil
61
+ configtext = Mysql2psql::Config.template(to_filename, include_tables, exclude_tables, supress_data, supress_ddl, force_truncate)
62
+ configfile=get_temp_file('mysql2psql_tmp_config')
63
+ File.open(configfile, 'w') {|f| f.write(configtext) }
64
+ Mysql2psql::ConfigBase.new( configfile )
65
+ rescue
66
+ raise StandardError.new("Failed to initialize options from #{configfile}. See README for setup requirements.")
67
+ end
68
+
69
+ def get_test_config_by_label(name)
70
+ case name
71
+ when :localmysql_to_file_convert_nothing
72
+ get_new_test_config(true, ['unobtainium'], ['kryptonite'], true, true, false)
73
+ when :localmysql_to_file_convert_all
74
+ get_new_test_config(true, [], [], false, false, false)
75
+ when :localmysql_to_db_convert_all
76
+ get_new_test_config(false, [], [], false, false, false)
77
+ when :localmysql_to_db_convert_nothing
78
+ get_new_test_config(false, ['unobtainium'], ['kryptonite'], true, true, false)
79
+ else
80
+ raise StandardError.new("Invalid label: #{name}")
81
+ end
82
+ end
83
+
84
+ def delete_files_for_test_config(config)
85
+ File.delete(config.destfile) if File.exists?(config.destfile)
86
+ File.delete(config.filepath) if File.exists?(config.filepath)
87
+ rescue
88
+ end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+ require 'mysql2psql/config_base'
3
+
4
+ #
5
+ #
6
+ class ConfigBaseTest < Test::Unit::TestCase
7
+ attr_reader :config, :configfilepath
8
+ def setup
9
+ @configfilepath="#{File.dirname(__FILE__)}/../fixtures/config_all_options.yml"
10
+ @config = Mysql2psql::ConfigBase.new( configfilepath )
11
+ end
12
+
13
+ def teardown
14
+ @config = nil
15
+ end
16
+
17
+ def test_config_loaded
18
+ assert_not_nil config.config
19
+ assert_equal configfilepath,config.filepath
20
+ end
21
+
22
+ def test_uninitialized_error_when_not_found_and_no_default
23
+ assert_raises(Mysql2psql::UninitializedValueError) do
24
+ value = @config.not_found(:none)
25
+ end
26
+ end
27
+
28
+ def test_default_when_not_found
29
+ expected = 'defaultvalue'
30
+ value = @config.not_found(expected)
31
+ assert_equal expected,value
32
+ end
33
+
34
+ def test_mysql_hostname
35
+ value = @config.mysqlhostname
36
+ assert_equal 'localhost',value
37
+ end
38
+
39
+ def test_mysql_hostname_array_access
40
+ value = @config[:mysqlhostname]
41
+ assert_equal 'localhost',value
42
+ end
43
+
44
+ def test_dest_file
45
+ value = @config.destfile
46
+ assert_equal 'somefile',value
47
+ end
48
+
49
+ end
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+
3
+ require 'mysql2psql/config'
4
+
5
+ class ConfigTest < Test::Unit::TestCase
6
+ attr_reader :configfile_new, :configfile_all_opts, :configfile_not_found
7
+ def setup
8
+ @configfile_all_opts = "#{File.dirname(__FILE__)}/../fixtures/config_all_options.yml"
9
+ @configfile_not_found = "#{File.dirname(__FILE__)}/../fixtures/config_not_found.yml.do_not_create_this_file"
10
+ @configfile_new = get_temp_file('mysql2psql_test_config')
11
+ end
12
+ def teardown
13
+ File.delete(configfile_new) if File.exists?(configfile_new)
14
+ end
15
+
16
+ def test_config_loaded
17
+ value = Mysql2psql::Config.new(configfile_all_opts, false)
18
+ assert_not_nil value
19
+ end
20
+
21
+ def test_config_file_not_found
22
+ assert_raise(Mysql2psql::ConfigurationFileNotFound) do
23
+ value = Mysql2psql::Config.new(configfile_not_found, false)
24
+ end
25
+ end
26
+ def test_initialize_new_config_file
27
+ assert_raise(Mysql2psql::ConfigurationFileInitialized) do
28
+ value = Mysql2psql::Config.new(configfile_new, true)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ require 'mysql2psql'
4
+
5
+ class PostgresFileWriterTest < Test::Unit::TestCase
6
+ attr_accessor :destfile
7
+ def setup
8
+ begin
9
+ f = Tempfile.new('mysql2psql_test_destfile')
10
+ @destfile = f.path
11
+ f.close!()
12
+ rescue => e
13
+ raise StandardError.new("Failed to initialize integration test db. See README for setup requirements.")
14
+ end
15
+ end
16
+ def teardown
17
+ File.delete(destfile) if File.exists?(destfile)
18
+ end
19
+
20
+ def test_basic_write
21
+ writer = Mysql2psql::PostgresFileWriter.new(destfile)
22
+ writer.close
23
+ content = IO.read(destfile)
24
+ assert_not_nil content.match("SET client_encoding = 'UTF8'")
25
+ assert_nil content.match("unobtanium")
26
+ end
27
+
28
+
29
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mysql2psql
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Max Lapshin <max@maxidoors.ru>
14
+ - Anton Ageev <anton@ageev.name>
15
+ - Samuel Tribehou <cracoucax@gmail.com>
16
+ - Marco Nenciarini <marco.nenciarini@devise.it>
17
+ - James Nobis <jnobis@jnobis.controldocs.com>
18
+ - quel <github@quelrod.net>
19
+ - Holger Amann <keeney@fehu.org>
20
+ - Maxim Dobriakov <closer.main@gmail.com>
21
+ - Michael Kimsal <mgkimsal@gmail.com>
22
+ - Jacob Coby <jcoby@portallabs.com>
23
+ - Neszt Tibor <neszt@tvnetwork.hu>
24
+ - Miroslav Kratochvil <exa.exa@gmail.com>
25
+ - Paul Gallagher <gallagher.paul@gmail.com>
26
+ autorequire:
27
+ bindir: bin
28
+ cert_chain: []
29
+
30
+ date: 2010-09-19 00:00:00 +04:00
31
+ default_executable: mysql2psql
32
+ dependencies:
33
+ - !ruby/object:Gem::Dependency
34
+ name: mysql
35
+ prerelease: false
36
+ requirement: &id001 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - "="
40
+ - !ruby/object:Gem::Version
41
+ hash: 45
42
+ segments:
43
+ - 2
44
+ - 8
45
+ - 1
46
+ version: 2.8.1
47
+ type: :runtime
48
+ version_requirements: *id001
49
+ - !ruby/object:Gem::Dependency
50
+ name: pg
51
+ prerelease: false
52
+ requirement: &id002 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - "="
56
+ - !ruby/object:Gem::Version
57
+ hash: 59
58
+ segments:
59
+ - 0
60
+ - 9
61
+ - 0
62
+ version: 0.9.0
63
+ type: :runtime
64
+ version_requirements: *id002
65
+ - !ruby/object:Gem::Dependency
66
+ name: test-unit
67
+ prerelease: false
68
+ requirement: &id003 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 9
74
+ segments:
75
+ - 2
76
+ - 1
77
+ - 1
78
+ version: 2.1.1
79
+ type: :development
80
+ version_requirements: *id003
81
+ description: |-
82
+ It can create postgresql dump from mysql database or directly load data from mysql to
83
+ postgresql (at about 100 000 records per minute). Translates most data types and indexes.
84
+ email: gallagher.paul@gmail.com
85
+ executables:
86
+ - mysql2psql
87
+ extensions: []
88
+
89
+ extra_rdoc_files:
90
+ - README.rdoc
91
+ files:
92
+ - .gitignore
93
+ - MIT-LICENSE
94
+ - README.rdoc
95
+ - Rakefile
96
+ - bin/mysql2psql
97
+ - lib/mysql2psql.rb
98
+ - lib/mysql2psql/config.rb
99
+ - lib/mysql2psql/config_base.rb
100
+ - lib/mysql2psql/converter.rb
101
+ - lib/mysql2psql/errors.rb
102
+ - lib/mysql2psql/mysql_reader.rb
103
+ - lib/mysql2psql/postgres_db_writer.rb
104
+ - lib/mysql2psql/postgres_file_writer.rb
105
+ - lib/mysql2psql/postgres_writer.rb
106
+ - lib/mysql2psql/version.rb
107
+ - lib/mysql2psql/writer.rb
108
+ - mysql2psql.gemspec
109
+ - test/fixtures/config_all_options.yml
110
+ - test/fixtures/seed_integration_tests.sql
111
+ - test/integration/convert_to_db_test.rb
112
+ - test/integration/convert_to_file_test.rb
113
+ - test/integration/converter_test.rb
114
+ - test/integration/mysql_reader_base_test.rb
115
+ - test/integration/mysql_reader_test.rb
116
+ - test/integration/postgres_db_writer_base_test.rb
117
+ - test/lib/ext_test_unit.rb
118
+ - test/lib/test_helper.rb
119
+ - test/units/config_base_test.rb
120
+ - test/units/config_test.rb
121
+ - test/units/postgres_file_writer_test.rb
122
+ has_rdoc: true
123
+ homepage: http://github.com/tardate/mysql2postgresql
124
+ licenses: []
125
+
126
+ post_install_message:
127
+ rdoc_options:
128
+ - --charset=UTF-8
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ hash: 3
137
+ segments:
138
+ - 0
139
+ version: "0"
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ hash: 3
146
+ segments:
147
+ - 0
148
+ version: "0"
149
+ requirements: []
150
+
151
+ rubyforge_project:
152
+ rubygems_version: 1.3.7
153
+ signing_key:
154
+ specification_version: 3
155
+ summary: Tool for converting mysql database to postgresql
156
+ test_files:
157
+ - test/integration/convert_to_db_test.rb
158
+ - test/integration/convert_to_file_test.rb
159
+ - test/integration/converter_test.rb
160
+ - test/integration/mysql_reader_base_test.rb
161
+ - test/integration/mysql_reader_test.rb
162
+ - test/integration/postgres_db_writer_base_test.rb
163
+ - test/lib/ext_test_unit.rb
164
+ - test/lib/test_helper.rb
165
+ - test/units/config_base_test.rb
166
+ - test/units/config_test.rb
167
+ - test/units/postgres_file_writer_test.rb