sqlite2dbf 0.2.3 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/doc/html/sqlite2dbf.html +455 -0
- data/doc/man/sqlite2dbf.1 +157 -0
- data/doc/pdf/sqlite2dbf.pdf +0 -0
- data/doc/rst/sqlite2dbf.rst +107 -0
- data/lib/argparser.rb +3 -3
- data/lib/config +3 -3
- data/lib/configuration.rb +11 -4
- data/lib/constants.rb +25 -3
- data/lib/log.conf +1 -1
- data/lib/mapping.rb +6 -3
- data/lib/sqlite2dbf.rb +8 -4
- data/lib/translating.rb +4 -1
- data/sqlite2dbf.gemspec +2 -2
- metadata +7 -5
- data/man/sqlite2dbf.1 +0 -245
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 338fe75d81aa22633648e9005b9ad262a06bde71
|
4
|
+
data.tar.gz: 78d126d3a85a9ffe72ec7436c207aec4c1f94c0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce3e77e74de5e59efed84500ce4240ecb2d6315bb6dbe6a5688cf4ee337252e741f35be9adcc319fd229feacc6656e59a64492e4afb9cd402d50a28c4aa1bb7f
|
7
|
+
data.tar.gz: b09a42e729f994f60b02edf73a39f40c7e556c5080ae38e5b57f5870580765953198e921d9599c848b823c76e8a984f1c5c803bf53b5592d5b43b8dc0edee652
|
@@ -0,0 +1,455 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
6
|
+
<meta name="generator" content="Docutils 0.13.1: http://docutils.sourceforge.net/" />
|
7
|
+
<title>Sqlite2dbf</title>
|
8
|
+
<style type="text/css">
|
9
|
+
|
10
|
+
/*
|
11
|
+
:Author: David Goodger (goodger@python.org)
|
12
|
+
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
13
|
+
:Copyright: This stylesheet has been placed in the public domain.
|
14
|
+
|
15
|
+
Default cascading style sheet for the HTML output of Docutils.
|
16
|
+
|
17
|
+
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
18
|
+
customize this style sheet.
|
19
|
+
*/
|
20
|
+
|
21
|
+
/* used to remove borders from tables and images */
|
22
|
+
.borderless, table.borderless td, table.borderless th {
|
23
|
+
border: 0 }
|
24
|
+
|
25
|
+
table.borderless td, table.borderless th {
|
26
|
+
/* Override padding for "table.docutils td" with "! important".
|
27
|
+
The right padding separates the table cells. */
|
28
|
+
padding: 0 0.5em 0 0 ! important }
|
29
|
+
|
30
|
+
.first {
|
31
|
+
/* Override more specific margin styles with "! important". */
|
32
|
+
margin-top: 0 ! important }
|
33
|
+
|
34
|
+
.last, .with-subtitle {
|
35
|
+
margin-bottom: 0 ! important }
|
36
|
+
|
37
|
+
.hidden {
|
38
|
+
display: none }
|
39
|
+
|
40
|
+
.subscript {
|
41
|
+
vertical-align: sub;
|
42
|
+
font-size: smaller }
|
43
|
+
|
44
|
+
.superscript {
|
45
|
+
vertical-align: super;
|
46
|
+
font-size: smaller }
|
47
|
+
|
48
|
+
a.toc-backref {
|
49
|
+
text-decoration: none ;
|
50
|
+
color: black }
|
51
|
+
|
52
|
+
blockquote.epigraph {
|
53
|
+
margin: 2em 5em ; }
|
54
|
+
|
55
|
+
dl.docutils dd {
|
56
|
+
margin-bottom: 0.5em }
|
57
|
+
|
58
|
+
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
59
|
+
overflow: hidden;
|
60
|
+
}
|
61
|
+
|
62
|
+
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
63
|
+
dl.docutils dt {
|
64
|
+
font-weight: bold }
|
65
|
+
*/
|
66
|
+
|
67
|
+
div.abstract {
|
68
|
+
margin: 2em 5em }
|
69
|
+
|
70
|
+
div.abstract p.topic-title {
|
71
|
+
font-weight: bold ;
|
72
|
+
text-align: center }
|
73
|
+
|
74
|
+
div.admonition, div.attention, div.caution, div.danger, div.error,
|
75
|
+
div.hint, div.important, div.note, div.tip, div.warning {
|
76
|
+
margin: 2em ;
|
77
|
+
border: medium outset ;
|
78
|
+
padding: 1em }
|
79
|
+
|
80
|
+
div.admonition p.admonition-title, div.hint p.admonition-title,
|
81
|
+
div.important p.admonition-title, div.note p.admonition-title,
|
82
|
+
div.tip p.admonition-title {
|
83
|
+
font-weight: bold ;
|
84
|
+
font-family: sans-serif }
|
85
|
+
|
86
|
+
div.attention p.admonition-title, div.caution p.admonition-title,
|
87
|
+
div.danger p.admonition-title, div.error p.admonition-title,
|
88
|
+
div.warning p.admonition-title, .code .error {
|
89
|
+
color: red ;
|
90
|
+
font-weight: bold ;
|
91
|
+
font-family: sans-serif }
|
92
|
+
|
93
|
+
/* Uncomment (and remove this text!) to get reduced vertical space in
|
94
|
+
compound paragraphs.
|
95
|
+
div.compound .compound-first, div.compound .compound-middle {
|
96
|
+
margin-bottom: 0.5em }
|
97
|
+
|
98
|
+
div.compound .compound-last, div.compound .compound-middle {
|
99
|
+
margin-top: 0.5em }
|
100
|
+
*/
|
101
|
+
|
102
|
+
div.dedication {
|
103
|
+
margin: 2em 5em ;
|
104
|
+
text-align: center ;
|
105
|
+
font-style: italic }
|
106
|
+
|
107
|
+
div.dedication p.topic-title {
|
108
|
+
font-weight: bold ;
|
109
|
+
font-style: normal }
|
110
|
+
|
111
|
+
div.figure {
|
112
|
+
margin-left: 2em ;
|
113
|
+
margin-right: 2em }
|
114
|
+
|
115
|
+
div.footer, div.header {
|
116
|
+
clear: both;
|
117
|
+
font-size: smaller }
|
118
|
+
|
119
|
+
div.line-block {
|
120
|
+
display: block ;
|
121
|
+
margin-top: 1em ;
|
122
|
+
margin-bottom: 1em }
|
123
|
+
|
124
|
+
div.line-block div.line-block {
|
125
|
+
margin-top: 0 ;
|
126
|
+
margin-bottom: 0 ;
|
127
|
+
margin-left: 1.5em }
|
128
|
+
|
129
|
+
div.sidebar {
|
130
|
+
margin: 0 0 0.5em 1em ;
|
131
|
+
border: medium outset ;
|
132
|
+
padding: 1em ;
|
133
|
+
background-color: #ffffee ;
|
134
|
+
width: 40% ;
|
135
|
+
float: right ;
|
136
|
+
clear: right }
|
137
|
+
|
138
|
+
div.sidebar p.rubric {
|
139
|
+
font-family: sans-serif ;
|
140
|
+
font-size: medium }
|
141
|
+
|
142
|
+
div.system-messages {
|
143
|
+
margin: 5em }
|
144
|
+
|
145
|
+
div.system-messages h1 {
|
146
|
+
color: red }
|
147
|
+
|
148
|
+
div.system-message {
|
149
|
+
border: medium outset ;
|
150
|
+
padding: 1em }
|
151
|
+
|
152
|
+
div.system-message p.system-message-title {
|
153
|
+
color: red ;
|
154
|
+
font-weight: bold }
|
155
|
+
|
156
|
+
div.topic {
|
157
|
+
margin: 2em }
|
158
|
+
|
159
|
+
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
160
|
+
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
161
|
+
margin-top: 0.4em }
|
162
|
+
|
163
|
+
h1.title {
|
164
|
+
text-align: center }
|
165
|
+
|
166
|
+
h2.subtitle {
|
167
|
+
text-align: center }
|
168
|
+
|
169
|
+
hr.docutils {
|
170
|
+
width: 75% }
|
171
|
+
|
172
|
+
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
173
|
+
clear: left ;
|
174
|
+
float: left ;
|
175
|
+
margin-right: 1em }
|
176
|
+
|
177
|
+
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
178
|
+
clear: right ;
|
179
|
+
float: right ;
|
180
|
+
margin-left: 1em }
|
181
|
+
|
182
|
+
img.align-center, .figure.align-center, object.align-center {
|
183
|
+
display: block;
|
184
|
+
margin-left: auto;
|
185
|
+
margin-right: auto;
|
186
|
+
}
|
187
|
+
|
188
|
+
table.align-center {
|
189
|
+
margin-left: auto;
|
190
|
+
margin-right: auto;
|
191
|
+
}
|
192
|
+
|
193
|
+
.align-left {
|
194
|
+
text-align: left }
|
195
|
+
|
196
|
+
.align-center {
|
197
|
+
clear: both ;
|
198
|
+
text-align: center }
|
199
|
+
|
200
|
+
.align-right {
|
201
|
+
text-align: right }
|
202
|
+
|
203
|
+
/* reset inner alignment in figures */
|
204
|
+
div.align-right {
|
205
|
+
text-align: inherit }
|
206
|
+
|
207
|
+
/* div.align-center * { */
|
208
|
+
/* text-align: left } */
|
209
|
+
|
210
|
+
.align-top {
|
211
|
+
vertical-align: top }
|
212
|
+
|
213
|
+
.align-middle {
|
214
|
+
vertical-align: middle }
|
215
|
+
|
216
|
+
.align-bottom {
|
217
|
+
vertical-align: bottom }
|
218
|
+
|
219
|
+
ol.simple, ul.simple {
|
220
|
+
margin-bottom: 1em }
|
221
|
+
|
222
|
+
ol.arabic {
|
223
|
+
list-style: decimal }
|
224
|
+
|
225
|
+
ol.loweralpha {
|
226
|
+
list-style: lower-alpha }
|
227
|
+
|
228
|
+
ol.upperalpha {
|
229
|
+
list-style: upper-alpha }
|
230
|
+
|
231
|
+
ol.lowerroman {
|
232
|
+
list-style: lower-roman }
|
233
|
+
|
234
|
+
ol.upperroman {
|
235
|
+
list-style: upper-roman }
|
236
|
+
|
237
|
+
p.attribution {
|
238
|
+
text-align: right ;
|
239
|
+
margin-left: 50% }
|
240
|
+
|
241
|
+
p.caption {
|
242
|
+
font-style: italic }
|
243
|
+
|
244
|
+
p.credits {
|
245
|
+
font-style: italic ;
|
246
|
+
font-size: smaller }
|
247
|
+
|
248
|
+
p.label {
|
249
|
+
white-space: nowrap }
|
250
|
+
|
251
|
+
p.rubric {
|
252
|
+
font-weight: bold ;
|
253
|
+
font-size: larger ;
|
254
|
+
color: maroon ;
|
255
|
+
text-align: center }
|
256
|
+
|
257
|
+
p.sidebar-title {
|
258
|
+
font-family: sans-serif ;
|
259
|
+
font-weight: bold ;
|
260
|
+
font-size: larger }
|
261
|
+
|
262
|
+
p.sidebar-subtitle {
|
263
|
+
font-family: sans-serif ;
|
264
|
+
font-weight: bold }
|
265
|
+
|
266
|
+
p.topic-title {
|
267
|
+
font-weight: bold }
|
268
|
+
|
269
|
+
pre.address {
|
270
|
+
margin-bottom: 0 ;
|
271
|
+
margin-top: 0 ;
|
272
|
+
font: inherit }
|
273
|
+
|
274
|
+
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
275
|
+
margin-left: 2em ;
|
276
|
+
margin-right: 2em }
|
277
|
+
|
278
|
+
pre.code .ln { color: grey; } /* line numbers */
|
279
|
+
pre.code, code { background-color: #eeeeee }
|
280
|
+
pre.code .comment, code .comment { color: #5C6576 }
|
281
|
+
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
282
|
+
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
283
|
+
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
284
|
+
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
285
|
+
pre.code .inserted, code .inserted { background-color: #A3D289}
|
286
|
+
|
287
|
+
span.classifier {
|
288
|
+
font-family: sans-serif ;
|
289
|
+
font-style: oblique }
|
290
|
+
|
291
|
+
span.classifier-delimiter {
|
292
|
+
font-family: sans-serif ;
|
293
|
+
font-weight: bold }
|
294
|
+
|
295
|
+
span.interpreted {
|
296
|
+
font-family: sans-serif }
|
297
|
+
|
298
|
+
span.option {
|
299
|
+
white-space: nowrap }
|
300
|
+
|
301
|
+
span.pre {
|
302
|
+
white-space: pre }
|
303
|
+
|
304
|
+
span.problematic {
|
305
|
+
color: red }
|
306
|
+
|
307
|
+
span.section-subtitle {
|
308
|
+
/* font-size relative to parent (h1..h6 element) */
|
309
|
+
font-size: 80% }
|
310
|
+
|
311
|
+
table.citation {
|
312
|
+
border-left: solid 1px gray;
|
313
|
+
margin-left: 1px }
|
314
|
+
|
315
|
+
table.docinfo {
|
316
|
+
margin: 2em 4em }
|
317
|
+
|
318
|
+
table.docutils {
|
319
|
+
margin-top: 0.5em ;
|
320
|
+
margin-bottom: 0.5em }
|
321
|
+
|
322
|
+
table.footnote {
|
323
|
+
border-left: solid 1px black;
|
324
|
+
margin-left: 1px }
|
325
|
+
|
326
|
+
table.docutils td, table.docutils th,
|
327
|
+
table.docinfo td, table.docinfo th {
|
328
|
+
padding-left: 0.5em ;
|
329
|
+
padding-right: 0.5em ;
|
330
|
+
vertical-align: top }
|
331
|
+
|
332
|
+
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
333
|
+
font-weight: bold ;
|
334
|
+
text-align: left ;
|
335
|
+
white-space: nowrap ;
|
336
|
+
padding-left: 0 }
|
337
|
+
|
338
|
+
/* "booktabs" style (no vertical lines) */
|
339
|
+
table.docutils.booktabs {
|
340
|
+
border: 0px;
|
341
|
+
border-top: 2px solid;
|
342
|
+
border-bottom: 2px solid;
|
343
|
+
border-collapse: collapse;
|
344
|
+
}
|
345
|
+
table.docutils.booktabs * {
|
346
|
+
border: 0px;
|
347
|
+
}
|
348
|
+
table.docutils.booktabs th {
|
349
|
+
border-bottom: thin solid;
|
350
|
+
text-align: left;
|
351
|
+
}
|
352
|
+
|
353
|
+
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
354
|
+
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
355
|
+
font-size: 100% }
|
356
|
+
|
357
|
+
ul.auto-toc {
|
358
|
+
list-style-type: none }
|
359
|
+
|
360
|
+
</style>
|
361
|
+
</head>
|
362
|
+
<body>
|
363
|
+
<div class="document" id="sqlite2dbf">
|
364
|
+
<h1 class="title">SQLite2DBF</h1>
|
365
|
+
<h2 class="subtitle" id="convert-an-sqlite-database-table-to-foxbase-dbase">convert an sqlite database-table to FoxBase (dBase)</h2>
|
366
|
+
|
367
|
+
<div class="section" id="synopsis">
|
368
|
+
<h1>SYNOPSIS</h1>
|
369
|
+
<blockquote>
|
370
|
+
<strong>sqlite2dbf -s [SQLite-file] [options]</strong></blockquote>
|
371
|
+
<p>or</p>
|
372
|
+
<blockquote>
|
373
|
+
<strong>sqlite2dbf [Common options]</strong></blockquote>
|
374
|
+
</div>
|
375
|
+
<div class="section" id="description">
|
376
|
+
<h1>DESCRIPTION</h1>
|
377
|
+
<p>You can use a variety of graphical user interfaces, notably those which support
|
378
|
+
the SQL language, to create and maintain SQLite databases. The same is no
|
379
|
+
longer true for dBase, a database format which is considered outdated,
|
380
|
+
nowadays. However, the file-format is still in use in some contexts.</p>
|
381
|
+
<p>With sqlite2dbf you can convert one table at a time from an SQLite database
|
382
|
+
into a dbf-file (in FoxBase format) and so benefit from the available
|
383
|
+
GUI-interfaces, without risking incompatibilities, where a dBase-file is
|
384
|
+
needed.</p>
|
385
|
+
</div>
|
386
|
+
<div class="section" id="options">
|
387
|
+
<h1>OPTIONS</h1>
|
388
|
+
<p><strong>-s, --source</strong> [PATH] SQLite-file to read.</p>
|
389
|
+
<p><strong>-c, --config</strong> [PATH] Configuration file for this transformation</p>
|
390
|
+
<p><strong>-n, --name</strong> [TABLE] The name of the table from the SQLite-database to convert</p>
|
391
|
+
<p><strong>-t, --target</strong> [PATH] Path to the dBase-file to be written.</p>
|
392
|
+
<p><strong>-l, --list</strong> Show the list of available tables and exit</p>
|
393
|
+
<p><strong>-o, --out</strong> [PATH] Use the table-name as file-name for the DBF-result, store output in PATH</p>
|
394
|
+
<p><strong>--time</strong> [list] Fields (table-columns) which shall be handled as timestamp values.</p>
|
395
|
+
<p><strong>--date</strong> [list] Fields (table-columns) which shall be handled as date-time values.</p>
|
396
|
+
<div class="section" id="common-options">
|
397
|
+
<h2>Common Options</h2>
|
398
|
+
<p><strong>-d, --debug</strong> Show debug-messages</p>
|
399
|
+
<p><strong>-h, --help</strong> Show this message</p>
|
400
|
+
<p><strong>-v, --version</strong> Show version and program information</p>
|
401
|
+
</div>
|
402
|
+
</div>
|
403
|
+
<div class="section" id="examples">
|
404
|
+
<h1>EXAMPLES</h1>
|
405
|
+
<p>List available tables in a SQLite database:</p>
|
406
|
+
<blockquote>
|
407
|
+
sqlite2dbf --list -s database.sqlite</blockquote>
|
408
|
+
<p>Transform a table from the database to dBase, the resulting file will be named after the table:</p>
|
409
|
+
<blockquote>
|
410
|
+
sqlite2dbf -s database.sqlite --name table</blockquote>
|
411
|
+
<p>Transform a table from the database to dBase, write the result to the target-file:</p>
|
412
|
+
<blockquote>
|
413
|
+
sqlite2dbf -s database.sqlite --name table -t /directory/file.dbf</blockquote>
|
414
|
+
<p>Transform a table from the database to dBase, put the result in a named directory:</p>
|
415
|
+
<blockquote>
|
416
|
+
sqlite2dbf -s database.sqlite --name table -o /directory</blockquote>
|
417
|
+
<p>Transform a table from the database to dBase, handle the named fields as dates:</p>
|
418
|
+
<blockquote>
|
419
|
+
sqlite2dbf -s database.sqlite --name table --date "expired last_accessed"</blockquote>
|
420
|
+
<p>As before but be verbose:</p>
|
421
|
+
<blockquote>
|
422
|
+
sqlite2dbf -s database.sqlite --name table --date "expired last_accessed" -d</blockquote>
|
423
|
+
<p>Use a user-defined configuration from config.txt for this transformation:</p>
|
424
|
+
<blockquote>
|
425
|
+
sqlite2dbf -c /home/user/sqlite2dbf_config.txt</blockquote>
|
426
|
+
<p>As before but overwrite the path to the source-file:</p>
|
427
|
+
<blockquote>
|
428
|
+
sqlite2dbf -c /home/user/sqlite2dbf_config.txt --source base.sqlite</blockquote>
|
429
|
+
</div>
|
430
|
+
<div class="section" id="errors-and-warnings">
|
431
|
+
<h1>ERRORS and WARNINGS</h1>
|
432
|
+
<p>sqlite2dbf does not return error-codes but writes errors and warnings to
|
433
|
+
STDOUT. This mainly concerns cases, where a data-type from the SQLite-database
|
434
|
+
cannot be converted for use in the dBase-file, probably when date- and/or
|
435
|
+
time-fields are listed on the command-line. Please contact the author, if these
|
436
|
+
issues seriously obstruct your work with sqlite2dbf. The converter should in
|
437
|
+
any way create a useable dBase-file.</p>
|
438
|
+
</div>
|
439
|
+
<div class="section" id="source-code-and-development">
|
440
|
+
<h1>SOURCE CODE and DEVELOPMENT</h1>
|
441
|
+
<p>sqlite2dbf is developed in Ruby and can be installed as a Ruby-Gem. As Ruby is
|
442
|
+
an interpreter-language, the source-code of the installed version is always
|
443
|
+
accessible. You can also decompress the gem-file to take a look at the code.</p>
|
444
|
+
<table class="docutils field-list" frame="void" rules="none">
|
445
|
+
<col class="field-name" />
|
446
|
+
<col class="field-body" />
|
447
|
+
<tbody valign="top">
|
448
|
+
<tr class="field"><th class="field-name">AUTHOR:</th><td class="field-body">Michael Uplawski <michael[dot]uplawski[at]uplawski[dot]eu></td>
|
449
|
+
</tr>
|
450
|
+
</tbody>
|
451
|
+
</table>
|
452
|
+
</div>
|
453
|
+
</div>
|
454
|
+
</body>
|
455
|
+
</html>
|
@@ -0,0 +1,157 @@
|
|
1
|
+
.\" Man page generated from reStructuredText.
|
2
|
+
.
|
3
|
+
.TH SQLITE2DBF "1" "Sun 14 May 2017" "0.2.5" "User Commands"
|
4
|
+
.SH NAME
|
5
|
+
SQLite2DBF \- convert an sqlite database-table to FoxBase (dBase)
|
6
|
+
.
|
7
|
+
.nr rst2man-indent-level 0
|
8
|
+
.
|
9
|
+
.de1 rstReportMargin
|
10
|
+
\\$1 \\n[an-margin]
|
11
|
+
level \\n[rst2man-indent-level]
|
12
|
+
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
13
|
+
-
|
14
|
+
\\n[rst2man-indent0]
|
15
|
+
\\n[rst2man-indent1]
|
16
|
+
\\n[rst2man-indent2]
|
17
|
+
..
|
18
|
+
.de1 INDENT
|
19
|
+
.\" .rstReportMargin pre:
|
20
|
+
. RS \\$1
|
21
|
+
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
|
22
|
+
. nr rst2man-indent-level +1
|
23
|
+
.\" .rstReportMargin post:
|
24
|
+
..
|
25
|
+
.de UNINDENT
|
26
|
+
. RE
|
27
|
+
.\" indent \\n[an-margin]
|
28
|
+
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
29
|
+
.nr rst2man-indent-level -1
|
30
|
+
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
31
|
+
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
32
|
+
..
|
33
|
+
.SH SYNOPSIS
|
34
|
+
.INDENT 0.0
|
35
|
+
.INDENT 3.5
|
36
|
+
\fBsqlite2dbf \-s [SQLite\-file] [options]\fP
|
37
|
+
.UNINDENT
|
38
|
+
.UNINDENT
|
39
|
+
.sp
|
40
|
+
or
|
41
|
+
.INDENT 0.0
|
42
|
+
.INDENT 3.5
|
43
|
+
\fBsqlite2dbf [Common options]\fP
|
44
|
+
.UNINDENT
|
45
|
+
.UNINDENT
|
46
|
+
.SH DESCRIPTION
|
47
|
+
.sp
|
48
|
+
You can use a variety of graphical user interfaces, notably those which support
|
49
|
+
the SQL language, to create and maintain SQLite databases. The same is no
|
50
|
+
longer true for dBase, a database format which is considered outdated,
|
51
|
+
nowadays. However, the file\-format is still in use in some contexts.
|
52
|
+
.sp
|
53
|
+
With sqlite2dbf you can convert one table at a time from an SQLite database
|
54
|
+
into a dbf\-file (in FoxBase format) and so benefit from the available
|
55
|
+
GUI\-interfaces, without risking incompatibilities, where a dBase\-file is
|
56
|
+
needed.
|
57
|
+
.SH OPTIONS
|
58
|
+
.sp
|
59
|
+
\fB\-s, \-\-source\fP [PATH] SQLite\-file to read.
|
60
|
+
.sp
|
61
|
+
\fB\-c, \-\-config\fP [PATH] Configuration file for this transformation
|
62
|
+
.sp
|
63
|
+
\fB\-n, \-\-name\fP [TABLE] The name of the table from the SQLite\-database to convert
|
64
|
+
.sp
|
65
|
+
\fB\-t, \-\-target\fP [PATH] Path to the dBase\-file to be written.
|
66
|
+
.sp
|
67
|
+
\fB\-l, \-\-list\fP Show the list of available tables and exit
|
68
|
+
.sp
|
69
|
+
\fB\-o, \-\-out\fP [PATH] Use the table\-name as file\-name for the DBF\-result, store output in PATH
|
70
|
+
.sp
|
71
|
+
\fB\-\-time\fP [list] Fields (table\-columns) which shall be handled as timestamp values.
|
72
|
+
.sp
|
73
|
+
\fB\-\-date\fP [list] Fields (table\-columns) which shall be handled as date\-time values.
|
74
|
+
.SS Common Options
|
75
|
+
.sp
|
76
|
+
\fB\-d, \-\-debug\fP Show debug\-messages
|
77
|
+
.sp
|
78
|
+
\fB\-h, \-\-help\fP Show this message
|
79
|
+
.sp
|
80
|
+
\fB\-v, \-\-version\fP Show version and program information
|
81
|
+
.SH EXAMPLES
|
82
|
+
.sp
|
83
|
+
List available tables in a SQLite database:
|
84
|
+
.INDENT 0.0
|
85
|
+
.INDENT 3.5
|
86
|
+
sqlite2dbf \-\-list \-s database.sqlite
|
87
|
+
.UNINDENT
|
88
|
+
.UNINDENT
|
89
|
+
.sp
|
90
|
+
Transform a table from the database to dBase, the resulting file will be named after the table:
|
91
|
+
.INDENT 0.0
|
92
|
+
.INDENT 3.5
|
93
|
+
sqlite2dbf \-s database.sqlite \-\-name table
|
94
|
+
.UNINDENT
|
95
|
+
.UNINDENT
|
96
|
+
.sp
|
97
|
+
Transform a table from the database to dBase, write the result to the target\-file:
|
98
|
+
.INDENT 0.0
|
99
|
+
.INDENT 3.5
|
100
|
+
sqlite2dbf \-s database.sqlite \-\-name table \-t /directory/file.dbf
|
101
|
+
.UNINDENT
|
102
|
+
.UNINDENT
|
103
|
+
.sp
|
104
|
+
Transform a table from the database to dBase, put the result in a named directory:
|
105
|
+
.INDENT 0.0
|
106
|
+
.INDENT 3.5
|
107
|
+
sqlite2dbf \-s database.sqlite \-\-name table \-o /directory
|
108
|
+
.UNINDENT
|
109
|
+
.UNINDENT
|
110
|
+
.sp
|
111
|
+
Transform a table from the database to dBase, handle the named fields as dates:
|
112
|
+
.INDENT 0.0
|
113
|
+
.INDENT 3.5
|
114
|
+
sqlite2dbf \-s database.sqlite \-\-name table \-\-date "expired last_accessed"
|
115
|
+
.UNINDENT
|
116
|
+
.UNINDENT
|
117
|
+
.sp
|
118
|
+
As before but be verbose:
|
119
|
+
.INDENT 0.0
|
120
|
+
.INDENT 3.5
|
121
|
+
sqlite2dbf \-s database.sqlite \-\-name table \-\-date "expired last_accessed" \-d
|
122
|
+
.UNINDENT
|
123
|
+
.UNINDENT
|
124
|
+
.sp
|
125
|
+
Use a user\-defined configuration from config.txt for this transformation:
|
126
|
+
.INDENT 0.0
|
127
|
+
.INDENT 3.5
|
128
|
+
sqlite2dbf \-c /home/user/sqlite2dbf_config.txt
|
129
|
+
.UNINDENT
|
130
|
+
.UNINDENT
|
131
|
+
.sp
|
132
|
+
As before but overwrite the path to the source\-file:
|
133
|
+
.INDENT 0.0
|
134
|
+
.INDENT 3.5
|
135
|
+
sqlite2dbf \-c /home/user/sqlite2dbf_config.txt \-\-source base.sqlite
|
136
|
+
.UNINDENT
|
137
|
+
.UNINDENT
|
138
|
+
.SH ERRORS AND WARNINGS
|
139
|
+
.sp
|
140
|
+
sqlite2dbf does not return error\-codes but writes errors and warnings to
|
141
|
+
STDOUT. This mainly concerns cases, where a data\-type from the SQLite\-database
|
142
|
+
cannot be converted for use in the dBase\-file, probably when date\- and/or
|
143
|
+
time\-fields are listed on the command\-line. Please contact the author, if these
|
144
|
+
issues seriously obstruct your work with sqlite2dbf. The converter should in
|
145
|
+
any way create a useable dBase\-file.
|
146
|
+
.SH SOURCE CODE AND DEVELOPMENT
|
147
|
+
.sp
|
148
|
+
sqlite2dbf is developed in Ruby and can be installed as a Ruby\-Gem. As Ruby is
|
149
|
+
an interpreter\-language, the source\-code of the installed version is always
|
150
|
+
accessible. You can also decompress the gem\-file to take a look at the code.
|
151
|
+
.INDENT 0.0
|
152
|
+
.TP
|
153
|
+
.B AUTHOR
|
154
|
+
Michael Uplawski <michael[dot]uplawski[at]uplawski[dot]eu>
|
155
|
+
.UNINDENT
|
156
|
+
.\" Generated by docutils manpage writer.
|
157
|
+
.
|
Binary file
|
@@ -0,0 +1,107 @@
|
|
1
|
+
==========================
|
2
|
+
SQLite2DBF
|
3
|
+
==========================
|
4
|
+
------------------------------------------------------------
|
5
|
+
convert an sqlite database-table to FoxBase (dBase)
|
6
|
+
------------------------------------------------------------
|
7
|
+
|
8
|
+
SYNOPSIS
|
9
|
+
=========
|
10
|
+
|
11
|
+
**sqlite2dbf -s [SQLite-file] [options]**
|
12
|
+
|
13
|
+
or
|
14
|
+
|
15
|
+
**sqlite2dbf [Common options]**
|
16
|
+
|
17
|
+
DESCRIPTION
|
18
|
+
============
|
19
|
+
|
20
|
+
You can use a variety of graphical user interfaces, notably those which support
|
21
|
+
the SQL language, to create and maintain SQLite databases. The same is no
|
22
|
+
longer true for dBase, a database format which is considered outdated,
|
23
|
+
nowadays. However, the file-format is still in use in some contexts.
|
24
|
+
|
25
|
+
With sqlite2dbf you can convert one table at a time from an SQLite database
|
26
|
+
into a dbf-file (in FoxBase format) and so benefit from the available
|
27
|
+
GUI-interfaces, without risking incompatibilities, where a dBase-file is
|
28
|
+
needed.
|
29
|
+
|
30
|
+
OPTIONS
|
31
|
+
============================
|
32
|
+
**-s, --source** [PATH] SQLite-file to read.
|
33
|
+
|
34
|
+
**-c, --config** [PATH] Configuration file for this transformation
|
35
|
+
|
36
|
+
**-n, --name** [TABLE] The name of the table from the SQLite-database to convert
|
37
|
+
|
38
|
+
**-t, --target** [PATH] Path to the dBase-file to be written.
|
39
|
+
|
40
|
+
**-l, --list** Show the list of available tables and exit
|
41
|
+
|
42
|
+
**-o, --out** [PATH] Use the table-name as file-name for the DBF-result, store output in PATH
|
43
|
+
|
44
|
+
**--time** [list] Fields (table-columns) which shall be handled as timestamp values.
|
45
|
+
|
46
|
+
**--date** [list] Fields (table-columns) which shall be handled as date-time values.
|
47
|
+
|
48
|
+
Common Options
|
49
|
+
----------------
|
50
|
+
|
51
|
+
**-d, --debug** Show debug-messages
|
52
|
+
|
53
|
+
**-h, --help** Show this message
|
54
|
+
|
55
|
+
**-v, --version** Show version and program information
|
56
|
+
|
57
|
+
EXAMPLES
|
58
|
+
============================
|
59
|
+
List available tables in a SQLite database:
|
60
|
+
|
61
|
+
sqlite2dbf --list -s database.sqlite
|
62
|
+
|
63
|
+
Transform a table from the database to dBase, the resulting file will be named after the table:
|
64
|
+
|
65
|
+
sqlite2dbf -s database.sqlite --name table
|
66
|
+
|
67
|
+
Transform a table from the database to dBase, write the result to the target-file:
|
68
|
+
|
69
|
+
sqlite2dbf -s database.sqlite --name table -t /directory/file.dbf
|
70
|
+
|
71
|
+
Transform a table from the database to dBase, put the result in a named directory:
|
72
|
+
|
73
|
+
sqlite2dbf -s database.sqlite --name table -o /directory
|
74
|
+
|
75
|
+
Transform a table from the database to dBase, handle the named fields as dates:
|
76
|
+
|
77
|
+
sqlite2dbf -s database.sqlite --name table --date "expired last_accessed"
|
78
|
+
|
79
|
+
As before but be verbose:
|
80
|
+
|
81
|
+
sqlite2dbf -s database.sqlite --name table --date "expired last_accessed" -d
|
82
|
+
|
83
|
+
Use a user-defined configuration from config.txt for this transformation:
|
84
|
+
|
85
|
+
sqlite2dbf -c /home/user/sqlite2dbf_config.txt
|
86
|
+
|
87
|
+
As before but overwrite the path to the source-file:
|
88
|
+
|
89
|
+
sqlite2dbf -c /home/user/sqlite2dbf_config.txt --source base.sqlite
|
90
|
+
|
91
|
+
ERRORS and WARNINGS
|
92
|
+
============================
|
93
|
+
sqlite2dbf does not return error-codes but writes errors and warnings to
|
94
|
+
STDOUT. This mainly concerns cases, where a data-type from the SQLite-database
|
95
|
+
cannot be converted for use in the dBase-file, probably when date- and/or
|
96
|
+
time-fields are listed on the command-line. Please contact the author, if these
|
97
|
+
issues seriously obstruct your work with sqlite2dbf. The converter should in
|
98
|
+
any way create a useable dBase-file.
|
99
|
+
|
100
|
+
SOURCE CODE and DEVELOPMENT
|
101
|
+
============================
|
102
|
+
sqlite2dbf is developed in Ruby and can be installed as a Ruby-Gem. As Ruby is
|
103
|
+
an interpreter-language, the source-code of the installed version is always
|
104
|
+
accessible. You can also decompress the gem-file to take a look at the code.
|
105
|
+
|
106
|
+
:AUTHOR: Michael Uplawski <michael[dot]uplawski[at]uplawski[dot]eu>
|
107
|
+
|
data/lib/argparser.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#encoding: UTF-8
|
2
2
|
=begin
|
3
3
|
/***************************************************************************
|
4
|
-
* ©2016 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
4
|
+
* ©2016-2017 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
5
5
|
* *
|
6
6
|
* This program is free software; you can redistribute it and/or modify *
|
7
7
|
* it under the terms of the GNU General Public License as published by *
|
@@ -29,7 +29,7 @@ require_relative 'translating'
|
|
29
29
|
require_relative 'constants'
|
30
30
|
|
31
31
|
class ArgParser
|
32
|
-
|
32
|
+
# Class level logger. This is a static class.
|
33
33
|
self.extend(Logging)
|
34
34
|
self.extend(Translating)
|
35
35
|
@@log = init_logger()
|
@@ -117,7 +117,7 @@ end
|
|
117
117
|
|
118
118
|
opts.on_tail(trl("-v"), trl("--version"), trl("Show version and program information") ) do
|
119
119
|
puts "\t#{$APPNAME}"
|
120
|
-
puts "\t© #{$YEARS},
|
120
|
+
puts "\t© #{$YEARS}, #{$AUTHORS.join(', ')}"
|
121
121
|
exit true
|
122
122
|
end
|
123
123
|
end
|
data/lib/config
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# ©2016-
|
2
|
+
# ©2016-2017, Michael Uplawski <michael.uplawski@souris-libre.fr>
|
3
3
|
# This program is free software; you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
5
5
|
# the Free Software Foundation; either version 3 of the License, or
|
@@ -48,7 +48,7 @@ save_what:
|
|
48
48
|
# Example: /data/my_database/customers.sqlite
|
49
49
|
# ./my_employers.sqlite
|
50
50
|
# F:\\Path_to_database\Products.db
|
51
|
-
# Default: empty (
|
51
|
+
# Default: empty (then REQUIRED on the command-line)
|
52
52
|
source:
|
53
53
|
|
54
54
|
# The name of the table, which is converted.
|
@@ -57,7 +57,7 @@ source:
|
|
57
57
|
# table in the SQLite-database
|
58
58
|
# Example: employees
|
59
59
|
# Price-list
|
60
|
-
# Default: empty (
|
60
|
+
# Default: empty (then REQUIRED on the command-line)
|
61
61
|
name:
|
62
62
|
|
63
63
|
# The target-file (dBase).
|
data/lib/configuration.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#encoding: UTF-8
|
2
2
|
=begin
|
3
3
|
/***************************************************************************
|
4
|
-
* ©2016 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
4
|
+
* ©2016-2017 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
5
5
|
* *
|
6
6
|
* This program is free software; you can redistribute it and/or modify *
|
7
7
|
* it under the terms of the GNU General Public License as published by *
|
@@ -28,16 +28,23 @@ require_relative 'translating'
|
|
28
28
|
|
29
29
|
class Configuration
|
30
30
|
include File_Checking
|
31
|
-
include Logging
|
32
31
|
include Singleton
|
33
32
|
include Translating
|
33
|
+
|
34
|
+
# class-level logger is not more useful in the singleton,
|
35
|
+
# than the object-level logger, but what the heg.
|
36
|
+
|
37
|
+
self.extend(Logging)
|
38
|
+
@@log = init_logger()
|
34
39
|
|
35
40
|
# default configuration file
|
36
41
|
@@config_file = File::dirname(__FILE__) << File::Separator << 'config'
|
37
42
|
|
38
43
|
# do initializations
|
39
44
|
def initialize()
|
40
|
-
|
45
|
+
# Use class-level logger for now.
|
46
|
+
# init_logger()
|
47
|
+
@log = @@log
|
41
48
|
end
|
42
49
|
|
43
50
|
# Configure with the command-line arguments.
|
@@ -59,7 +66,7 @@ class Configuration
|
|
59
66
|
@log.debug('config-file is ' << @@config_file)
|
60
67
|
# read defaults from configuration-file
|
61
68
|
co = OpenStruct.new(YAML::load_file(@@config_file))
|
62
|
-
# merge and overwrite with the
|
69
|
+
# merge and overwrite with the command-line arguments
|
63
70
|
@config = co.to_h.merge(options.to_h)
|
64
71
|
@log.debug('config is now: ' << @config.to_s )
|
65
72
|
verify
|
data/lib/constants.rb
CHANGED
@@ -1,9 +1,31 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
/***************************************************************************
|
4
|
+
* ©2016-2017 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
|
+
|
1
23
|
$APPNAME = 'sqlite2dbf'
|
2
|
-
$VERSION = '0.2.
|
3
|
-
$DATE = '
|
24
|
+
$VERSION = '0.2.5'
|
25
|
+
$DATE = '2017-03-08'
|
4
26
|
$AUTHORS = ["Michael Uplawski <michael.uplawski@uplawski.eu>"]
|
5
27
|
$EMAIL = 'michael.uplawski@uplawski.eu'
|
6
28
|
$LICENSE = 'GPL-3.0'
|
7
29
|
|
8
|
-
$YEARS = '2016'
|
30
|
+
$YEARS = '2016 - 2017'
|
9
31
|
|
data/lib/log.conf
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#encoding: UTF-8
|
2
2
|
=begin
|
3
3
|
/***************************************************************************
|
4
|
-
* ©2013-
|
4
|
+
* ©2013-2017 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
5
5
|
* *
|
6
6
|
* This program is free software; you can redistribute it and/or modify *
|
7
7
|
* it under the terms of the GNU General Public License as published by *
|
data/lib/mapping.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#encoding: UTF-8
|
2
2
|
=begin
|
3
3
|
/***************************************************************************
|
4
|
-
* ©2016 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
4
|
+
* ©2016-2017 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
5
5
|
* *
|
6
6
|
* This program is free software; you can redistribute it and/or modify *
|
7
7
|
* it under the terms of the GNU General Public License as published by *
|
@@ -29,7 +29,8 @@
|
|
29
29
|
# in the future, make sense to preview several mapping-objects for the
|
30
30
|
# transformation of several tables in a row.
|
31
31
|
class Mapping
|
32
|
-
|
32
|
+
# Depending on the decisions for the future uses of this class,
|
33
|
+
# it might or might not be better to move the logger to class-level.
|
33
34
|
include Logging
|
34
35
|
|
35
36
|
@@TMap = {
|
@@ -52,9 +53,11 @@ class Mapping
|
|
52
53
|
}
|
53
54
|
|
54
55
|
# Constructor
|
55
|
-
# Creates a mapping for the table of name config.name and
|
56
|
+
# Creates a mapping for the table of name config.name and based on the
|
56
57
|
# table_info.
|
57
58
|
def initialize config, table_info, content
|
59
|
+
# TODO: Veryfy the need for an object level logger. Move to class-level,
|
60
|
+
# when more than one object of this class can be created.
|
58
61
|
init_logger()
|
59
62
|
|
60
63
|
@table_name = config.name
|
data/lib/sqlite2dbf.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#encoding: UTF-8
|
2
2
|
=begin
|
3
3
|
/***************************************************************************
|
4
|
-
* ©2016 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
4
|
+
* ©2016-2017 Michael Uplawski <michael.uplawski@uplawski.eu> *
|
5
5
|
* *
|
6
6
|
* This program is free software; you can redistribute it and/or modify *
|
7
7
|
* it under the terms of the GNU General Public License as published by *
|
@@ -34,6 +34,7 @@ require_relative 'argparser'
|
|
34
34
|
=end
|
35
35
|
|
36
36
|
class SQLite2DBF
|
37
|
+
|
37
38
|
include Logging
|
38
39
|
include Translating
|
39
40
|
|
@@ -41,7 +42,7 @@ class SQLite2DBF
|
|
41
42
|
options = ArgParser::parse(args)
|
42
43
|
@config = Configuration.instance()
|
43
44
|
@config.set(options)
|
44
|
-
|
45
|
+
# Object level logger. “There can only be one!”
|
45
46
|
init_logger
|
46
47
|
level = (@config.debug ? Logger::DEBUG : @log.level)
|
47
48
|
@log.level = level
|
@@ -136,7 +137,7 @@ class SQLite2DBF
|
|
136
137
|
dbf_value = db.execute("select strftime('%s', " << value.to_s << ")").join if dbf_value.start_with?('-')
|
137
138
|
end
|
138
139
|
|
139
|
-
# create a time-
|
140
|
+
# create a time-value from value
|
140
141
|
def time(db, value)
|
141
142
|
db.execute("select strftime('%s', " << value.to_s << ", 'unixepoch')").join
|
142
143
|
end
|
@@ -166,9 +167,12 @@ class SQLite2DBF
|
|
166
167
|
|
167
168
|
if(svalue && !svalue.to_s.empty? && dbf_type)
|
168
169
|
svalue = date(db, svalue) if @date_fields.include?(field_name)
|
169
|
-
svalue =
|
170
|
+
svalue = time(db, svalue) if @time_fields.include?(field_name)
|
170
171
|
|
171
172
|
@log.debug('field is ' << field_name << ', svalue is ' << svalue.to_s << ', type is ' << dbf_type.to_s)
|
173
|
+
# This is Ruby. But if you do not like the verbosity
|
174
|
+
# remove the magic numbers and call them text, int and float or
|
175
|
+
# similar.
|
172
176
|
begin
|
173
177
|
case dbf_type
|
174
178
|
when 0
|
data/lib/translating.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#encoding: UTF-8
|
2
2
|
=begin
|
3
3
|
/***************************************************************************
|
4
|
-
* ©2011-
|
4
|
+
* ©2011-2017, Michael Uplawski *
|
5
5
|
* <michael.uplawski@uplawski.eu> *
|
6
6
|
* *
|
7
7
|
* This program is free software; you can redistribute it and/or modify *
|
@@ -34,6 +34,9 @@ require_relative 'logging'
|
|
34
34
|
Translations are read from a file "translations" in the program folder.
|
35
35
|
=end
|
36
36
|
module Translating
|
37
|
+
# Module-level logger. There is a static version of the translating
|
38
|
+
# function! Otherwise, the including objects should rather have their own
|
39
|
+
# loggers.
|
37
40
|
self.extend(Logging)
|
38
41
|
|
39
42
|
# intitialize class variabes (static attributes)
|
data/sqlite2dbf.gemspec
CHANGED
@@ -3,11 +3,11 @@ 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 = "Bug-fixes and cosmetics"
|
7
7
|
s.description = "converts SQLite to DBase"
|
8
8
|
s.authors = $AUTHORS
|
9
9
|
s.email = $EMAIL
|
10
|
-
s.files = %w~sqlite2dbf~.collect{|f| 'bin/' << f} + %w~constants.rb mapping.rb argparser.rb sqlite2dbf.rb file_checking.rb log.conf logging.rb mapping.rb configuration.rb config translating.rb translations ~.collect{|f| 'lib/' << f} + %w~sqlite2dbf.gemspec~.collect{|f|f} + %w~sqlite2dbf.1~.collect{|f| '
|
10
|
+
s.files = %w~sqlite2dbf~.collect{|f| 'bin/' << f} + %w~constants.rb mapping.rb argparser.rb sqlite2dbf.rb file_checking.rb log.conf logging.rb mapping.rb configuration.rb config translating.rb translations ~.collect{|f| 'lib/' << f} + %w~sqlite2dbf.gemspec~.collect{|f|f} + %w~man/sqlite2dbf.1 pdf/sqlite2dbf.pdf rst/sqlite2dbf.rst html/sqlite2dbf.html~.collect{|f| 'doc/' << f}
|
11
11
|
s.requirements = 'shp, sqlite3'
|
12
12
|
s.add_runtime_dependency 'shp', '~> 0.0', '>= 0.0.3'
|
13
13
|
s.add_runtime_dependency 'sqlite3', '~> 1.3', '>= 1.3.12'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqlite2dbf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Uplawski <michael.uplawski@uplawski.eu>
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shp
|
@@ -58,6 +58,10 @@ extensions: []
|
|
58
58
|
extra_rdoc_files: []
|
59
59
|
files:
|
60
60
|
- bin/sqlite2dbf
|
61
|
+
- doc/html/sqlite2dbf.html
|
62
|
+
- doc/man/sqlite2dbf.1
|
63
|
+
- doc/pdf/sqlite2dbf.pdf
|
64
|
+
- doc/rst/sqlite2dbf.rst
|
61
65
|
- lib/argparser.rb
|
62
66
|
- lib/config
|
63
67
|
- lib/configuration.rb
|
@@ -69,7 +73,6 @@ files:
|
|
69
73
|
- lib/sqlite2dbf.rb
|
70
74
|
- lib/translating.rb
|
71
75
|
- lib/translations
|
72
|
-
- man/sqlite2dbf.1
|
73
76
|
- sqlite2dbf.gemspec
|
74
77
|
homepage: https://rubygems.org/gems/sqlite2dbf
|
75
78
|
licenses:
|
@@ -95,6 +98,5 @@ rubyforge_project:
|
|
95
98
|
rubygems_version: 2.6.8
|
96
99
|
signing_key:
|
97
100
|
specification_version: 4
|
98
|
-
summary:
|
99
|
-
on the target system.
|
101
|
+
summary: Bug-fixes and cosmetics
|
100
102
|
test_files: []
|
data/man/sqlite2dbf.1
DELETED
@@ -1,245 +0,0 @@
|
|
1
|
-
.\" Automatically generated by Pod::Man 4.07 (Pod::Simple 3.32)
|
2
|
-
.\"
|
3
|
-
.\" Standard preamble:
|
4
|
-
.\" ========================================================================
|
5
|
-
.de Sp \" Vertical space (when we can't use .PP)
|
6
|
-
.if t .sp .5v
|
7
|
-
.if n .sp
|
8
|
-
..
|
9
|
-
.de Vb \" Begin verbatim text
|
10
|
-
.ft CW
|
11
|
-
.nf
|
12
|
-
.ne \\$1
|
13
|
-
..
|
14
|
-
.de Ve \" End verbatim text
|
15
|
-
.ft R
|
16
|
-
.fi
|
17
|
-
..
|
18
|
-
.\" Set up some character translations and predefined strings. \*(-- will
|
19
|
-
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
|
20
|
-
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
|
21
|
-
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
|
22
|
-
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
|
23
|
-
.\" nothing in troff, for use with C<>.
|
24
|
-
.tr \(*W-
|
25
|
-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
|
26
|
-
.ie n \{\
|
27
|
-
. ds -- \(*W-
|
28
|
-
. ds PI pi
|
29
|
-
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
|
30
|
-
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
|
31
|
-
. ds L" ""
|
32
|
-
. ds R" ""
|
33
|
-
. ds C` ""
|
34
|
-
. ds C' ""
|
35
|
-
'br\}
|
36
|
-
.el\{\
|
37
|
-
. ds -- \|\(em\|
|
38
|
-
. ds PI \(*p
|
39
|
-
. ds L" ``
|
40
|
-
. ds R" ''
|
41
|
-
. ds C`
|
42
|
-
. ds C'
|
43
|
-
'br\}
|
44
|
-
.\"
|
45
|
-
.\" Escape single quotes in literal strings from groff's Unicode transform.
|
46
|
-
.ie \n(.g .ds Aq \(aq
|
47
|
-
.el .ds Aq '
|
48
|
-
.\"
|
49
|
-
.\" If the F register is >0, we'll generate index entries on stderr for
|
50
|
-
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
|
51
|
-
.\" entries marked with X<> in POD. Of course, you'll have to process the
|
52
|
-
.\" output yourself in some meaningful fashion.
|
53
|
-
.\"
|
54
|
-
.\" Avoid warning from groff about undefined register 'F'.
|
55
|
-
.de IX
|
56
|
-
..
|
57
|
-
.if !\nF .nr F 0
|
58
|
-
.if \nF>0 \{\
|
59
|
-
. de IX
|
60
|
-
. tm Index:\\$1\t\\n%\t"\\$2"
|
61
|
-
..
|
62
|
-
. if !\nF==2 \{\
|
63
|
-
. nr % 0
|
64
|
-
. nr F 2
|
65
|
-
. \}
|
66
|
-
.\}
|
67
|
-
.\"
|
68
|
-
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
|
69
|
-
.\" Fear. Run. Save yourself. No user-serviceable parts.
|
70
|
-
. \" fudge factors for nroff and troff
|
71
|
-
.if n \{\
|
72
|
-
. ds #H 0
|
73
|
-
. ds #V .8m
|
74
|
-
. ds #F .3m
|
75
|
-
. ds #[ \f1
|
76
|
-
. ds #] \fP
|
77
|
-
.\}
|
78
|
-
.if t \{\
|
79
|
-
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
|
80
|
-
. ds #V .6m
|
81
|
-
. ds #F 0
|
82
|
-
. ds #[ \&
|
83
|
-
. ds #] \&
|
84
|
-
.\}
|
85
|
-
. \" simple accents for nroff and troff
|
86
|
-
.if n \{\
|
87
|
-
. ds ' \&
|
88
|
-
. ds ` \&
|
89
|
-
. ds ^ \&
|
90
|
-
. ds , \&
|
91
|
-
. ds ~ ~
|
92
|
-
. ds /
|
93
|
-
.\}
|
94
|
-
.if t \{\
|
95
|
-
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
|
96
|
-
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
|
97
|
-
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
|
98
|
-
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
|
99
|
-
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
|
100
|
-
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
|
101
|
-
.\}
|
102
|
-
. \" troff and (daisy-wheel) nroff accents
|
103
|
-
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
|
104
|
-
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
|
105
|
-
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
|
106
|
-
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
|
107
|
-
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
|
108
|
-
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
|
109
|
-
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
|
110
|
-
.ds ae a\h'-(\w'a'u*4/10)'e
|
111
|
-
.ds Ae A\h'-(\w'A'u*4/10)'E
|
112
|
-
. \" corrections for vroff
|
113
|
-
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
|
114
|
-
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
|
115
|
-
. \" for low resolution devices (crt and lpr)
|
116
|
-
.if \n(.H>23 .if \n(.V>19 \
|
117
|
-
\{\
|
118
|
-
. ds : e
|
119
|
-
. ds 8 ss
|
120
|
-
. ds o a
|
121
|
-
. ds d- d\h'-1'\(ga
|
122
|
-
. ds D- D\h'-1'\(hy
|
123
|
-
. ds th \o'bp'
|
124
|
-
. ds Th \o'LP'
|
125
|
-
. ds ae ae
|
126
|
-
. ds Ae AE
|
127
|
-
.\}
|
128
|
-
.rm #[ #] #H #V #F C
|
129
|
-
.\" ========================================================================
|
130
|
-
.\"
|
131
|
-
.IX Title "SQLITE2DBF 1"
|
132
|
-
.TH SQLITE2DBF 1 "2016-12-24" "perl v5.24.1" "sqlite2dbf conversion utility"
|
133
|
-
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
134
|
-
.\" way too many mistakes in technical documents.
|
135
|
-
.if n .ad l
|
136
|
-
.nh
|
137
|
-
.SH "NAME"
|
138
|
-
sqlite2dbf \- convert an sqlite database\-table to FoxBase (dBase)
|
139
|
-
.SH "SYNOPSIS"
|
140
|
-
.IX Header "SYNOPSIS"
|
141
|
-
\&\fB sqlite2dbf \-s [SQLite\-file] [options]\fR
|
142
|
-
.PP
|
143
|
-
or
|
144
|
-
.PP
|
145
|
-
\&\fB sqlite2dbf [Common options]\fR
|
146
|
-
.SH "DESCRIPTION"
|
147
|
-
.IX Header "DESCRIPTION"
|
148
|
-
You can use a variety of graphical user interfaces, notably those which support
|
149
|
-
the \s-1SQL\s0 language, to create and maintain SQLite databases. The same is no
|
150
|
-
longer true for dBase, a database format which is considered outdated,
|
151
|
-
nowadays. However, the file-format is still in use in some contexts.
|
152
|
-
.PP
|
153
|
-
With sqlite2dbf you can convert one table at a time from an SQLite database
|
154
|
-
into a dbf-file (in FoxBase format) and so benefit from the available
|
155
|
-
GUI-interfaces, without risking incompatibilities, where a dBase-file is
|
156
|
-
needed.
|
157
|
-
.SH "OPTIONS"
|
158
|
-
.IX Header "OPTIONS"
|
159
|
-
\&\fB\-s, \-\-source\fR [\s-1PATH\s0] SQLite-file to read.
|
160
|
-
.PP
|
161
|
-
\&\fB\-c, \-\-config\fR [\s-1PATH\s0] Configuration file for this transformation
|
162
|
-
.PP
|
163
|
-
\&\fB\-n, \-\-name\fR [\s-1TABLE\s0] The name of the table from the SQLite-database to convert
|
164
|
-
.PP
|
165
|
-
\&\fB\-t, \-\-target\fR [\s-1PATH\s0] Path to the dBase-file to be written.
|
166
|
-
.PP
|
167
|
-
\&\fB\-l, \-\-list\fR Show the list of available tables and exit
|
168
|
-
.PP
|
169
|
-
\&\fB\-o, \-\-out\fR [\s-1PATH\s0] Use the table-name as file-name for the DBF-result, store output in \s-1PATH\s0
|
170
|
-
.PP
|
171
|
-
\&\fB \-\-time\fR [list] Fields (table-columns) which shall be handled as timestamp values.
|
172
|
-
.PP
|
173
|
-
\&\fB \-\-date\fR [list] Fields (table-columns) which shall be handled as date-time values.
|
174
|
-
.SS "Common Options"
|
175
|
-
.IX Subsection "Common Options"
|
176
|
-
\&\fB\-d, \-\-debug\fR Show debug-messages
|
177
|
-
.PP
|
178
|
-
\&\fB\-h, \-\-help\fR Show this message
|
179
|
-
.PP
|
180
|
-
\&\fB\-v, \-\-version\fR Show version and program information
|
181
|
-
.SH "EXAMPLES"
|
182
|
-
.IX Header "EXAMPLES"
|
183
|
-
List available tables in a SQLite database:
|
184
|
-
.PP
|
185
|
-
.Vb 1
|
186
|
-
\& sqlite2dbf \-\-list \-s database.sqlite
|
187
|
-
.Ve
|
188
|
-
.PP
|
189
|
-
Transform a table from the database to dBase, the resulting file will be named after the table:
|
190
|
-
.PP
|
191
|
-
.Vb 1
|
192
|
-
\& sqlite2dbf \-s database.sqlite \-\-name table
|
193
|
-
.Ve
|
194
|
-
.PP
|
195
|
-
Transform a table from the database to dBase, write the result to the target-file:
|
196
|
-
.PP
|
197
|
-
.Vb 1
|
198
|
-
\& sqlite2dbf \-s database.sqlite \-\-name table \-t /directory/file.dbf
|
199
|
-
.Ve
|
200
|
-
.PP
|
201
|
-
Transform a table from the database to dBase, put the result in a named directory:
|
202
|
-
.PP
|
203
|
-
.Vb 1
|
204
|
-
\& sqlite2dbf \-s database.sqlite \-\-name table \-o /directory
|
205
|
-
.Ve
|
206
|
-
.PP
|
207
|
-
Transform a table from the database to dBase, handle the named fields as dates:
|
208
|
-
.PP
|
209
|
-
.Vb 1
|
210
|
-
\& sqlite2dbf \-s database.sqlite \-\-name table \-\-date "expired last_accessed"
|
211
|
-
.Ve
|
212
|
-
.PP
|
213
|
-
As before but be verbose:
|
214
|
-
.PP
|
215
|
-
.Vb 1
|
216
|
-
\& sqlite2dbf \-s database.sqlite \-\-name table \-\-date "expired last_accessed" \-d
|
217
|
-
.Ve
|
218
|
-
.PP
|
219
|
-
Use a user-defined configuration from config.txt for this transformation:
|
220
|
-
.PP
|
221
|
-
.Vb 1
|
222
|
-
\& sqlite2dbf \-c /home/user/sqlite2dbf_config.txt
|
223
|
-
.Ve
|
224
|
-
.PP
|
225
|
-
As before but overwrite the path to the source-file:
|
226
|
-
.PP
|
227
|
-
.Vb 1
|
228
|
-
\& sqlite2dbf \-c /home/user/sqlite2dbf_config.txt \-\-source base.sqlite
|
229
|
-
.Ve
|
230
|
-
.SH "ERRORS and WARNINGS"
|
231
|
-
.IX Header "ERRORS and WARNINGS"
|
232
|
-
sqlite2dbf does not return error-codes but writes errors and warnings to
|
233
|
-
\&\s-1STDOUT.\s0 This mainly concerns cases, where a data-type from the SQLite-database
|
234
|
-
cannot be converted for use in the dBase-file, probably when date\- and/or
|
235
|
-
time-fields are listed on the command-line. Please contact the author, if these
|
236
|
-
issues seriously obstruct your work with sqlite2dbf. The converter should in
|
237
|
-
any way create a useable dBase-file.
|
238
|
-
.SH "SOURCE and DEVELOPMENT"
|
239
|
-
.IX Header "SOURCE and DEVELOPMENT"
|
240
|
-
sqlite2dbf is developed in Ruby and can be installed as a Ruby-Gem. As Ruby is
|
241
|
-
an interpreter-language, the source-code of the installed version is always
|
242
|
-
accessible. You can also decompress the gem-file to take a look at the code.
|
243
|
-
.SH "AUTHOR"
|
244
|
-
.IX Header "AUTHOR"
|
245
|
-
Michael Uplawski <michael[dot]uplawski[at]uplawski[dot]eu>
|