dbtools 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +333 -0
  3. data/Thorfile +1 -0
  4. data/bin/dbtools +5 -0
  5. data/config/client_secret_dbtools.json +1 -0
  6. data/config/config.yml +1 -0
  7. data/config/database_config.yml +12 -0
  8. data/config/databases.txt +5 -0
  9. data/config/schedule.rb +8 -0
  10. data/dbtools.gemspec +37 -0
  11. data/lib/dbtools.rb +47 -0
  12. data/lib/dbtools/constants.rb +847 -0
  13. data/lib/dbtools/converter/csv2rdf_converter.rb +68 -0
  14. data/lib/dbtools/converter/csv_importer.rb +107 -0
  15. data/lib/dbtools/converter/excel2csv_converter.rb +40 -0
  16. data/lib/dbtools/converter/google_drive2_rdf_converter.rb +97 -0
  17. data/lib/dbtools/database/database_data.rb +146 -0
  18. data/lib/dbtools/database/db_connection.rb +236 -0
  19. data/lib/dbtools/database/mysql_connection.rb +78 -0
  20. data/lib/dbtools/database/postgresql_connection.rb +132 -0
  21. data/lib/dbtools/database/violation.rb +45 -0
  22. data/lib/dbtools/google_drive/google_drive_api.rb +211 -0
  23. data/lib/dbtools/google_drive/google_drive_entity.rb +22 -0
  24. data/lib/dbtools/google_drive/google_drive_file.rb +10 -0
  25. data/lib/dbtools/google_drive/google_drive_folder.rb +9 -0
  26. data/lib/dbtools/plsql_functions/connect_server.sql +30 -0
  27. data/lib/dbtools/plsql_functions/link.sql +17 -0
  28. data/lib/dbtools/plsql_functions/unlink.sql +15 -0
  29. data/lib/dbtools/rdf/rdf_reader.rb +136 -0
  30. data/lib/dbtools/version.rb +3 -0
  31. data/lib/rdf/geophy.rb +27 -0
  32. data/lib/tasks/aws.rb +43 -0
  33. data/lib/tasks/backup.rb +107 -0
  34. data/lib/tasks/check.rb +220 -0
  35. data/lib/tasks/ckan.rb +151 -0
  36. data/lib/tasks/convert.rb +139 -0
  37. data/lib/tasks/dump.rb +110 -0
  38. data/lib/tasks/googledrivetool.rb +252 -0
  39. data/lib/tasks/import.rb +142 -0
  40. data/lib/tasks/postgres.rb +29 -0
  41. metadata +307 -0
