flydata 0.6.3 → 0.6.4
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.
- checksums.yaml +4 -4
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/bin/fdredshift +78 -0
- data/circle.yml +1 -1
- data/ext/flydata/{parser/mysql → source_mysql/parser}/.gitignore +0 -0
- data/ext/flydata/{parser/mysql → source_mysql/parser}/dump_parser_ext.cpp +3 -3
- data/ext/flydata/source_mysql/parser/extconf.rb +3 -0
- data/ext/flydata/{parser/mysql → source_mysql/parser}/parser.txt +0 -0
- data/ext/flydata/{parser/mysql → source_mysql/parser}/sql_parser.cpp +0 -0
- data/ext/flydata/{parser/mysql → source_mysql/parser}/sql_parser.h +0 -0
- data/flydata-core/lib/flydata-core/mysql/binlog_pos.rb +34 -32
- data/flydata-core/lib/flydata-core/mysql/compatibility_checker.rb +20 -0
- data/flydata-core/lib/flydata-core/table_def/mysql_table_def.rb +12 -4
- data/flydata-core/lib/flydata-core/table_def/redshift_table_def.rb +60 -6
- data/flydata-core/spec/mysql/binlog_pos_spec.rb +474 -0
- data/flydata-core/spec/table_def/mysql_table_def_spec.rb +57 -0
- data/flydata-core/spec/table_def/mysql_to_redshift_table_def_spec.rb +174 -20
- data/flydata-core/spec/table_def/mysqldump_test_col_comment_with_AUTO_INCREMENT_keyword.dump +43 -0
- data/flydata-core/spec/table_def/mysqldump_test_col_comment_with_not_null_keyword.dump +43 -0
- data/flydata-core/spec/table_def/mysqldump_test_col_comment_with_unique_keyword.dump +43 -0
- data/flydata-core/spec/table_def/mysqldump_test_col_comment_with_unsigned_keyword.dump +43 -0
- data/flydata-core/spec/table_def/redshift_table_def_spec.rb +41 -8
- data/flydata.gemspec +0 -0
- data/lib/flydata/cli.rb +11 -5
- data/lib/flydata/command/base.rb +14 -1
- data/lib/flydata/command/exclusive_runnable.rb +42 -12
- data/lib/flydata/command/helper.rb +6 -6
- data/lib/flydata/command/sender.rb +4 -3
- data/lib/flydata/command/setup.rb +30 -381
- data/lib/flydata/command/stop.rb +1 -0
- data/lib/flydata/command/sync.rb +273 -301
- data/lib/flydata/compatibility_check.rb +24 -117
- data/lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb +3 -3
- data/lib/flydata/fluent-plugins/mysql/alter_table_query_handler.rb +2 -2
- data/lib/flydata/fluent-plugins/mysql/binlog_record_handler.rb +6 -6
- data/lib/flydata/fluent-plugins/mysql/truncate_table_query_handler.rb +0 -1
- data/lib/flydata/parser.rb +14 -0
- data/lib/flydata/{parser_provider.rb → parser/parser_provider.rb} +6 -4
- data/lib/flydata/parser/source_table.rb +33 -0
- data/lib/flydata/source.rb +105 -0
- data/lib/flydata/source/component.rb +21 -0
- data/lib/flydata/source/errors.rb +7 -0
- data/lib/flydata/source/generate_source_dump.rb +72 -0
- data/lib/flydata/source/parse_dump_and_send.rb +52 -0
- data/lib/flydata/source/setup.rb +31 -0
- data/lib/flydata/source/source_pos.rb +45 -0
- data/lib/flydata/source/sync.rb +56 -0
- data/lib/flydata/source/sync_generate_table_ddl.rb +43 -0
- data/lib/flydata/source_file/setup.rb +17 -0
- data/lib/flydata/source_file/sync.rb +14 -0
- data/lib/flydata/{command → source_mysql/command}/mysql.rb +2 -1
- data/lib/flydata/{command → source_mysql/command}/mysql_command_base.rb +2 -4
- data/lib/flydata/{command → source_mysql/command}/mysqlbinlog.rb +2 -1
- data/lib/flydata/{command → source_mysql/command}/mysqldump.rb +2 -1
- data/lib/flydata/source_mysql/generate_source_dump.rb +53 -0
- data/lib/flydata/source_mysql/mysql_compatibility_check.rb +114 -0
- data/lib/flydata/source_mysql/parse_dump_and_send.rb +28 -0
- data/lib/flydata/{parser/mysql → source_mysql/parser}/.gitignore +0 -0
- data/lib/flydata/{parser/mysql → source_mysql/parser}/dump_parser.rb +32 -67
- data/lib/flydata/{parser/mysql → source_mysql/parser}/mysql_alter_table.treetop +0 -0
- data/lib/flydata/source_mysql/setup.rb +24 -0
- data/lib/flydata/source_mysql/source_pos.rb +21 -0
- data/lib/flydata/source_mysql/sync.rb +45 -0
- data/lib/flydata/source_mysql/sync_generate_table_ddl.rb +40 -0
- data/lib/flydata/{mysql → source_mysql}/table_ddl.rb +6 -17
- data/lib/flydata/source_zendesk/sync_generate_table_ddl.rb +30 -0
- data/lib/flydata/source_zendesk/zendesk_flydata_tabledefs.rb +133 -0
- data/lib/flydata/sync_file_manager.rb +132 -73
- data/lib/flydata/table_ddl.rb +18 -0
- data/spec/flydata/cli_spec.rb +1 -0
- data/spec/flydata/command/exclusive_runnable_spec.rb +19 -8
- data/spec/flydata/command/sender_spec.rb +1 -1
- data/spec/flydata/command/setup_spec.rb +4 -4
- data/spec/flydata/command/sync_spec.rb +97 -134
- data/spec/flydata/compatibility_check_spec.rb +16 -289
- data/spec/flydata/fluent-plugins/mysql/alter_table_query_handler_spec.rb +3 -3
- data/spec/flydata/fluent-plugins/mysql/dml_record_handler_spec.rb +1 -1
- data/spec/flydata/fluent-plugins/mysql/shared_query_handler_context.rb +4 -2
- data/spec/flydata/fluent-plugins/mysql/truncate_query_handler_spec.rb +1 -1
- data/spec/flydata/source_mysql/generate_source_dump_spec.rb +69 -0
- data/spec/flydata/source_mysql/mysql_compatibility_check_spec.rb +280 -0
- data/spec/flydata/{parser/mysql → source_mysql/parser}/alter_table_parser_spec.rb +2 -2
- data/spec/flydata/{parser/mysql → source_mysql/parser}/dump_parser_spec.rb +75 -70
- data/spec/flydata/source_mysql/sync_generate_table_ddl_spec.rb +137 -0
- data/spec/flydata/{mysql → source_mysql}/table_ddl_spec.rb +2 -2
- data/spec/flydata/source_spec.rb +140 -0
- data/spec/flydata/source_zendesk/sync_generate_table_ddl_spec.rb +33 -0
- data/spec/flydata/sync_file_manager_spec.rb +157 -77
- data/tmpl/redshift_mysql_data_entry.conf.tmpl +1 -1
- metadata +56 -23
- data/ext/flydata/parser/mysql/extconf.rb +0 -3
- data/lib/flydata/mysql/binlog_position.rb +0 -22
- data/spec/flydata/mysql/binlog_position_spec.rb +0 -35
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.5.37, for debian-linux-gnu (x86_64)
|
|
2
|
+
--
|
|
3
|
+
-- Host: localhost Database: flydata_sync
|
|
4
|
+
-- ------------------------------------------------------
|
|
5
|
+
-- Server version 5.5.37-0ubuntu0.12.04.1-log
|
|
6
|
+
|
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
17
|
+
|
|
18
|
+
--
|
|
19
|
+
-- Table structure for table `sample1`
|
|
20
|
+
--
|
|
21
|
+
|
|
22
|
+
DROP TABLE IF EXISTS `sample1`;
|
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
|
25
|
+
CREATE TABLE `sample1` (
|
|
26
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
27
|
+
`title` varchar(256) DEFAULT NULL COMMENT 'This column is not AUTO_INCREMENT column.',
|
|
28
|
+
`name` text,
|
|
29
|
+
`num` int(11) DEFAULT NULL,
|
|
30
|
+
PRIMARY KEY (`id`)
|
|
31
|
+
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
32
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
33
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
|
34
|
+
|
|
35
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
|
36
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
|
37
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
|
38
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
39
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
40
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
41
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
|
42
|
+
|
|
43
|
+
-- Dump completed on 2014-07-15 10:07:45
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.5.37, for debian-linux-gnu (x86_64)
|
|
2
|
+
--
|
|
3
|
+
-- Host: localhost Database: flydata_sync
|
|
4
|
+
-- ------------------------------------------------------
|
|
5
|
+
-- Server version 5.5.37-0ubuntu0.12.04.1-log
|
|
6
|
+
|
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
17
|
+
|
|
18
|
+
--
|
|
19
|
+
-- Table structure for table `sample1`
|
|
20
|
+
--
|
|
21
|
+
|
|
22
|
+
DROP TABLE IF EXISTS `sample1`;
|
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
|
25
|
+
CREATE TABLE `sample1` (
|
|
26
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
27
|
+
`title` varchar(256) DEFAULT NULL COMMENT 'This column is not null column.',
|
|
28
|
+
`name` text,
|
|
29
|
+
`num` int(11) DEFAULT NULL,
|
|
30
|
+
PRIMARY KEY (`id`)
|
|
31
|
+
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
32
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
33
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
|
34
|
+
|
|
35
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
|
36
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
|
37
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
|
38
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
39
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
40
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
41
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
|
42
|
+
|
|
43
|
+
-- Dump completed on 2014-07-15 10:07:45
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.5.37, for debian-linux-gnu (x86_64)
|
|
2
|
+
--
|
|
3
|
+
-- Host: localhost Database: flydata_sync
|
|
4
|
+
-- ------------------------------------------------------
|
|
5
|
+
-- Server version 5.5.37-0ubuntu0.12.04.1-log
|
|
6
|
+
|
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
17
|
+
|
|
18
|
+
--
|
|
19
|
+
-- Table structure for table `sample1`
|
|
20
|
+
--
|
|
21
|
+
|
|
22
|
+
DROP TABLE IF EXISTS `sample1`;
|
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
|
25
|
+
CREATE TABLE `sample1` (
|
|
26
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
27
|
+
`title` varchar(256) DEFAULT NULL COMMENT 'This column is not unique column.',
|
|
28
|
+
`name` text,
|
|
29
|
+
`num` int(11) DEFAULT NULL,
|
|
30
|
+
PRIMARY KEY (`id`)
|
|
31
|
+
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
32
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
33
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
|
34
|
+
|
|
35
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
|
36
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
|
37
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
|
38
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
39
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
40
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
41
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
|
42
|
+
|
|
43
|
+
-- Dump completed on 2014-07-15 10:07:45
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.5.37, for debian-linux-gnu (x86_64)
|
|
2
|
+
--
|
|
3
|
+
-- Host: localhost Database: flydata_sync
|
|
4
|
+
-- ------------------------------------------------------
|
|
5
|
+
-- Server version 5.5.37-0ubuntu0.12.04.1-log
|
|
6
|
+
|
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
17
|
+
|
|
18
|
+
--
|
|
19
|
+
-- Table structure for table `sample1`
|
|
20
|
+
--
|
|
21
|
+
|
|
22
|
+
DROP TABLE IF EXISTS `sample1`;
|
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
|
25
|
+
CREATE TABLE `sample1` (
|
|
26
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
27
|
+
`title` varchar(256) DEFAULT NULL COMMENT 'This column is not unsigned column.',
|
|
28
|
+
`name` text,
|
|
29
|
+
`num` int(11) DEFAULT NULL,
|
|
30
|
+
PRIMARY KEY (`id`)
|
|
31
|
+
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
|
32
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
33
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
|
34
|
+
|
|
35
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
|
36
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
|
37
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
|
38
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
39
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
40
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
41
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
|
42
|
+
|
|
43
|
+
-- Dump completed on 2014-07-15 10:07:45
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
require 'flydata-core/table_def'
|
|
3
|
+
require 'timecop'
|
|
3
4
|
|
|
4
5
|
module FlydataCore
|
|
5
6
|
module TableDef
|
|
@@ -28,9 +29,23 @@ describe RedshiftTableDef do
|
|
|
28
29
|
|
|
29
30
|
let(:schema_prefix) { "" }
|
|
30
31
|
|
|
32
|
+
let(:drop_table_subquery) { <<EOT }
|
|
33
|
+
DROP TABLE IF EXISTS #{schema_prefix}"test_table_flydata20160125232857";
|
|
34
|
+
CREATE TABLE IF NOT EXISTS #{schema_prefix}"test_table" (
|
|
35
|
+
"id" int4,
|
|
36
|
+
"age" int8,
|
|
37
|
+
"value" varchar(max),
|
|
38
|
+
PRIMARY KEY ("id")
|
|
39
|
+
) DISTKEY("id") SORTKEY("id");
|
|
40
|
+
ALTER TABLE #{schema_prefix}"test_table" RENAME TO "test_table_flydata20160125232857";
|
|
41
|
+
EOT
|
|
42
|
+
|
|
43
|
+
let(:drop_backup_table_subquery) { <<EOT.strip }
|
|
44
|
+
DROP TABLE IF EXISTS #{schema_prefix}"test_table_flydata20160125232857";
|
|
45
|
+
EOT
|
|
46
|
+
|
|
31
47
|
let(:create_table_queries) { <<EOT.strip }
|
|
32
|
-
|
|
33
|
-
CREATE TABLE #{schema_prefix}"test_table" (
|
|
48
|
+
#{drop_table_subquery}CREATE TABLE #{schema_prefix}"test_table" (
|
|
34
49
|
"id" int4,
|
|
35
50
|
"age" int8,
|
|
36
51
|
"value" varchar(max),
|
|
@@ -79,9 +94,13 @@ EOT
|
|
|
79
94
|
CREATE SCHEMA IF NOT EXISTS "test_schema";
|
|
80
95
|
EOT
|
|
81
96
|
|
|
97
|
+
before do
|
|
98
|
+
Timecop.freeze(Time.local(2016, 1, 25, 23, 28, 57))
|
|
99
|
+
end
|
|
100
|
+
|
|
82
101
|
context 'with simple flydatadef' do
|
|
83
102
|
it 'should return ddl' do
|
|
84
|
-
expect(subject).to eq "#{create_table_queries}\n#{flydata_ctl_update}"
|
|
103
|
+
expect(subject).to eq "BEGIN;\n#{create_table_queries}\n#{flydata_ctl_update}\nCOMMIT;\n#{drop_backup_table_subquery}\n"
|
|
85
104
|
end
|
|
86
105
|
end
|
|
87
106
|
|
|
@@ -89,7 +108,18 @@ EOT
|
|
|
89
108
|
let(:option) { { flydata_ctl_columns: true } }
|
|
90
109
|
|
|
91
110
|
it 'should return ddl including flydata_ctl_columns creation' do
|
|
92
|
-
expect(subject).to eq "#{flydata_ctl_create}\n#{create_table_queries}\n#{flydata_ctl_update}"
|
|
111
|
+
expect(subject).to eq "#{flydata_ctl_create}\nBEGIN;\n#{create_table_queries}\n#{flydata_ctl_update}\nCOMMIT;\n#{drop_backup_table_subquery}\n"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context 'when skip_drop_table option is true' do
|
|
116
|
+
before do
|
|
117
|
+
option.merge!(skip_drop_table: true)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
let(:drop_table_subquery) { ""}
|
|
121
|
+
it 'should return ddl' do
|
|
122
|
+
expect(subject).to eq "BEGIN;\n#{create_table_queries}\n#{flydata_ctl_update}\nCOMMIT;\n"
|
|
93
123
|
end
|
|
94
124
|
end
|
|
95
125
|
|
|
@@ -97,7 +127,7 @@ EOT
|
|
|
97
127
|
let(:value_column) { value_column_hash.merge(comment: "helloworld") }
|
|
98
128
|
|
|
99
129
|
it 'should add comment creation ddl' do
|
|
100
|
-
expect(subject).to eq "#{create_table_queries}\n#{comment_subquery}\n#{flydata_ctl_update}"
|
|
130
|
+
expect(subject).to eq "BEGIN;\n#{create_table_queries}\n#{comment_subquery}\n#{flydata_ctl_update}\nCOMMIT;\n#{drop_backup_table_subquery}\n"
|
|
101
131
|
end
|
|
102
132
|
end
|
|
103
133
|
|
|
@@ -107,12 +137,15 @@ EOT
|
|
|
107
137
|
let(:schema_prefix) { '"test_schema".' }
|
|
108
138
|
|
|
109
139
|
it 'should preappend schema name to table name' do
|
|
110
|
-
expect(subject).to eq <<EOT
|
|
140
|
+
expect(subject).to eq <<EOT
|
|
111
141
|
#{create_schema_query}
|
|
112
142
|
#{flydata_ctl_create}
|
|
143
|
+
BEGIN;
|
|
113
144
|
#{create_table_queries}
|
|
114
145
|
#{comment_subquery}
|
|
115
146
|
#{flydata_ctl_update}
|
|
147
|
+
COMMIT;
|
|
148
|
+
#{drop_backup_table_subquery}
|
|
116
149
|
EOT
|
|
117
150
|
end
|
|
118
151
|
end
|
|
@@ -121,7 +154,7 @@ EOT
|
|
|
121
154
|
let(:value_column) { value_column_hash.merge(charset: "ISO_8859_1") }
|
|
122
155
|
let(:value_type) { "#{value_type_body} cs:ISO_8859_1" }
|
|
123
156
|
it 'should return ddl' do
|
|
124
|
-
expect(subject).to eq "#{create_table_queries}\n#{flydata_ctl_update}"
|
|
157
|
+
expect(subject).to eq "BEGIN;\n#{create_table_queries}\n#{flydata_ctl_update}\nCOMMIT;\n#{drop_backup_table_subquery}\n"
|
|
125
158
|
end
|
|
126
159
|
end
|
|
127
160
|
end
|
|
@@ -540,7 +573,7 @@ EOT
|
|
|
540
573
|
default_charset: "UTF_8"} }
|
|
541
574
|
let(:schema_name) { nil }
|
|
542
575
|
|
|
543
|
-
let(:expected_sql) { <<EOS
|
|
576
|
+
let(:expected_sql) { <<EOS }
|
|
544
577
|
DELETE FROM "flydata_ctl_columns" WHERE table_name = '#{table_name}';
|
|
545
578
|
INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
|
|
546
579
|
('#{table_name}', '#{expected_column_name}', 'varchar(12)', 1);
|
data/flydata.gemspec
CHANGED
|
Binary file
|
data/lib/flydata/cli.rb
CHANGED
|
@@ -2,6 +2,7 @@ require 'slop'
|
|
|
2
2
|
require 'flydata/command_loggable'
|
|
3
3
|
require 'flydata/errors'
|
|
4
4
|
require 'flydata/helpers'
|
|
5
|
+
require 'flydata/source'
|
|
5
6
|
|
|
6
7
|
module Flydata
|
|
7
8
|
class Cli
|
|
@@ -70,11 +71,16 @@ module Flydata
|
|
|
70
71
|
end
|
|
71
72
|
COMMAND_DIR = 'flydata/command'
|
|
72
73
|
def require_command_source(cmd)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
command_dirs = [COMMAND_DIR] + Source.command_dir_paths
|
|
75
|
+
command_dirs.each do |command_dir|
|
|
76
|
+
source_path = File.join(command_dir, cmd)
|
|
77
|
+
result = begin
|
|
78
|
+
require source_path
|
|
79
|
+
:success
|
|
80
|
+
rescue LoadError
|
|
81
|
+
:fail
|
|
82
|
+
end
|
|
83
|
+
break if result == :success
|
|
78
84
|
end
|
|
79
85
|
end
|
|
80
86
|
end
|
data/lib/flydata/command/base.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'slop'
|
|
2
2
|
require 'flydata/api_client'
|
|
3
3
|
require 'flydata/command_loggable'
|
|
4
|
+
require 'flydata/source'
|
|
4
5
|
require 'flydata/command/exclusive_runnable'
|
|
5
6
|
require 'flydata/preference/data_entry_preference'
|
|
6
7
|
|
|
@@ -42,10 +43,14 @@ module Flydata
|
|
|
42
43
|
|
|
43
44
|
def data_entry
|
|
44
45
|
@de ||= retrieve_data_entries.first
|
|
45
|
-
raise "
|
|
46
|
+
raise "No data entry exists. Please set one up on the FlyData Console (#{dashboard_url})" unless @de
|
|
46
47
|
@de
|
|
47
48
|
end
|
|
48
49
|
|
|
50
|
+
def source
|
|
51
|
+
@source ||= Source.create(data_entry)
|
|
52
|
+
end
|
|
53
|
+
|
|
49
54
|
def register_crontab
|
|
50
55
|
data_entries = retrieve_data_entries
|
|
51
56
|
if data_entries.any?{|e| e['log_deletion']}
|
|
@@ -55,6 +60,14 @@ module Flydata
|
|
|
55
60
|
end
|
|
56
61
|
end
|
|
57
62
|
|
|
63
|
+
def dashboard_url
|
|
64
|
+
"#{flydata.flydata_api_host}/dashboard"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def redshift_console_url
|
|
68
|
+
"#{flydata.flydata_api_host}/redshift_clusters/query/new"
|
|
69
|
+
end
|
|
70
|
+
|
|
58
71
|
# print console
|
|
59
72
|
def newline; puts end
|
|
60
73
|
def separator(str="=")
|
|
@@ -11,6 +11,21 @@ module ExclusiveRunnable
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
module ClassMethods
|
|
14
|
+
# messages
|
|
15
|
+
COMMAND_IS_ALREADY_RUNNING = <<EOT
|
|
16
|
+
Command `%s` is already running or terminated abnormally. (pid:%s)
|
|
17
|
+
Wait until the command completes or stop the command.
|
|
18
|
+
EOT
|
|
19
|
+
DATA_INCONSISTENCY_MAY_OCCUR = <<EOT
|
|
20
|
+
|
|
21
|
+
!! Command `%s` is still running. (pid:%s)
|
|
22
|
+
We highly recommend to *stop the process* before run a new command.
|
|
23
|
+
If two commands run concurrently, DATA INCONSISTENCY MAY OCCUR.
|
|
24
|
+
|
|
25
|
+
EOT
|
|
26
|
+
CONCURRENT_RUN = <<EOT
|
|
27
|
+
Run command:"%s" while a process for the previous command:"%s" still exists (pid:%s)
|
|
28
|
+
EOT
|
|
14
29
|
def run_exclusive(method, options = {})
|
|
15
30
|
saved_method = :"__#{method}"
|
|
16
31
|
alias_method saved_method, method
|
|
@@ -19,18 +34,27 @@ module ExclusiveRunnable
|
|
|
19
34
|
result = nil
|
|
20
35
|
exclusive_run_info = nil
|
|
21
36
|
begin
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
new_command = self.class.command(method, options)
|
|
38
|
+
new_pid = Process.pid
|
|
39
|
+
old_exclusive_run_info = self.class.load_exclusive_run_info
|
|
40
|
+
if old_exclusive_run_info
|
|
41
|
+
old_command = old_exclusive_run_info['command']
|
|
42
|
+
old_pid = old_exclusive_run_info['pid']
|
|
43
|
+
|
|
44
|
+
raise COMMAND_IS_ALREADY_RUNNING % [ old_command, old_pid ] if !opts.force_run?
|
|
45
|
+
|
|
46
|
+
#`force-run` option is specified.
|
|
47
|
+
#Override old `exclusive_run.info` file and run a command.
|
|
48
|
+
if self.class.process_exist?(old_pid)
|
|
49
|
+
log_warn_stderr DATA_INCONSISTENCY_MAY_OCCUR % [ old_command, old_pid ]
|
|
50
|
+
exit unless ask_yes_no("Do you proceed?", false)
|
|
51
|
+
end
|
|
52
|
+
$log.info CONCURRENT_RUN % [ new_command, old_command, old_pid ]
|
|
53
|
+
self.class.delete_exclusive_run_info
|
|
32
54
|
end
|
|
33
|
-
|
|
55
|
+
|
|
56
|
+
#Run a command
|
|
57
|
+
exclusive_run_info = { command: new_command, pid: new_pid }
|
|
34
58
|
self.class.save_exclusive_run_info(exclusive_run_info)
|
|
35
59
|
result = send(saved_method, *args)
|
|
36
60
|
ensure
|
|
@@ -65,7 +89,13 @@ module ExclusiveRunnable
|
|
|
65
89
|
path = exclusive_run_info_path
|
|
66
90
|
File.delete(path) if File.exists?(path)
|
|
67
91
|
end
|
|
68
|
-
|
|
92
|
+
def process_exist?(pid)
|
|
93
|
+
# Returns true if the process is running.
|
|
94
|
+
Process.getpgid(pid.to_i)
|
|
95
|
+
true
|
|
96
|
+
rescue Errno::ESRCH
|
|
97
|
+
false
|
|
98
|
+
end
|
|
69
99
|
def command(subcommand, options = {})
|
|
70
100
|
return options[:command] if options[:command]
|
|
71
101
|
|
|
@@ -49,7 +49,7 @@ module Flydata
|
|
|
49
49
|
|
|
50
50
|
def stop(options = {})
|
|
51
51
|
if running?
|
|
52
|
-
run_command(stop_cmd)
|
|
52
|
+
run_command(stop_cmd, options)
|
|
53
53
|
else
|
|
54
54
|
log_info_stdout("Helper is not running.", {}, options)
|
|
55
55
|
end
|
|
@@ -66,7 +66,7 @@ module Flydata
|
|
|
66
66
|
def restart(options = {})
|
|
67
67
|
if running?
|
|
68
68
|
log_info_stdout("Restarting Helper.", {}, options)
|
|
69
|
-
run_command(stop_cmd)
|
|
69
|
+
run_command(stop_cmd, options)
|
|
70
70
|
end
|
|
71
71
|
raw_start
|
|
72
72
|
end
|
|
@@ -74,7 +74,7 @@ module Flydata
|
|
|
74
74
|
def reload(options = {})
|
|
75
75
|
if running?
|
|
76
76
|
log_info_stdout("Reloading Helper.", {}, options)
|
|
77
|
-
run_command(kill_hup_cmd)
|
|
77
|
+
run_command(kill_hup_cmd, options)
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
80
|
|
|
@@ -95,14 +95,14 @@ module Flydata
|
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
-
def run_command(cmd)
|
|
98
|
+
def run_command(cmd, options)
|
|
99
99
|
o, e, s = Util::Shell.run_cmd(cmd)
|
|
100
100
|
log_error_stderr(e) if not e.to_s.empty?
|
|
101
101
|
success = (s.to_i == 0)
|
|
102
102
|
if success
|
|
103
|
-
log_info_stdout("Done")
|
|
103
|
+
log_info_stdout("Done", {}, options)
|
|
104
104
|
else
|
|
105
|
-
log_error_stderr("Failed")
|
|
105
|
+
log_error_stderr("Failed", {}, options)
|
|
106
106
|
end
|
|
107
107
|
success
|
|
108
108
|
end
|