nbadw-util 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/nbadw/util/copy_database_task.rb +9 -10
- data/lib/scratch.rb +7 -2
- data/lib/sequel/adapters/jdbc/access.rb +18 -9
- data/lib/sequel/adapters/shared/access.rb +30 -49
- metadata +1 -1
@@ -263,19 +263,18 @@ module NBADW
|
|
263
263
|
end
|
264
264
|
|
265
265
|
STRING_TO_INT_FIXES = [
|
266
|
-
{ :table => "
|
267
|
-
{ :table => "
|
268
|
-
{ :table => "
|
269
|
-
{ :table => "
|
270
|
-
{ :table => "
|
271
|
-
{ :table => "
|
272
|
-
{ :table => "
|
273
|
-
{ :table => "
|
266
|
+
{ :table => "auxUserDBSelectedSites", :column => "AquaticSiteUseID" },
|
267
|
+
{ :table => "auxUserDBSelectedSiteUse", :column => "AquaticSiteUseID" },
|
268
|
+
{ :table => "cdTranslation - DFO Stock Mating", :column => "Mating Code" },
|
269
|
+
{ :table => "DEL-Missing Age Class in tblFishMeasurement", :column => "FishSampleID" },
|
270
|
+
{ :table => "DEL-Missing Age Class in tblFishMeasurement-robin", :column => "FishSampleID" },
|
271
|
+
{ :table => "Selections", :column => "SelectionID" },
|
272
|
+
{ :table => "tblElectrofishingMethodDetail", :column => "AquaticActivityDetailID" },
|
273
|
+
{ :table => "tblOldHabitatSurvey", :column => "HabitatSurveyID" }
|
274
274
|
]
|
275
275
|
# not sure what's up here...
|
276
276
|
before :create_table, :adapter => :postgres, :for => :destination do |src, dst, args|
|
277
|
-
|
278
|
-
if fix = STRING_TO_INT_FIXES.detect { |fix| fix[:table] == table }
|
277
|
+
if fix = STRING_TO_INT_FIXES.detect { |fix| fix[:table] == args[:table].to_s }
|
279
278
|
schema = args[:schema]
|
280
279
|
schema = schema.split("\n").collect do |line|
|
281
280
|
line = " Integer :\"#{fix[:column]}\"" if line.match(/#{fix[:column]}/)
|
data/lib/scratch.rb
CHANGED
@@ -7,10 +7,11 @@ src = 'jdbc:access:////home/colin/master.mdb'
|
|
7
7
|
dst = 'jdbc:mysql://localhost/test?user=developer&password=developer'
|
8
8
|
|
9
9
|
NBADW::Util::CopyDatabaseTask.start(src, dst, :verify_data => true, :except => ['EF Data before mm/100'])
|
10
|
-
|
10
|
+
|
11
11
|
#db = Sequel.connect(src)
|
12
12
|
#
|
13
|
-
#db.tables
|
13
|
+
#tables = db.tables
|
14
|
+
#tables.each do |t|
|
14
15
|
# puts t
|
15
16
|
#end
|
16
17
|
#
|
@@ -19,3 +20,7 @@ NBADW::Util::CopyDatabaseTask.start(src, dst, :verify_data => true, :except => [
|
|
19
20
|
#db.schema(:cdAgency).each do |col_info|
|
20
21
|
# puts "#{col_info[0]}: #{col_info[1].inspect}"
|
21
22
|
#end
|
23
|
+
#
|
24
|
+
#db[:cdAgency].each do |row|
|
25
|
+
# puts row.inspect
|
26
|
+
#end
|
@@ -1,12 +1,7 @@
|
|
1
1
|
require 'sequel/adapters/shared/access'
|
2
2
|
|
3
3
|
module Sequel
|
4
|
-
module JDBC
|
5
|
-
class Database
|
6
|
-
# Alias the generic JDBC version so it can be called directly later
|
7
|
-
alias jdbc_schema_parse_table schema_parse_table
|
8
|
-
end
|
9
|
-
|
4
|
+
module JDBC
|
10
5
|
# Database and Dataset instance methods for MSSQL specific
|
11
6
|
# support via JDBC.
|
12
7
|
module Access
|
@@ -22,10 +17,24 @@ module Sequel
|
|
22
17
|
end
|
23
18
|
|
24
19
|
private
|
25
|
-
# Call the generic JDBC version instead of MSSQL version,
|
26
|
-
# since the JDBC version handles primary keys.
|
27
20
|
def schema_parse_table(table, opts={})
|
28
|
-
|
21
|
+
m = output_identifier_meth
|
22
|
+
im = input_identifier_meth
|
23
|
+
ds = dataset
|
24
|
+
schema, table = schema_and_table(table)
|
25
|
+
schema ||= opts[:schema]
|
26
|
+
schema = im.call(schema) if schema
|
27
|
+
table = im.call(table)
|
28
|
+
pks, ts = [], []
|
29
|
+
metadata(:getPrimaryKeys, nil, schema, table) do |h|
|
30
|
+
h = downcase_hash_keys(h)
|
31
|
+
pks << h[:column_name]
|
32
|
+
end
|
33
|
+
metadata(:getColumns, nil, schema, table, nil) do |h|
|
34
|
+
h = downcase_hash_keys(h)
|
35
|
+
ts << [m.call(h[:column_name]), {:type=>schema_column_type(h[:type_name]), :db_type=>h[:type_name], :default=>(h[:column_def] == '' ? nil : h[:column_def]), :allow_null=>(h[:nullable] != 0), :primary_key=>pks.include?(h[:column_name]), :column_size=>h[:column_size]}]
|
36
|
+
end
|
37
|
+
ts
|
29
38
|
end
|
30
39
|
|
31
40
|
# Primary key indexes appear to start with pk__ on MSSQL
|
@@ -22,34 +22,40 @@ module Sequel
|
|
22
22
|
true
|
23
23
|
end
|
24
24
|
|
25
|
+
def tables
|
26
|
+
ts = []
|
27
|
+
m = output_identifier_meth
|
28
|
+
metadata(:getTables, nil, nil, nil, ['TABLE'].to_java(:string)) do |h|
|
29
|
+
h = downcase_hash_keys(h)
|
30
|
+
ts << m.call(h[:table_name])
|
31
|
+
end
|
32
|
+
ts
|
33
|
+
end
|
34
|
+
|
35
|
+
def identifier_input_method_default
|
36
|
+
:to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
# The method to apply to identifiers coming the database by default.
|
40
|
+
# Should be overridden in subclasses for databases that fold unquoted
|
41
|
+
# identifiers to lower case instead of uppercase, such as
|
42
|
+
# MySQL, PostgreSQL, and SQLite.
|
43
|
+
def identifier_output_method_default
|
44
|
+
:to_s
|
45
|
+
end
|
46
|
+
|
25
47
|
private
|
48
|
+
def downcase_hash_keys(h)
|
49
|
+
lh = {}
|
50
|
+
h.each { |k,v| lh[k.to_s.downcase.to_sym] = v }
|
51
|
+
lh
|
52
|
+
end
|
26
53
|
|
27
|
-
# MSSQL uses the
|
54
|
+
# MSSQL uses the COUNTER(1,1) column for autoincrementing columns.
|
28
55
|
def auto_increment_sql
|
29
56
|
AUTO_INCREMENT
|
30
57
|
end
|
31
58
|
|
32
|
-
# MSSQL specific syntax for altering tables.
|
33
|
-
def alter_table_sql(table, op)
|
34
|
-
case op[:op]
|
35
|
-
when :add_column
|
36
|
-
"ALTER TABLE #{quote_schema_table(table)} ADD #{column_definition_sql(op)}"
|
37
|
-
when :rename_column
|
38
|
-
"SP_RENAME #{literal("#{quote_schema_table(table)}.#{quote_identifier(op[:name])}")}, #{literal(op[:new_name].to_s)}, 'COLUMN'"
|
39
|
-
when :set_column_type
|
40
|
-
"ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} #{type_literal(op)}"
|
41
|
-
when :set_column_null
|
42
|
-
sch = schema(table).find{|k,v| k.to_s == op[:name].to_s}.last
|
43
|
-
type = {:type=>sch[:db_type]}
|
44
|
-
type[:size] = sch[:max_chars] if sch[:max_chars]
|
45
|
-
"ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} #{type_literal(type)} #{'NOT ' unless op[:null]}NULL"
|
46
|
-
when :set_column_default
|
47
|
-
"ALTER TABLE #{quote_schema_table(table)} ADD CONSTRAINT #{quote_identifier("sequel_#{table}_#{op[:name]}_def")} DEFAULT #{literal(op[:default])} FOR #{quote_identifier(op[:name])}"
|
48
|
-
else
|
49
|
-
super(table, op)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
59
|
# SQL to start a new savepoint
|
54
60
|
def begin_savepoint_sql(depth)
|
55
61
|
SQL_SAVEPOINT % depth
|
@@ -93,27 +99,6 @@ module Sequel
|
|
93
99
|
SQL_ROLLBACK
|
94
100
|
end
|
95
101
|
|
96
|
-
# MSSQL uses the INFORMATION_SCHEMA to hold column information. This method does
|
97
|
-
# not support the parsing of primary key information.
|
98
|
-
def schema_parse_table(table_name, opts)
|
99
|
-
m = output_identifier_meth
|
100
|
-
m2 = input_identifier_meth
|
101
|
-
ds = metadata_dataset.from(:information_schema__tables___t).
|
102
|
-
join(:information_schema__columns___c, :table_catalog=>:table_catalog,
|
103
|
-
:table_schema => :table_schema, :table_name => :table_name).
|
104
|
-
select(:column_name___column, :data_type___db_type, :character_maximum_length___max_chars, :column_default___default, :is_nullable___allow_null).
|
105
|
-
filter(:c__table_name=>m2.call(table_name.to_s))
|
106
|
-
if schema = opts[:schema] || default_schema
|
107
|
-
ds.filter!(:table_schema=>schema)
|
108
|
-
end
|
109
|
-
ds.map do |row|
|
110
|
-
row[:allow_null] = row[:allow_null] == 'YES' ? true : false
|
111
|
-
row[:default] = nil if blank_object?(row[:default])
|
112
|
-
row[:type] = schema_column_type(row[:db_type])
|
113
|
-
[m.call(row.delete(:column)), row]
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
102
|
# SQL fragment for marking a table as temporary
|
118
103
|
def temporary_table_sql
|
119
104
|
TEMPORARY
|
@@ -164,12 +149,13 @@ module Sequel
|
|
164
149
|
meta = result.getMetaData
|
165
150
|
cols = []
|
166
151
|
i = 0
|
167
|
-
meta.getColumnCount.times{cols << [output_identifier(meta.getColumnLabel(i+=1))
|
152
|
+
meta.getColumnCount.times { cols << [output_identifier(meta.getColumnLabel(i+=1)), i] }
|
168
153
|
@columns = cols.map{|c| c.at(0)}
|
169
154
|
row = {}
|
170
155
|
blk = if @convert_types
|
171
156
|
lambda{ |n, i|
|
172
157
|
begin
|
158
|
+
# puts "#{n}=#{(o = result.getObject(i)).nil? ? 'nil' : o}"
|
173
159
|
row[n] = convert_type(result.getObject(i))
|
174
160
|
rescue
|
175
161
|
# XXX: this is because HXTT driver throws an error here
|
@@ -276,11 +262,6 @@ module Sequel
|
|
276
262
|
s.select_sql
|
277
263
|
end
|
278
264
|
|
279
|
-
# The version of the database server.
|
280
|
-
def server_version
|
281
|
-
db.server_version(@opts[:server])
|
282
|
-
end
|
283
|
-
|
284
265
|
# Microsoft SQL Server does not support INTERSECT or EXCEPT
|
285
266
|
def supports_intersect_except?
|
286
267
|
false
|