@@ -0,0 +1,142 @@
1
+ require 'yaml'
2
+ require 'thor'
3
+ require 'find'
4
+ require 'dbtools/rdf/rdf_reader'
5
+ require 'dbtools/constants'
6
+ require 'dbtools/converter/csv_importer'
7
+ require 'dbtools/converter/excel2csv_converter'
8
+ require 'dbtools/database/mysql_connection'
9
+ require 'dbtools/database/postgresql_connection'
10
+ require 'dbtools/google_drive/google_drive_api'
11
+ require 'fileutils'
12
+
13
+ module Dbtools
14
+ class Import < Thor
15
+ package_name "dbtools"
16
+
17
+ def initialize(*args)
18
+ super
19
+ load_config
20
+ end
21
+
22
+ # Load a database dump into Postgres.
23
+ desc 'postgres_dump [database_name. dump_file]', 'Load a database dump into Postgres. Database will be created if it doesn\'t exist'
24
+ def postgres_dump(database_name, file)
25
+ system "createdb #{@postgres_connection_options} #{database_name}"
26
+ system "#{@postgres_connection_command} --dbname=#{database_name} --file=#{file}"
27
+ return "#{@postgres_connection_url}#{database_name}"
28
+ end
29
+
30
+ desc 'mysql_dump [database_name. dump_file]', 'Load a database dump into MySQL. Database will be created if it doesn\'t exist'
31
+ def mysql_dump(database_name, file)
32
+ system "#{@mysql_connection_command} -e 'CREATE DATABASE #{database_name}'"
33
+ system "#{@mysql_connection_command} < #{file}"
34
+ return "#{@mysql_connection_url}#{database_name}"
35
+ end
36
+
37
+ desc 'convert_to_utf8 [file]', 'Converts a file to UTF-8 encoding. Replaces the original file.'
38
+ def convert_to_utf8(filename)
39
+ puts "Converting #{filename} to utf8"
40
+
41
+ #filename_utf8_encoded = "#{filename}_utf8"
42
+ #system "iconv -f utf-8 -t utf-8 -c < #{filename} > #{filename_utf8_encoded}"
43
+
44
+ filename_tmp = filename + '.tmp'
45
+ filename_old = filename + '.old'
46
+
47
+ begin
48
+ File.open(filename_tmp, 'w') do |file_out|
49
+ File.foreach(filename) do |line_input|
50
+ file_out.puts(line_input.encode!('UTF-8', 'UTF-8', :invalid => :replace))
51
+ end
52
+ end
53
+ # Swap filenames
54
+ File.rename(filename, filename_old)
55
+ File.rename(filename_tmp, filename)
56
+ File.rename(filename_old, filename_tmp)
57
+ rescue Exception => e
58
+ raise "Failed to convert encoding of file #{filename} to UTF-8 because #{e.message}. "
59
+ ensure
60
+ File.delete(filename_tmp)
61
+ end
62
+ end
63
+
64
+ desc 'create_schema [csv_file, table_name]', 'Creates a schema based on the csv headers and values in the table'
65
+ def create_schema(csv_file, table_name)
66
+ csv = Dbtools::Converter::Csv_importer.new(csv_file, tablename: table_name)
67
+ puts csv.to_sql_schema_script
68
+ end
69
+
70
+ desc 'csv_in postgres [csv_file, database_name, table_name]', 'Imports a csv file into a postgres database. Automatically creates the database. '
71
+ def csv_in_postgres(csv_file, database_name, table_name)
72
+ # Converts file to utf8
73
+ convert_to_utf8(csv_file)
74
+ # Sanitize table name
75
+ table_name = table_name.downcase.gsub(/[^0-9a-zA-Z_]/,'_')
76
+
77
+ # Creates a table schema based on the csv.
78
+ csv = Dbtools::Converter::Csv_importer.new(csv_file, tablename: table_name)
79
+ csv_schema_command = csv.to_sql_schema_script
80
+ #copy_csv_command = "\\COPY \"#{table_name}\" FROM '#{csv_file}' DELIMITER '#{csv.delimiter}' CSV HEADER;"
81
+
82
+ #system "createdb #{@postgres_connection_options} #{database_name}"
83
+
84
+ puts "Importing #{csv_file} into #{database_name}.#{table_name}"
85
+ # Create the table and copy the csv contents into the table.
86
+ begin
87
+ psql = Dbtools::Database::PostgresqlConnection.new("#{@postgres_connection_url}")
88
+ psql.create_database(database_name)
89
+ psql.close
90
+ # Create the database
91
+
92
+ psql = Dbtools::Database::PostgresqlConnection.new("#{@postgres_connection_url}#{database_name}")
93
+ psql.execute_query(csv_schema_command)
94
+ psql.copy_from_file(csv_file, table_name, csv.delimiter)
95
+ psql.execute_files(Dbtools::Constants::PLSQL_FUNCTIONS_DIR)
96
+ ensure
97
+ psql.close
98
+ end
99
+ return "#{@postgres_connection_url}#{database_name}"
100
+ end
101
+
102
+ desc 'excel [database_name, file]', 'Loads an excel file as a csv into the database. '
103
+ def excel(database_name, file)
104
+ folder = File.join("/tmp", database_name)
105
+ # Convert spreadsheets to Excel.
106
+ files = excel2csv(file, folder)
107
+ result = ''
108
+ files.each do |sheet_name, csv_file|
109
+ begin
110
+ # Load every file in Postgres
111
+ table_name = "#{File.basename(csv_file, File.extname(csv_file))}_#{sheet_name}"
112
+ result = csv_in_postgres(csv_file, database_name, table_name)
113
+ rescue Exception => e
114
+ puts "Could not load #{csv_file} into #{database_name} because #{e.message}. "
115
+ end
116
+ end
117
+ FileUtils.remove_entry_secure(folder)
118
+ return result
119
+ end
120
+
121
+ desc 'excel2csv [file, target_dir]', 'Converts an Excel file to CSV files. Every spreadsheet will be a CSV file.'
122
+ def excel2csv(file, target_dir)
123
+ converter = Dbtools::Converter::Excel2csv_converter.new(file)
124
+ files = converter.output(target_dir)
125
+ return files
126
+ end
127
+
128
+
129
+ private
130
+ # Loads all configurations needed
131
+ def load_config
132
+ config = YAML.load(File.read(Dbtools::Constants::DB_TARGET_CONFIG_PATH))
133
+ postgres_config = config['postgres']
134
+ mysql_config = config['mysql']
135
+ @postgres_connection_url = "postgres://#{postgres_config['username']}:#{postgres_config['password']}@#{postgres_config['host']}/"
136
+ @mysql_connection_url = "mysql2://#{mysql_config['username']}:#{mysql_config['password']}@#{mysql_config['host']}/"
137
+ @postgres_connection_options = "--username=#{postgres_config['username']} --host=#{postgres_config['host']} --port=#{postgres_config['port']}"
138
+ @postgres_connection_command = "psql #{@postgres_connection_options}"
139
+ @mysql_connection_command = "mysql -u #{mysql_config['username']} -p#{mysql_config['password']} -h #{mysql_config['host']}"
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,29 @@
1
+ require 'dbtools/database/postgresql_connection'
2
+ require 'thor'
3
+ require 'dbtools/constants'
4
+
5
+ module Dbtools
6
+ class Postgres < Thor
7
+ package_name "dbtools"
8
+
9
+ desc 'load_functions [database_url]', 'Deploys the catalog of pl/sql functions in the specified database.'
10
+ def load_functions(database_url)
11
+ db = check_adapter(database_url)
12
+ # All functions are located in this directory.
13
+ db.execute_files(Dbtools::Constants::PLSQL_FUNCTIONS_DIR)
14
+ db.close
15
+ end
16
+
17
+ private
18
+ # Check if the url is a postgres or mysql connection.
19
+ def check_adapter(url)
20
+ adapter = url.match("^([a-zA-Z0-9]+):\/\/(.+)@(.+)\/(.*)").captures[0]
21
+ if adapter == "postgres"
22
+ return Dbtools::Database::PostgresqlConnection.new(url)
23
+ else
24
+ puts "Invalid url"
25
+ return nil
26
+ end
27
+ end
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,307 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dbtools
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.2
5
+ platform: ruby
6
+ authors:
7
+ - Hung Nguyen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-09-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdf-reasoner
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.19.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.19.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activemodel
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: google-api-client
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: linkeddata
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: whenever
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: roo
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.4'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.4'
139
+ - !ruby/object:Gem::Dependency
140
+ name: roo-xls
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: ru_bee
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.1'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.1'
167
+ - !ruby/object:Gem::Dependency
168
+ name: mysql2
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.4'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.4'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pg
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '0.18'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '0.18'
195
+ - !ruby/object:Gem::Dependency
196
+ name: spira
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: 2.0.0
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: 2.0.0
209
+ - !ruby/object:Gem::Dependency
210
+ name: aws-sdk
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '2.7'
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '2.7'
223
+ - !ruby/object:Gem::Dependency
224
+ name: bundler
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '1.12'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '1.12'
237
+ description:
238
+ email:
239
+ - h.nguyen@geophy.com
240
+ executables:
241
+ - dbtools
242
+ extensions: []
243
+ extra_rdoc_files: []
244
+ files:
245
+ - README.md
246
+ - Thorfile
247
+ - bin/dbtools
248
+ - config/client_secret_dbtools.json
249
+ - config/config.yml
250
+ - config/database_config.yml
251
+ - config/databases.txt
252
+ - config/schedule.rb
253
+ - dbtools.gemspec
254
+ - lib/dbtools.rb
255
+ - lib/dbtools/constants.rb
256
+ - lib/dbtools/converter/csv2rdf_converter.rb
257
+ - lib/dbtools/converter/csv_importer.rb
258
+ - lib/dbtools/converter/excel2csv_converter.rb
259
+ - lib/dbtools/converter/google_drive2_rdf_converter.rb
260
+ - lib/dbtools/database/database_data.rb
261
+ - lib/dbtools/database/db_connection.rb
262
+ - lib/dbtools/database/mysql_connection.rb
263
+ - lib/dbtools/database/postgresql_connection.rb
264
+ - lib/dbtools/database/violation.rb
265
+ - lib/dbtools/google_drive/google_drive_api.rb
266
+ - lib/dbtools/google_drive/google_drive_entity.rb
267
+ - lib/dbtools/google_drive/google_drive_file.rb
268
+ - lib/dbtools/google_drive/google_drive_folder.rb
269
+ - lib/dbtools/plsql_functions/connect_server.sql
270
+ - lib/dbtools/plsql_functions/link.sql
271
+ - lib/dbtools/plsql_functions/unlink.sql
272
+ - lib/dbtools/rdf/rdf_reader.rb
273
+ - lib/dbtools/version.rb
274
+ - lib/rdf/geophy.rb
275
+ - lib/tasks/aws.rb
276
+ - lib/tasks/backup.rb
277
+ - lib/tasks/check.rb
278
+ - lib/tasks/ckan.rb
279
+ - lib/tasks/convert.rb
280
+ - lib/tasks/dump.rb
281
+ - lib/tasks/googledrivetool.rb
282
+ - lib/tasks/import.rb
283
+ - lib/tasks/postgres.rb
284
+ homepage:
285
+ licenses: []
286
+ metadata: {}
287
+ post_install_message:
288
+ rdoc_options: []
289
+ require_paths:
290
+ - lib
291
+ required_ruby_version: !ruby/object:Gem::Requirement
292
+ requirements:
293
+ - - ">="
294
+ - !ruby/object:Gem::Version
295
+ version: '0'
296
+ required_rubygems_version: !ruby/object:Gem::Requirement
297
+ requirements:
298
+ - - ">="
299
+ - !ruby/object:Gem::Version
300
+ version: '0'
301
+ requirements: []
302
+ rubyforge_project:
303
+ rubygems_version: 2.6.10
304
+ signing_key:
305
+ specification_version: 4
306
+ summary: Tool for database maintenance.
307
+ test_files: []