mysql2xxxx 0.0.3 → 0.0.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.
- data/.gitignore +2 -1
- data/Rakefile +2 -0
- data/benchmark/benchmark.rb +71 -0
- data/benchmark/five_thousand_rows.sql.bz2 +0 -0
- data/benchmark/results/0.0.3-20110314153320.txt +46 -0
- data/benchmark/results/0.0.3-20110314160922.txt +185 -0
- data/benchmark/results/0.0.4-20110314190640.txt +147 -0
- data/benchmark/results/0.0.4-20110315110535-ruby18.txt +149 -0
- data/benchmark/results/0.0.4-20110315110613-ruby19.txt +43 -0
- data/benchmark/target.rb +20 -0
- data/lib/mysql2xxxx.rb +8 -5
- data/lib/mysql2xxxx/properties.rb +15 -11
- data/lib/mysql2xxxx/version.rb +1 -1
- data/lib/mysql2xxxx/writer.rb +82 -0
- data/lib/mysql2xxxx/writer/csv.rb +17 -0
- data/lib/mysql2xxxx/writer/json.rb +29 -0
- data/lib/mysql2xxxx/{xml.rb → writer/xml.rb} +7 -13
- data/mysql2xxxx.gemspec +3 -1
- data/test/helper.rb +3 -1
- data/test/test_active_record_config_stealing.rb +1 -1
- data/test/test_multiline_sql.rb +19 -0
- data/test/test_mysql2xxxx.rb +7 -3
- metadata +24 -51
- data/lib/mysql2xxxx/csv.rb +0 -32
- data/lib/mysql2xxxx/extra_outputs.rb +0 -23
- data/lib/mysql2xxxx/json.rb +0 -36
@@ -0,0 +1,149 @@
|
|
1
|
+
mysql2xxxx
|
2
|
+
Version: 0.0.4
|
3
|
+
Run: Tue Mar 15 11:05:35 -0500 2011
|
4
|
+
System: Darwin vidalia 10.6.0 Darwin Kernel Version 10.6.0: Wed Nov 10 18:13:17 PST 2010; root:xnu-1504.9.26~3/RELEASE_I386 i386
|
5
|
+
|
6
|
+
##################################################
|
7
|
+
# CSV
|
8
|
+
##################################################
|
9
|
+
Real memory over time (sampled every 0.3 sec):
|
10
|
+
0:00.30 11672
|
11
|
+
0:00.60 19936
|
12
|
+
0:00.91 19408
|
13
|
+
0:01.29 20460
|
14
|
+
0:01.56 20460
|
15
|
+
0:01.87 20460
|
16
|
+
0:02.17 20460
|
17
|
+
Memprof object counts (top 25):
|
18
|
+
5044 ./benchmark/../lib/mysql2xxxx/writer.rb:43:String
|
19
|
+
5019 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1798:String
|
20
|
+
1617 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1852:String
|
21
|
+
808 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1849:String
|
22
|
+
408 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1849:Array
|
23
|
+
406 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1092:__scope__
|
24
|
+
405 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1091:Hash
|
25
|
+
404 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1852:Method
|
26
|
+
404 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1852:MatchData
|
27
|
+
404 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1490:String
|
28
|
+
372 (__FORWARDABLE__):5:__node__
|
29
|
+
279 (__FORWARDABLE__):3:__node__
|
30
|
+
217 (__FORWARDABLE__):1:__node__
|
31
|
+
206 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1092:String
|
32
|
+
205 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1826:String
|
33
|
+
205 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1734:String
|
34
|
+
205 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1423:Hash
|
35
|
+
204 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:2004:Hash
|
36
|
+
204 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1831:Hash
|
37
|
+
204 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1830:Regexp
|
38
|
+
204 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1826:Regexp
|
39
|
+
204 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1823:String
|
40
|
+
204 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1823:Regexp
|
41
|
+
204 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1820:Regexp
|
42
|
+
204 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1791:Proc
|
43
|
+
|
44
|
+
##################################################
|
45
|
+
# JSON
|
46
|
+
##################################################
|
47
|
+
Real memory over time (sampled every 0.3 sec):
|
48
|
+
0:00.30 12364
|
49
|
+
0:00.61 17128
|
50
|
+
0:00.94 17536
|
51
|
+
0:01.24 17536
|
52
|
+
0:01.54 17536
|
53
|
+
0:01.83 17536
|
54
|
+
0:02.12 17536
|
55
|
+
0:02.41 17536
|
56
|
+
0:02.70 17536
|
57
|
+
0:02.93 17536
|
58
|
+
0:03.06 17536
|
59
|
+
0:03.37 17536
|
60
|
+
0:03.68 17536
|
61
|
+
0:03.98 17536
|
62
|
+
0:04.28 17536
|
63
|
+
0:04.58 17536
|
64
|
+
0:04.88 17536
|
65
|
+
0:05.18 17536
|
66
|
+
0:05.48 17536
|
67
|
+
0:05.79 17536
|
68
|
+
0:06.10 17536
|
69
|
+
0:06.40 17536
|
70
|
+
0:06.71 17536
|
71
|
+
0:07.02 17536
|
72
|
+
0:07.36 17536
|
73
|
+
0:07.67 17536
|
74
|
+
0:07.97 17536
|
75
|
+
0:08.28 17536
|
76
|
+
0:08.59 17536
|
77
|
+
0:08.89 17536
|
78
|
+
0:09.20 17536
|
79
|
+
0:09.52 17536
|
80
|
+
0:09.82 17536
|
81
|
+
0:10.13 17536
|
82
|
+
0:10.44 17536
|
83
|
+
0:10.74 17536
|
84
|
+
0:11.04 17536
|
85
|
+
Memprof object counts (top 25):
|
86
|
+
3792 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:125:String
|
87
|
+
2882 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:73:__node__
|
88
|
+
1922 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:235:Array
|
89
|
+
1898 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:132:String
|
90
|
+
1094 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:247:String
|
91
|
+
1022 ./benchmark/../lib/mysql2xxxx/writer.rb:51:String
|
92
|
+
989 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:247:Array
|
93
|
+
950 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:236:Array
|
94
|
+
280 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:69:__node__
|
95
|
+
260 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:70:__node__
|
96
|
+
170 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.6.0/syck.bundle:0:__node__
|
97
|
+
160 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:67:__node__
|
98
|
+
160 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:65:__node__
|
99
|
+
148 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:75:__node__
|
100
|
+
120 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.6.0/stringio.bundle:0:__node__
|
101
|
+
117 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.6.0/bigdecimal.bundle:0:__node__
|
102
|
+
114 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:61:Hash
|
103
|
+
105 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:68:__node__
|
104
|
+
73 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:247:__node__
|
105
|
+
64 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/deprecation/proxy_wrappers.rb:13:__node__
|
106
|
+
63 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/json/encoding.rb:237:__node__
|
107
|
+
60 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:72:__node__
|
108
|
+
60 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:71:__node__
|
109
|
+
60 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:64:__node__
|
110
|
+
60 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/yaml/tag.rb:63:__node__
|
111
|
+
|
112
|
+
##################################################
|
113
|
+
# XML
|
114
|
+
##################################################
|
115
|
+
Real memory over time (sampled every 0.3 sec):
|
116
|
+
0:00.29 10920
|
117
|
+
0:00.54 18088
|
118
|
+
0:00.83 17836
|
119
|
+
0:01.12 17496
|
120
|
+
0:01.43 17836
|
121
|
+
0:01.73 18520
|
122
|
+
0:02.03 17496
|
123
|
+
0:02.33 18520
|
124
|
+
Memprof object counts (top 25):
|
125
|
+
7638 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:16:String
|
126
|
+
2539 ./benchmark/../lib/mysql2xxxx/writer.rb:43:String
|
127
|
+
2538 ./benchmark/../lib/mysql2xxxx/writer.rb:7:Array
|
128
|
+
2537 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:16:Array
|
129
|
+
120 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.6.0/stringio.bundle:0:__node__
|
130
|
+
109 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:15:__node__
|
131
|
+
103 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:18:String
|
132
|
+
103 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:14:String
|
133
|
+
102 ./benchmark/../lib/mysql2xxxx/writer.rb:43:Array
|
134
|
+
28 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:16:__node__
|
135
|
+
25 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:4:String
|
136
|
+
25 ./benchmark/../lib/mysql2xxxx/writer.rb:11:String
|
137
|
+
22 ./benchmark/../lib/mysql2xxxx/writer.rb:35:__node__
|
138
|
+
20 ./benchmark/../lib/mysql2xxxx/writer.rb:16:__node__
|
139
|
+
14 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:12:__node__
|
140
|
+
14 ./benchmark/../lib/mysql2xxxx/properties.rb:18:__node__
|
141
|
+
12 ./benchmark/../lib/mysql2xxxx/writer.rb:11:__node__
|
142
|
+
12 ./benchmark/../lib/mysql2xxxx/properties.rb:36:__node__
|
143
|
+
12 ./benchmark/../lib/mysql2xxxx/properties.rb:32:__node__
|
144
|
+
12 ./benchmark/../lib/mysql2xxxx/properties.rb:14:__node__
|
145
|
+
12 ./benchmark/../lib/mysql2xxxx/properties.rb:10:__node__
|
146
|
+
11 ./benchmark/../lib/mysql2xxxx/writer/xml.rb:4:__node__
|
147
|
+
10 ./benchmark/../lib/mysql2xxxx/writer.rb:34:__node__
|
148
|
+
10 ./benchmark/../lib/mysql2xxxx/properties.rb:40:__node__
|
149
|
+
9 ./benchmark/../lib/mysql2xxxx/writer.rb:26:__node__
|
@@ -0,0 +1,43 @@
|
|
1
|
+
mysql2xxxx
|
2
|
+
Version: 0.0.4
|
3
|
+
Run: 2011-03-15 11:06:13 -0500
|
4
|
+
System: Darwin vidalia 10.6.0 Darwin Kernel Version 10.6.0: Wed Nov 10 18:13:17 PST 2010; root:xnu-1504.9.26~3/RELEASE_I386 i386
|
5
|
+
|
6
|
+
##################################################
|
7
|
+
# CSV
|
8
|
+
##################################################
|
9
|
+
Real memory over time (sampled every 0.3 sec):
|
10
|
+
0:00.31 12416
|
11
|
+
0:00.61 15264
|
12
|
+
0:00.92 15800
|
13
|
+
0:01.23 15800
|
14
|
+
0:01.54 15800
|
15
|
+
Memprof object counts not available (ruby 1.9)
|
16
|
+
|
17
|
+
##################################################
|
18
|
+
# JSON
|
19
|
+
##################################################
|
20
|
+
Real memory over time (sampled every 0.3 sec):
|
21
|
+
0:00.31 12424
|
22
|
+
0:00.61 15576
|
23
|
+
0:00.91 15684
|
24
|
+
0:01.22 15852
|
25
|
+
0:01.53 15852
|
26
|
+
0:01.83 15852
|
27
|
+
0:02.14 15852
|
28
|
+
0:02.45 15852
|
29
|
+
0:02.75 15852
|
30
|
+
0:03.06 15852
|
31
|
+
0:03.37 15852
|
32
|
+
0:03.67 15852
|
33
|
+
0:03.97 15852
|
34
|
+
Memprof object counts not available (ruby 1.9)
|
35
|
+
|
36
|
+
##################################################
|
37
|
+
# XML
|
38
|
+
##################################################
|
39
|
+
Real memory over time (sampled every 0.3 sec):
|
40
|
+
0:00.30 12928
|
41
|
+
0:00.60 14616
|
42
|
+
0:00.91 14616
|
43
|
+
Memprof object counts not available (ruby 1.9)
|
data/benchmark/target.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
unless RUBY_VERSION >= '1.9'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'memprof'
|
5
|
+
end
|
6
|
+
$LOAD_PATH.unshift File.join(ENV['HERE'], '..', 'lib')
|
7
|
+
require 'mysql2xxxx'
|
8
|
+
|
9
|
+
format = ARGV[0]
|
10
|
+
|
11
|
+
if RUBY_VERSION >= '1.9'
|
12
|
+
# unfortunately can't use memprof
|
13
|
+
a = Mysql2xxxx.const_get(format).new :user => ENV['DBUSER'], :password => ENV['DBPASSWORD'], :database => ENV['DBNAME'], :execute => ENV['EXECUTE']
|
14
|
+
a.to_path ENV['DUMP_PATH']
|
15
|
+
else
|
16
|
+
Memprof.track(ENV['MEMPROF_REPORT_PATH']) do
|
17
|
+
a = Mysql2xxxx.const_get(format).new :user => ENV['DBUSER'], :password => ENV['DBPASSWORD'], :database => ENV['DBNAME'], :execute => ENV['EXECUTE']
|
18
|
+
a.to_path ENV['DUMP_PATH']
|
19
|
+
end
|
20
|
+
end
|
data/lib/mysql2xxxx.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
unless RUBY_VERSION >= '1.9'
|
2
|
+
$KCODE = 'U'
|
3
|
+
end
|
1
4
|
require 'active_support'
|
2
5
|
require 'active_support/version'
|
3
6
|
%w{
|
@@ -7,13 +10,13 @@ require 'active_support/version'
|
|
7
10
|
}.each do |active_support_3_requirement|
|
8
11
|
require active_support_3_requirement
|
9
12
|
end if ::ActiveSupport::VERSION::MAJOR == 3
|
10
|
-
require '
|
13
|
+
require 'mysql'
|
11
14
|
|
12
15
|
module Mysql2xxxx
|
13
|
-
autoload :JSON, 'mysql2xxxx/json'
|
14
|
-
autoload :CSV, 'mysql2xxxx/csv'
|
15
|
-
autoload :XML, 'mysql2xxxx/xml'
|
16
|
+
autoload :JSON, 'mysql2xxxx/writer/json'
|
17
|
+
autoload :CSV, 'mysql2xxxx/writer/csv'
|
18
|
+
autoload :XML, 'mysql2xxxx/writer/xml'
|
19
|
+
autoload :Writer, 'mysql2xxxx/writer'
|
16
20
|
autoload :Properties, 'mysql2xxxx/properties'
|
17
|
-
autoload :ExtraOutputs, 'mysql2xxxx/extra_outputs'
|
18
21
|
autoload :Cli, 'mysql2xxxx/cli'
|
19
22
|
end
|
@@ -6,16 +6,6 @@ module Mysql2xxxx
|
|
6
6
|
@options.stringify_keys!
|
7
7
|
end
|
8
8
|
|
9
|
-
def database_config
|
10
|
-
{
|
11
|
-
:username => user,
|
12
|
-
:password => password,
|
13
|
-
:host => host,
|
14
|
-
:port => port,
|
15
|
-
:database => database
|
16
|
-
}
|
17
|
-
end
|
18
|
-
|
19
9
|
def user
|
20
10
|
options['user'] || active_record_config.try(:[], :username)
|
21
11
|
end
|
@@ -25,13 +15,27 @@ module Mysql2xxxx
|
|
25
15
|
end
|
26
16
|
|
27
17
|
def host
|
28
|
-
options['host'] || active_record_config.try(:[], :host)
|
18
|
+
options['host'] || active_record_config.try(:[], :host) || '127.0.0.1'
|
19
|
+
end
|
20
|
+
|
21
|
+
# Force utf8 as mysql connection charset
|
22
|
+
def charset
|
23
|
+
'utf8'
|
24
|
+
end
|
25
|
+
|
26
|
+
# Force UTF-8 as ruby string encoding (ruby 1.9 only)
|
27
|
+
def encoding
|
28
|
+
'UTF-8'
|
29
29
|
end
|
30
30
|
|
31
31
|
def port
|
32
32
|
options['port'] || active_record_config.try(:[], :port)
|
33
33
|
end
|
34
34
|
|
35
|
+
def socket
|
36
|
+
options['socket'] || active_record_config.try(:[], :socket)
|
37
|
+
end
|
38
|
+
|
35
39
|
def database
|
36
40
|
options['database'] || active_record_connection.try(:current_database)
|
37
41
|
end
|
data/lib/mysql2xxxx/version.rb
CHANGED
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
module Mysql2xxxx
|
3
|
+
class Writer
|
4
|
+
attr_reader :properties
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
@properties = Properties.new options
|
8
|
+
end
|
9
|
+
|
10
|
+
def keys
|
11
|
+
@keys ||= result.fetch_fields.map { |field| field.name }
|
12
|
+
end
|
13
|
+
|
14
|
+
def last_statement
|
15
|
+
return @last_statement if @last_statement.is_a? ::String
|
16
|
+
statements = properties.execute.split(';').select { |statement| statement.to_s.strip.length > 0 }
|
17
|
+
@last_statement = statements.pop
|
18
|
+
statements.each do |statement|
|
19
|
+
dbh.query statement
|
20
|
+
# but we're not using the results
|
21
|
+
end
|
22
|
+
@last_statement
|
23
|
+
end
|
24
|
+
|
25
|
+
def result
|
26
|
+
return @result if @result.is_a? ::Mysql::Result
|
27
|
+
dbh.query last_statement
|
28
|
+
@result = dbh.use_result
|
29
|
+
end
|
30
|
+
|
31
|
+
def dbh
|
32
|
+
return @dbh if @dbh.is_a? ::Mysql
|
33
|
+
@dbh = ::Mysql.init
|
34
|
+
@dbh.options ::Mysql::SET_CHARSET_NAME, properties.charset
|
35
|
+
@dbh.real_connect properties.host, properties.user, properties.password, properties.database, properties.port, properties.socket
|
36
|
+
# so that we can use_result instead of store_result
|
37
|
+
@dbh.query_with_result = false
|
38
|
+
@dbh
|
39
|
+
end
|
40
|
+
|
41
|
+
def stream_arrays
|
42
|
+
raise "dead connection" if @dead
|
43
|
+
while ary = result.fetch_row do
|
44
|
+
yield ary
|
45
|
+
end
|
46
|
+
close
|
47
|
+
end
|
48
|
+
|
49
|
+
def stream_hashes
|
50
|
+
raise "dead connection" if @dead
|
51
|
+
while hsh = result.fetch_hash do
|
52
|
+
yield hsh
|
53
|
+
end
|
54
|
+
close
|
55
|
+
end
|
56
|
+
|
57
|
+
def close
|
58
|
+
result.free
|
59
|
+
dbh.close
|
60
|
+
@dead = true
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_s
|
64
|
+
s = ::StringIO.new
|
65
|
+
to_file s
|
66
|
+
s.rewind
|
67
|
+
s.read
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_stdout
|
71
|
+
to_file $stdout
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_path(path)
|
76
|
+
f = ::File.open(path, 'w')
|
77
|
+
to_file f
|
78
|
+
f.close
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
%w{
|
2
|
+
active_support/json/encoding
|
3
|
+
}.each do |active_support_3_requirement|
|
4
|
+
require active_support_3_requirement
|
5
|
+
end if ::ActiveSupport::VERSION::MAJOR == 3
|
6
|
+
|
7
|
+
module Mysql2xxxx
|
8
|
+
class JSON < Writer
|
9
|
+
def to_file(f)
|
10
|
+
first = true
|
11
|
+
f.write '['
|
12
|
+
stream_hashes do |hsh|
|
13
|
+
if first
|
14
|
+
first = false
|
15
|
+
else
|
16
|
+
f.write ','
|
17
|
+
end
|
18
|
+
if RUBY_VERSION >= '1.9'
|
19
|
+
# the mysql gem isn't encoding aware, so even if mysql returns proper utf-8, ruby 1.9 treats it as ASCII-8BIT
|
20
|
+
# here we force ruby to treat these strings as utf-8 without any further conversion
|
21
|
+
hsh.each { |k, v| hsh[k] = v.nil? ? nil : v.force_encoding(properties.encoding) }
|
22
|
+
end
|
23
|
+
f.write hsh.to_json
|
24
|
+
end
|
25
|
+
f.write ']'
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,30 +1,24 @@
|
|
1
1
|
module Mysql2xxxx
|
2
|
-
class XML
|
3
|
-
|
4
|
-
|
5
|
-
attr_reader :properties
|
6
|
-
|
7
|
-
def initialize(options = {})
|
8
|
-
@properties = Properties.new options
|
2
|
+
class XML < Writer
|
3
|
+
def escaped_keys
|
4
|
+
@escaped_keys ||= keys.map { |k| k.to_xs }
|
9
5
|
end
|
10
6
|
|
7
|
+
# sabshere 2/10/11 dkastner pointed out that this doesn't include metadata like later versions of mysql do
|
11
8
|
# this matches the xml generated by "mysql --xml"
|
12
9
|
# i tried to use builder, but the String#to_xs nonsense got in the way
|
13
10
|
def to_file(f)
|
14
|
-
@client = ::Mysql2::Client.new properties.database_config
|
15
11
|
f.write %{<?xml version="1.0" encoding="utf-8" ?>}
|
16
12
|
f.write %{<resultset statement="#{properties.execute.to_xs}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">}
|
17
|
-
|
13
|
+
stream_arrays do |ary|
|
18
14
|
f.write %{<row>}
|
19
|
-
|
20
|
-
f.write %{<field name="#{
|
15
|
+
ary.each_with_index do |v, i|
|
16
|
+
f.write %{<field name="#{escaped_keys[i]}"#{' xsi:nil="true"' if v.nil?}>#{v.to_s.to_xs}</field>}
|
21
17
|
end
|
22
18
|
f.write %{</row>}
|
23
19
|
end
|
24
20
|
f.write %{</resultset>}
|
25
21
|
nil
|
26
|
-
ensure
|
27
|
-
@client.try :close
|
28
22
|
end
|
29
23
|
end
|
30
24
|
end
|