sqlite2dbf 0.1.8 → 0.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.
- checksums.yaml +4 -4
- data/lib/argparser.rb +83 -73
- data/lib/config +104 -0
- data/lib/configuration.rb +114 -0
- data/lib/constants.rb +2 -2
- data/lib/file_checking.rb +48 -48
- data/lib/log.conf +3 -0
- data/lib/logging.rb +131 -131
- data/lib/mapping.rb +94 -0
- data/lib/sqlite2dbf.rb +156 -129
- data/lib/translating.rb +56 -52
- data/lib/translations +132 -43
- data/sqlite2dbf.gemspec +2 -2
- metadata +8 -5
data/lib/logging.rb
CHANGED
@@ -54,140 +54,140 @@ class TClass
|
|
54
54
|
end
|
55
55
|
=end
|
56
56
|
module Logging
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
57
|
+
include File_Checking
|
58
|
+
|
59
|
+
@@have_log = false
|
60
|
+
@@LOG_CONF = File.dirname(File.absolute_path(__FILE__)) << File::Separator << 'log.conf'
|
61
|
+
|
62
|
+
# Call this method in an instance-method (e.g. initialize() ) to define the
|
63
|
+
# object-level logger; i.e. an object-specific member @log.
|
64
|
+
# Call this method within the class-definition for a class-level logger; i.e.
|
65
|
+
# a member @log for class-level acces.
|
66
|
+
# The method returns the logger, so you can actually do what you want with it.
|
67
|
+
def init_logger(target = STDOUT, level = Logger::INFO)
|
68
|
+
# Prepare for a class-level logger. This is actually quite cool.
|
69
|
+
|
70
|
+
# ---> Ingeniuous code starts here
|
71
|
+
cn = (self.class == Class ? name : self.class.name)
|
72
|
+
# <--- Ingeniuous code ends here
|
73
|
+
|
74
|
+
# allow to override the set log-levels with an
|
75
|
+
# external configuration (log.conf).
|
76
|
+
log_conf(cn)
|
77
|
+
# Or use the defaults as set here or elsewhere...
|
78
|
+
|
79
|
+
@level ||= level
|
80
|
+
@target ||= target
|
81
|
+
|
82
|
+
@log = Logger.new(@target)
|
83
|
+
@log.level = @level
|
84
|
+
|
85
|
+
@log.formatter = proc do |severity, datetime, progname, msg|
|
86
|
+
t = Time.now
|
87
|
+
"#{cn}: #{severity} #{t.hour}-#{t.min}-#{t.sec}: #{msg}\n"
|
88
|
+
end
|
89
|
+
if ! @@have_log
|
90
|
+
@log.debug cn.dup << ' reading logging-configuration from ' << @@LOG_CONF
|
91
|
+
@@have_log = true
|
92
|
+
@log.debug('level is ' << level.to_s)
|
93
|
+
end
|
94
|
+
return @log
|
95
|
+
end
|
96
|
+
|
97
|
+
# Set the log-target to an IO object.
|
98
|
+
def log_target=(target)
|
99
|
+
@target = target
|
100
|
+
@log = Logger.new(@@target)
|
101
|
+
@log.level = @level
|
102
|
+
end
|
103
|
+
|
104
|
+
# set the log-level
|
105
|
+
def log_level=(level)
|
106
|
+
@level = level
|
107
|
+
@log.level = @level
|
108
|
+
end
|
109
|
+
|
110
|
+
private
|
111
|
+
|
112
|
+
# Override or set the log-level and target-device, as set in a file 'log.conf'.
|
113
|
+
# I do not like the look of this, but it works just the way I want it to.
|
114
|
+
# "HEAVANS! Isn't there a standard way to do this in Ruby, for Christ's sake?", you say.
|
115
|
+
# Heck, I don't care. <= Read that again, I say.
|
116
|
+
def log_conf(cn = nil)
|
117
|
+
config = level = target = nil
|
118
|
+
# puts 'log-config is in ' << @@LOG_CONF
|
119
|
+
if(File::exist?(@@LOG_CONF) )
|
120
|
+
begin
|
121
|
+
conf = File.read(@@LOG_CONF)
|
122
|
+
config = instance_eval(conf)
|
123
|
+
rescue Exception => ex
|
124
|
+
STDERR.puts "WARNING! Cannot evaluate the logger-configuration!" << ' ' << ex.message
|
125
|
+
STDERR.puts "Default log-levels apply."
|
126
|
+
end
|
127
|
+
else
|
128
|
+
puts "Default log-levels apply."
|
129
|
+
end
|
130
|
+
|
131
|
+
if(config && config.respond_to?(:to_hash) )
|
132
|
+
config.default = nil
|
133
|
+
if cn
|
134
|
+
config = config[cn.to_sym]
|
135
|
+
else
|
136
|
+
config = config[self.class.name.to_sym]
|
137
|
+
end
|
138
|
+
|
139
|
+
if(config )
|
140
|
+
if(config.respond_to?(:to_ary) && config.size == 2)
|
141
|
+
@level, @target = config
|
142
|
+
@target.downcase!
|
143
|
+
logdir = File.dirname(@target)
|
144
|
+
msg = file_check(logdir, :exist?, :directory?, :writable?)
|
145
|
+
if(msg)
|
146
|
+
STDERR.puts "WARNING! A logfile for '%s' cannot be written to %s (%s)!" %[self.class.name, logdir, msg]
|
147
|
+
@target = nil
|
148
|
+
end
|
149
|
+
else
|
150
|
+
@level = config
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
155
|
end
|
156
156
|
|
157
157
|
######### test
|
158
158
|
if __FILE__ == $0
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
159
|
+
class TClass
|
160
|
+
# class level ---->
|
161
|
+
self.extend(Logging)
|
162
|
+
@@log = init_logger(STDOUT, Logger::INFO)
|
163
|
+
# <------
|
164
|
+
# object-level ---->
|
165
|
+
include Logging
|
166
|
+
# <---------
|
167
|
+
|
168
|
+
def test_log
|
169
|
+
@@log.info('class-level logger called from instance: ' << @@log.to_s)
|
170
|
+
#@log = @@log # works too
|
171
|
+
@log = TClass.class_eval{@log}
|
172
|
+
@log.info('AGAIN: class-level logger called from instance: ' << @log.to_s)
|
173
|
+
@log.debug("you won't see this on log-level INFO")
|
174
|
+
|
175
|
+
# object-level ---->
|
176
|
+
init_logger
|
177
|
+
# <-----------
|
178
|
+
@log.info("That's a different thing: " << @log.to_s << " - object-level logger!")
|
179
|
+
|
180
|
+
end
|
181
|
+
def self::test_log
|
182
|
+
@log.info('class-level logger called from class: ' << @log.to_s)
|
183
|
+
@@log.info('AGAIN: class-level logger called from class: ' << @log.to_s)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
TClass.new.test_log # class-logger + 1st object-logger
|
188
|
+
TClass.new.test_log # same class-logger + 2nd object-logger
|
189
|
+
|
190
|
+
TClass::test_log # same class-logger
|
191
|
+
puts 'And just say it once clearly: THIS IS COOOL!!'
|
192
192
|
end
|
193
193
|
#EOF
|
data/lib/mapping.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
/***************************************************************************
|
4
|
+
* ©2016 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
5
|
+
* *
|
6
|
+
* This program is free software; you can redistribute it and/or modify *
|
7
|
+
* it under the terms of the GNU General Public License as published by *
|
8
|
+
* the Free Software Foundation; either version 3 of the License, or *
|
9
|
+
* (at your option) any later version. *
|
10
|
+
* *
|
11
|
+
* This program is distributed in the hope that it will be useful, *
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
14
|
+
* GNU General Public License for more details. *
|
15
|
+
* *
|
16
|
+
* You should have received a copy of the GNU General Public License *
|
17
|
+
* along with this program; if not, write to the *
|
18
|
+
* Free Software Foundation, Inc., *
|
19
|
+
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
20
|
+
***************************************************************************/
|
21
|
+
=end
|
22
|
+
|
23
|
+
# This is not a module.
|
24
|
+
# TODO get rid of the ambivalence.
|
25
|
+
# This class represents the mapping between SQLite data-types and those in
|
26
|
+
# dBase. It is basically a decorator for an Array of OpenStruct objects.
|
27
|
+
# Mapping-objects have access to the configuration.
|
28
|
+
# TODO: Decide if this needs to be a singleton (one table only) or if it might,
|
29
|
+
# in the future, make sense to preview several mapping-objects for the
|
30
|
+
# transformation of several tables in a row.
|
31
|
+
class Mapping
|
32
|
+
|
33
|
+
include Logging
|
34
|
+
|
35
|
+
@@TMap = {
|
36
|
+
'INT' => 1,
|
37
|
+
'TINYINT' => 1,
|
38
|
+
'SMALLINT' => 1,
|
39
|
+
'MEDIUMINT' => 1,
|
40
|
+
'BIGINT' => 1,
|
41
|
+
'UNSIGNED BIGINT' => 1,
|
42
|
+
'VARCHAR' => 0,
|
43
|
+
'CHARACTER' => 0,
|
44
|
+
'VARYING CHARACTER' => 0,
|
45
|
+
'LONGVARCHAR' => 0,
|
46
|
+
'TEXT' => 0,
|
47
|
+
'BLOB' => 0,
|
48
|
+
'INTEGER' => 1,
|
49
|
+
'FLOAT' => 2,
|
50
|
+
'REAL' => 2,
|
51
|
+
'DOUBLE' => 2
|
52
|
+
}
|
53
|
+
|
54
|
+
# Constructor
|
55
|
+
# Creates a mapping for the table of name 'table'
|
56
|
+
# and basedon the table_info.
|
57
|
+
def initialize config, table_info, content
|
58
|
+
init_logger()
|
59
|
+
|
60
|
+
@table_name = config.name
|
61
|
+
@mapping = []
|
62
|
+
@content = content
|
63
|
+
@date_fields = config.date ? config.date : []
|
64
|
+
@time_fields = config.time ? config.time : []
|
65
|
+
|
66
|
+
table_info.each_with_index do |field, i|
|
67
|
+
@log.debug('field is ' << (field ? field.to_s : ' N I L ') )
|
68
|
+
field_name = field['name']
|
69
|
+
|
70
|
+
ftype = nil
|
71
|
+
|
72
|
+
# Enforce Text field for dates and times.
|
73
|
+
ftype = 0 if @date_fields.include?(field_name)
|
74
|
+
ftype = 0 if @time_fields.include?(field_name)
|
75
|
+
|
76
|
+
# Do as you must for the remainder
|
77
|
+
ftype ||= @@TMap.detect{|key, value| field['type'].upcase.start_with?(key) }[1]
|
78
|
+
|
79
|
+
@mapping << OpenStruct.new(:name => field_name, :type => ftype, :index => i)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
def [](*args)
|
83
|
+
@mapping.detect do |field|
|
84
|
+
field.index == args[0]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def each(&b)
|
89
|
+
@mapping.each do |field|
|
90
|
+
yield(field)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|