sqlite2dbf 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/argparser.rb +16 -3
- data/lib/constants.rb +1 -1
- data/lib/log.conf +1 -0
- data/lib/sqlite2dbf.rb +35 -16
- data/lib/translations +24 -6
- data/sqlite2dbf.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efa63f4b52e4fa86211371dce58db97f686647c0
|
4
|
+
data.tar.gz: 4ce02a2d7ddd94d3a2371cf05ad823f36c50cb63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c29cb8c99e820c288e115bb4e6e4582db95895323aed14d9d314447b05a2808484940fed2bdce53af4b6ac7a73ecfd6ecc8008348debf431a909cbccf94d8e5
|
7
|
+
data.tar.gz: 319f49362f9ecedb7e245a0efbbb01dc4efdab06f1798877ac92f1e2a0ca1a1b8d25f369cbdb53b4c95619501d6d0bc9807baddde25fd056ba2a11c0d33a570a
|
data/lib/argparser.rb
CHANGED
@@ -34,27 +34,39 @@ class ArgParser
|
|
34
34
|
|
35
35
|
self.extend(Logging)
|
36
36
|
self.extend(Translating)
|
37
|
-
@@log = init_logger()
|
37
|
+
@@log = init_logger(STDOUT, Logger::DEBUG)
|
38
38
|
|
39
39
|
# Returns a structure describing the options.
|
40
40
|
#
|
41
41
|
def self.parse(args)
|
42
42
|
# The options specified on the command line will be collected in <b>options</b>.
|
43
43
|
# We set default values here.
|
44
|
+
|
44
45
|
options = OpenStruct.new
|
45
46
|
options.debug = false
|
47
|
+
options.table_name = false
|
46
48
|
|
47
49
|
op = OptionParser.new do |opts|
|
48
50
|
opts.banner = "\n" << trl("Usage") << ":\t" << $APPNAME.dup << ' ' << trl("-s [sqlite-file] [options]") << "\n\t" << trl("or %s [Common options]") %($APPNAME)
|
49
51
|
|
50
52
|
opts.separator ""
|
51
53
|
opts.separator trl("Specific options") << ':'
|
52
|
-
|
54
|
+
|
55
|
+
opts.on('-' << trl("s"), '--' << trl("source [FILE.sqlite]"), trl( "SQLite-file to read.")) do |source|
|
53
56
|
options.source = source
|
54
57
|
end
|
55
|
-
|
58
|
+
|
59
|
+
opts.on('-' << trl("t"), '--' << trl("target [FILE(0...n).dbf]"), trl( "Name for the dBase-files (1 per table) to be written.")) do |target|
|
56
60
|
options.target = target
|
57
61
|
end
|
62
|
+
|
63
|
+
opts.on('--' << trl("time [list]"), trl( "A list of space-separated fields (table-columns) which shall be handled as timestamp values.")) do |list|
|
64
|
+
options.time = list.gsub(/[,;]/, '').split
|
65
|
+
end
|
66
|
+
|
67
|
+
opts.on('--' << trl("dates [list]"), trl( "A list of space-separated fields (table-columns) which shall be handled as date-time values.")) do |list|
|
68
|
+
options.datetime = list.gsub(/[,;]/, '').split
|
69
|
+
end
|
58
70
|
|
59
71
|
opts.on('-' << trl('o'), trl("--orig"), trl('Use the table-name as file-name for the DBF-result')) do
|
60
72
|
options.table_name = true
|
@@ -83,6 +95,7 @@ end
|
|
83
95
|
#
|
84
96
|
opts.on_tail(trl("-d"), trl("--debug"), trl("Show debug-messages") ) do
|
85
97
|
options.debug = true
|
98
|
+
@@log.level = Logger::DEBUG
|
86
99
|
end
|
87
100
|
|
88
101
|
|
data/lib/constants.rb
CHANGED
data/lib/log.conf
CHANGED
data/lib/sqlite2dbf.rb
CHANGED
@@ -43,6 +43,9 @@ class SQLite2DBF
|
|
43
43
|
@log.level = level
|
44
44
|
@log.debug('options are: ' << options.to_s)
|
45
45
|
|
46
|
+
@date_fields = options.datetime ? options.datetime : []
|
47
|
+
@time_fields = options.time ? options.time : []
|
48
|
+
|
46
49
|
if(options.source)
|
47
50
|
sqlite_file = options.source
|
48
51
|
dbf_file = options.target if options.target
|
@@ -79,7 +82,7 @@ class SQLite2DBF
|
|
79
82
|
|
80
83
|
def transform(sqlite_file, dbf_file)
|
81
84
|
# <------------ mapping SQLite-types to SHP/XBase ------------>
|
82
|
-
tmap = {'INT' => 1, 'TINYINT' => 1, 'SMALLINT' => 1, 'MEDIUMINT' => 1, 'BIGINT' => 1, 'UNSIGNED BIGINT' => 1, 'VARCHAR' => 0, 'CHARACTER' => 0, 'VARYING CHARACTER(255)' => 0, 'LONGVARCHAR' => 0, 'TEXT' => 0, 'INTEGER' => 1, 'FLOAT' => 2, 'REAL' => 2, 'DOUBLE' => 2}
|
85
|
+
tmap = {'INT' => 1, 'TINYINT' => 1, 'SMALLINT' => 1, 'MEDIUMINT' => 1, 'BIGINT' => 1, 'UNSIGNED BIGINT' => 1, 'VARCHAR' => 0, 'CHARACTER' => 0, 'VARYING CHARACTER(255)' => 0, 'LONGVARCHAR' => 0, 'TEXT' => 0, 'BLOB' => 0, 'INTEGER' => 1, 'FLOAT' => 2, 'REAL' => 2, 'DOUBLE' => 2}
|
83
86
|
# -----------> in a way ... <--------------
|
84
87
|
|
85
88
|
begin
|
@@ -100,29 +103,45 @@ class SQLite2DBF
|
|
100
103
|
dbt = SHP::DBF.create(dbf_name)
|
101
104
|
table_info.each_with_index do |field, index|
|
102
105
|
ftype = 0
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
106
|
+
field_name = field['name']
|
107
|
+
if( !@date_fields.include?(field_name) && !@time_fields.include?(field_name) )
|
108
|
+
@log.debug('field is ' << field.to_s)
|
109
|
+
# -----> determine the simple dbf data-type that has to do. <----
|
110
|
+
ftype = tmap.detect{|key, value| field['type'].start_with?(key) }[1]
|
111
|
+
# <---- Yes. I know. ---->
|
112
|
+
end
|
107
113
|
|
108
|
-
dbt.add_field(
|
114
|
+
dbt.add_field(field_name, ftype, 200, 0)
|
109
115
|
end
|
110
116
|
|
111
117
|
content.each_with_index do |row, record_no|
|
112
118
|
@log.debug('row is ' << row.to_s)
|
113
119
|
row.each_with_index do |svalue, field_index|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
120
|
+
sql_type = table_info[field_index]['type']
|
121
|
+
field_name = table_info[field_index]['name']
|
122
|
+
@log.debug('field is ' << field_name << ', svalue is ' << svalue.to_s << ', type is ' << sql_type)
|
123
|
+
if(svalue && !svalue.to_s.empty?)
|
124
|
+
if( @date_fields.include?(field_name) )
|
125
|
+
conv_date = db.execute("select strftime('%Y%m%d %H%M%S', " << svalue.to_s << ", 'unixepoch')").join
|
126
|
+
@log.debug('conv_date is ' << conv_date)
|
127
|
+
dbt.write_string_attribute(record_no, field_index, conv_date)
|
128
|
+
elsif( @time_fields.include?(field_name) )
|
129
|
+
conv_time = db.execute("select strftime('%H%M%S', " << svalue.to_s << ", 'unixepoch')").join
|
130
|
+
@log.debug('conv_time is ' << conv_time)
|
131
|
+
dbt.write_string_attribute(record_no, field_index, conv_time)
|
132
|
+
|
133
|
+
else
|
134
|
+
ftype = tmap.detect{|key, value| sql_type.start_with?(key) }[1]
|
135
|
+
dbt.write_string_attribute(record_no, field_index, svalue ) if 0 == ftype
|
136
|
+
begin
|
137
|
+
dbt.write_integer_attribute(record_no, field_index, svalue) if 1 == ftype
|
138
|
+
dbt.write_double_attribute(record_no, field_index, svalue) if 2 == ftype
|
139
|
+
rescue RangeError => ex
|
140
|
+
@log.error(trl("ERROR! cannot write value of type %s" %sql_type) << ': ' << ex.message )
|
141
|
+
end
|
123
142
|
end
|
124
143
|
else
|
125
|
-
dbt.write_null_attribute(record_no, field_index) if (!svalue ||
|
144
|
+
dbt.write_null_attribute(record_no, field_index) if (!svalue || sql_type.empty?)
|
126
145
|
end
|
127
146
|
end
|
128
147
|
end
|
data/lib/translations
CHANGED
@@ -39,14 +39,32 @@ Specific options:
|
|
39
39
|
de: Spezielle Optionen
|
40
40
|
fr: Options spécifiques
|
41
41
|
|
42
|
+
#program argument --time
|
43
|
+
time [list]:
|
44
|
+
de: zeit [Liste]
|
45
|
+
fr: temps [liste]
|
46
|
+
|
47
|
+
A list of space-separated fields (table-columns) which shall be handled as timestamp values.:
|
48
|
+
de: Eine Liste von Feldern (Tabellenspalten), die als Zeitstempel behandelt werden sollen.
|
49
|
+
fr: Une liste de champs (colonnes), qui seront traités comme estampes chronologiques.
|
50
|
+
|
51
|
+
# program argument --dates
|
52
|
+
dates [list]:
|
53
|
+
de: daten [liste]
|
54
|
+
fr: dates [liste]
|
55
|
+
|
56
|
+
A list of space-separated fields (table-columns) which shall be handled as date-time values.:
|
57
|
+
de: Eine Liste von Feldern (Tabellenspalten), die als Datums/Zeit-Werte behandelt werden sollen.
|
58
|
+
fr: Une liste de champs (colonnes), qui seront traités comme dates et temps.
|
59
|
+
|
42
60
|
# program argument -s (source)
|
43
61
|
s:
|
44
62
|
de: q
|
45
63
|
fr: s
|
46
64
|
|
47
|
-
source
|
48
|
-
de: quelle
|
49
|
-
fr: source
|
65
|
+
source [FILE.sqlite]:
|
66
|
+
de: quelle [Datei.sqlite]
|
67
|
+
fr: source [Fichier.sqlite]
|
50
68
|
|
51
69
|
SQLite-file to read.:
|
52
70
|
de: SQLite Datei, die gelesen wird.
|
@@ -78,9 +96,9 @@ t:
|
|
78
96
|
de: z
|
79
97
|
fr: c
|
80
98
|
|
81
|
-
|
82
|
-
de:
|
83
|
-
fr: cible
|
99
|
+
target [FILE(0...n).dbf]:
|
100
|
+
de: ziel [Datei(0...n).dbf]
|
101
|
+
fr: cible dBase [Fichier(0...n).dbf]
|
84
102
|
|
85
103
|
Name for the dBase-files (1 per table) to be written.:
|
86
104
|
de: Name der dBase-Dateien (1 pro Tabelle), die geschrieben werden.
|
data/sqlite2dbf.gemspec
CHANGED
@@ -3,7 +3,7 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.name = $APPNAME
|
4
4
|
s.version = $VERSION
|
5
5
|
s.date = $DATE
|
6
|
-
s.summary = "
|
6
|
+
s.summary = "Parameter --dates added for a list of datetime and time fields, Blob as text"
|
7
7
|
s.description = "converts SQLite to DBase"
|
8
8
|
s.authors = $AUTHORS
|
9
9
|
s.email = $EMAIL
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqlite2dbf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Uplawski <michael.uplawski@uplawski.eu>
|
@@ -51,5 +51,5 @@ rubyforge_project:
|
|
51
51
|
rubygems_version: 2.6.7
|
52
52
|
signing_key:
|
53
53
|
specification_version: 4
|
54
|
-
summary:
|
54
|
+
summary: Parameter --dates added for a list of datetime and time fields, Blob as text
|
55
55
|
test_files: []
|