2
2
require 'sequel'
3
3
require "faker"
4
4
require 'active_support/core_ext/object/blank'
5
+ require 'hashie'
6
+ require_relative 'sql/csv_importer'
5
7
6
8
$sql = File . read ( '/home/codewarrior/solution.txt' )
7
9
$sql_cleaned = $sql. gsub ( /(\/ \* ([\s \S ]*?)\* \/ |--.*)/ , "" )
8
10
$sql_commands = $sql_cleaned. split ( /; *$/ ) . select ( &:present? )
9
11
10
- def run_sql ( limit : 100 , print : true )
11
- results = $sql_commands. map do |cmd |
12
- result = cmd . downcase . start_with? ( "insert" ) ? DB . prepare ( cmd ) : DB [ cmd ]
13
- result . to_a . tap do |results |
14
- if results . any? or $sql_commands. length == 1
15
- Display . table ( results . take ( limit ) , label : "SQL Results" ) if print
16
- if results . count > limit
17
- puts "Truncated #{ results . count } results to show only top 100"
18
- end
12
+ def run_sql ( limit : 100 , cmds : $sql_commands, print : true )
13
+ results = cmds . map do |cmd |
14
+ ( cmd . downcase . start_with? ( "insert" ) ? DB . prepare ( cmd ) : DB [ cmd ] ) . tap do |dataset |
15
+ if dataset . count > 0 or $sql_commands. length == 1
16
+ label = "SQL Results"
17
+ label += " (Top #{ limit } of #{ dataset . count } )" if dataset . count > limit
18
+
19
+ Display . table ( dataset . limit ( limit ) . to_a , label : label ) if print
19
20
end
20
21
end
21
- end . select { |r | r . length > 0 }
22
+ end
23
+
24
+ results . select! { |r | r . count > 0 }
22
25
23
- $sql_results = results . length > 1 ? results : results . first
26
+ if results . length > 1
27
+ $sql_multi = true
28
+ $sql_results = results
29
+ else
30
+ $sql_multi = false
31
+ $sql_results = results . first
32
+ end
24
33
25
34
rescue Sequel ::DatabaseError => ex
26
35
msg = ex . message . gsub ( "SQLite3::SQLException: " , "" ) ;
@@ -29,3 +38,19 @@ def run_sql(limit: 100, print: true)
29
38
end
30
39
31
40
alias :run_query :run_sql
41
+
42
+ # useful helper for finding a specific record and wrapping it in a Hashie::Mash
43
+ def find_record ( table , id )
44
+ result = DB [ table ] . where ( id : id ) . first
45
+ result ? Hashie ::Mash . new ( result ) : nil
46
+ end
47
+
48
+ # loops through each sql result and returns the row as a Hashie::Mash. If multiple results were returned,
49
+ # the last result set will be used
50
+ def each_result ( &block )
51
+ results = $sql_multi ? $sql_results. last : $sql_results
52
+ results . each do |result |
53
+ block . call ( Hashie ::Mash . new ( result ) )
54
+ end
55
+ end
56
+
0 commit comments