hivemeta 0.1.1 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ * 2011-07-06 - fsf
2
+ - new: added introductory jruby/jdbc support
3
+ - change: HiveMeta::Connection.initialize takes 4 optional arguments now
4
+ and builds the dbi/jdbc string itself
5
+
6
+ * 2011-05-30 - fsf
7
+ - clean: switched dbi connection loop to an exception retry block
8
+
1
9
  * 2011-05-29 - fsf
2
10
  - new: added retry logic to the db connection to account for mysql servers
3
11
  with a relatively low max_connections setting
data/README CHANGED
@@ -39,6 +39,10 @@ Installation
39
39
 
40
40
  gem install hivemeta
41
41
 
42
+ or (for jruby)
43
+
44
+ jgem install hivemeta
45
+
42
46
  ---
43
47
 
44
48
  API Usage
@@ -81,8 +85,7 @@ db_pass = 'hivepasshere'
81
85
  db_host = 'localhost'
82
86
  db_name = 'hivemeta'
83
87
 
84
- dbi_string = "DBI:Mysql:#{db_name}:#{db_host}"
85
- h = HiveMeta::Connection.new(dbi_string, db_user, db_pass)
88
+ h = HiveMeta::Connection.new(db_name, db_host, db_user, db_pass)
86
89
 
87
90
  establishing a connection (environment variables):
88
91
 
@@ -72,8 +72,7 @@ opts.each do |opt, arg|
72
72
  exit
73
73
  end end
74
74
 
75
- dbi_string = "DBI:Mysql:#{db_name}:#{db_host}"
76
- h = HiveMeta::Connection.new(dbi_string, db_user, db_pass)
75
+ h = HiveMeta::Connection.new(db_name, db_host, db_user, db_pass)
77
76
 
78
77
  tables = []
79
78
  max_col_width = 8
@@ -44,8 +44,7 @@ opts.each do |opt, arg|
44
44
  exit
45
45
  end end
46
46
 
47
- dbi_string = "DBI:Mysql:#{db_name}:#{db_host}"
48
- h = HiveMeta::Connection.new(dbi_string, db_user, db_pass)
47
+ h = HiveMeta::Connection.new(db_name, db_host, db_user, db_pass)
49
48
 
50
49
  # test table has the following schema
51
50
  # i col_name
@@ -10,8 +10,7 @@ db_pass = 'hivepasshere'
10
10
  db_host = 'localhost'
11
11
  db_name = 'hivemeta'
12
12
 
13
- dbi_string = "DBI:Mysql:#{db_name}:#{db_host}"
14
- h = HiveMeta::Connection.new(dbi_string, db_user, db_pass)
13
+ h = HiveMeta::Connection.new(db_name, db_host, db_user, db_pass)
15
14
 
16
15
  inv_table = h.table 'sample_inventory'
17
16
 
@@ -1,48 +1,58 @@
1
- require 'dbi'
2
1
  require 'hivemeta/table'
3
2
  require 'hivemeta/record'
4
3
 
4
+ if RUBY_PLATFORM == 'java'
5
+ require 'java'
6
+ else
7
+ require 'dbi'
8
+ # fix for broken row dup in 1.9
9
+ # http://goo.gl/fx6kW
10
+ module DBI
11
+ class Row
12
+ if RUBY_VERSION =~ /^1\.9/
13
+ def dup
14
+ row = super
15
+ row.instance_variable_set :@arr, @arr.dup
16
+ row
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
5
23
  module HiveMeta
6
24
 
7
25
  class Connection
8
- def initialize(dbi_string = nil, db_user = nil, db_pass = nil)
9
- db_name = ENV['hivemeta_db_name']
10
- db_host = ENV['hivemeta_db_host']
11
- dbi_string ||= "DBI:Mysql:#{db_name}:#{db_host}"
12
- db_user ||= ENV['hivemeta_db_user']
13
- db_pass ||= ENV['hivemeta_db_pass']
14
-
15
- @dbi_string = dbi_string
16
- @db_user = db_user
17
- @db_pass = db_pass
26
+ def initialize(db_name = nil, db_host = nil, db_user = nil, db_pass = nil)
27
+ @db_name = db_name || ENV['hivemeta_db_name']
28
+ @db_host = db_host || ENV['hivemeta_db_host']
29
+ @db_user = db_user || ENV['hivemeta_db_user']
30
+ @db_pass = db_pass || ENV['hivemeta_db_pass']
18
31
  end
19
32
 
20
- def query(sql, *args)
33
+ def query_dbi(sql, *args)
21
34
  dbh = results = nil
35
+ dbi_string = "DBI:Mysql:#{@db_name}:#{@db_host}"
22
36
 
23
37
  # make a few attempts in the event that mysql has not been
24
38
  # configured with enough connections to handle many mappers
