dbtools 0.5.2

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.
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: []