sqlite2dbf 0.2.3 → 0.2.5
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/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>
|