25
- max_attempts = 3
26
- 1.upto(max_attempts) do |attempt|
27
- begin
28
- dbh = DBI.connect(@dbi_string, @db_user, @db_pass)
29
- break
30
- rescue DBI::DatabaseError => e
31
- if attempt < max_attempts
32
- attempt += 1
33
- s = rand + 0.50
34
- STDERR.puts "retrying hivemeta connection after %f seconds" % s
35
- sleep s
36
- else
37
- STDERR.puts "cannot connect to metastore %s:\n error (%s) %s" %
38
- [@dbi_string, e.err, e.errstr]
39
- raise
40
- end
39
+ attempts, max_attempts = 0, 3
40
+ begin
41
+ dbh = DBI.connect(dbi_string, @db_user, @db_pass)
42
+ rescue DBI::DatabaseError => e
43
+ attempts += 1
44
+ if attempts < max_attempts
45
+ s = rand + 0.50
46
+ STDERR.puts "retrying hivemeta connection after %f seconds..." % s
47
+ sleep s
48
+ retry
49
+ else
50
+ warn "cannot connect to metastore on %s:\n error %s\n %s" %
51
+ [@db_host, e.err, e.errstr]
52
+ raise
41
53
  end
42
54
  end
43
55
 
44
- #puts "sql: #{sql}"
45
- #puts "args: #{args}"
46
56
  sth = dbh.prepare(sql)
47
57
  sth.execute(*args)
48
58
  if block_given?
@@ -58,6 +68,63 @@ module HiveMeta
58
68
  results # returns nil if a block is given
59
69
  end
60
70
 
71
+ def table_info_jdbc result
72
+ meta = result.meta_data
73
+ cols = meta.column_count
74
+ colnames = []
75
+ cols.times do |i|
76
+ colnames[i] = meta.column_name i+1
77
+ end
78
+ [cols, colnames]
79
+ end
80
+
81
+ def query_jdbc(sql, *args)
82
+ results = []
83
+ db_url = "jdbc:mysql://#{@db_host}/#{@db_name}"
84
+
85
+ # make a few attempts in the event that mysql has not been
86
+ # configured with enough connections to handle many mappers
87
+ attempts, max_attempts = 0, 3
88
+ begin
89
+ c = java.sql.DriverManager.get_connection(db_url, @db_user, @db_pass)
90
+ rescue => e
91
+ attempts += 1
92
+ if attempts < max_attempts
93
+ s = rand + 0.50
94
+ STDERR.puts "retrying hivemeta connection after %f seconds..." % s
95
+ sleep s
96
+ retry
97
+ else
98
+ warn "cannot connect to metastore on %s:\n error %s" %
99
+ [@db_host, e]
100
+ raise
101
+ end
102
+ end
103
+
104
+ stmt = c.create_statement
105
+
106
+ args.each do |arg|
107
+ # poor man's prepare
108
+ sql = sql.sub /\?/, "'#{arg}'"
109
+ res = stmt.execute_query sql
110
+
111
+ cols,names = table_info_jdbc res
112
+
113
+ while res.next do
114
+ row = []
115
+ 1.upto(cols) do |i|
116
+ row << res.get_string(i)
117
+ end
118
+ yield row if block_given?
119
+ results << row
120
+ end
121
+ end
122
+
123
+ c.close
124
+
125
+ results
126
+ end
127
+
61
128
  def tables(opts = {})
62
129
  args = nil
63
130
  if opts[:filter_path]
@@ -76,13 +143,8 @@ module HiveMeta
76
143
  results = query sql, *args
77
144
  table_names = results.map {|result| result[0]}
78
145
 
79
- #puts "TABLE_NAMES:"
80
- #p table_names
81
-
82
146
  tables = []
83
147
  table_names.each do |name|
84
- #puts "NAME: "
85
- #p name
86
148
  table = Table.new(name)
87
149
 
88
150
  sql = "select c.INTEGER_IDX, c.column_name, c.COMMENT,
@@ -91,8 +153,6 @@ module HiveMeta
91
153
  where t.SD_ID = c.SD_ID and t.SD_ID = s.SD_ID
92
154
  and t.TBL_NAME = ?"
93
155
  query sql, name do |rec|
94
- #puts "REC:"
95
- #p rec
96
156
  col_idx = rec[0].to_i
97
157
  col_name = rec[1]
98
158
  col_cmt = rec[2]
@@ -113,8 +173,6 @@ module HiveMeta
113
173
  if results and results[0] and results[0][0]
114
174
  table.delimiter = results[0][0]
115
175
  end
116
- #puts "#{name}: found delim '#{table.delimiter}'" if results[0]
117
- #puts "#{name}: no delim" if not results[0]
118
176
 
119
177
  tables << table
120
178
  end
@@ -125,20 +183,13 @@ module HiveMeta
125
183
  t = tables(:filter_name => name) # appeasing the old skool 1.8 users
126
184
  t[0] # if it comes back with multiple tables, return the first
127
185
  end
128
- end
129
186
 
130
- end
131
-
132
- # fix for broken row dup in 1.9
133
- # http://rubyforge.org/tracker/index.php?func=detail&aid=28624&group_id=234&atid=967
134
- module DBI
135
- class Row
136
- if RUBY_VERSION =~ /^1\.9/
137
- def dup
138
- row = super
139
- row.instance_variable_set :@arr, @arr.dup
140
- row
141
- end
187
+ if RUBY_PLATFORM == 'java'
188
+ alias :query :query_jdbc
189
+ Java::com.mysql.jdbc.Driver
190
+ else
191
+ alias :query :query_dbi
142
192
  end
143
193
  end
194
+
144
195
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 1
9
- version: 0.1.1
8
+ - 9
9
+ version: 0.1.9
10
10
  platform: ruby
11
11
  authors:
12
12
  - Frank Fejes
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-05-29 00:00:00 -05:00
17
+ date: 2011-07-06 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies: []
20
20