dbf 4.1.1 → 4.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +67 -53
  5. data/Guardfile +1 -1
  6. data/LICENSE +1 -1
  7. data/README.md +115 -20
  8. data/bin/dbf +3 -1
  9. data/docs/CNAME +1 -0
  10. data/docs/DBF.html +200 -0
  11. data/docs/DBF/Column.html +947 -0
  12. data/docs/DBF/Column/LengthError.html +124 -0
  13. data/docs/DBF/Column/NameError.html +124 -0
  14. data/docs/DBF/ColumnType.html +115 -0
  15. data/docs/DBF/ColumnType/Base.html +389 -0
  16. data/docs/DBF/ColumnType/Boolean.html +238 -0
  17. data/docs/DBF/ColumnType/Currency.html +238 -0
  18. data/docs/DBF/ColumnType/Date.html +242 -0
  19. data/docs/DBF/ColumnType/DateTime.html +246 -0
  20. data/docs/DBF/ColumnType/Double.html +238 -0
  21. data/docs/DBF/ColumnType/Float.html +238 -0
  22. data/docs/DBF/ColumnType/General.html +238 -0
  23. data/docs/DBF/ColumnType/Memo.html +246 -0
  24. data/docs/DBF/ColumnType/Nil.html +238 -0
  25. data/docs/DBF/ColumnType/Number.html +242 -0
  26. data/docs/DBF/ColumnType/SignedLong.html +238 -0
  27. data/docs/DBF/ColumnType/String.html +240 -0
  28. data/docs/DBF/Database.html +126 -0
  29. data/docs/DBF/Database/Foxpro.html +653 -0
  30. data/docs/DBF/Database/Table.html +346 -0
  31. data/docs/DBF/FileNotFoundError.html +124 -0
  32. data/docs/DBF/Header.html +723 -0
  33. data/docs/DBF/Memo.html +117 -0
  34. data/docs/DBF/Memo/Base.html +485 -0
  35. data/docs/DBF/Memo/Dbase3.html +242 -0
  36. data/docs/DBF/Memo/Dbase4.html +230 -0
  37. data/docs/DBF/Memo/Foxpro.html +268 -0
  38. data/docs/DBF/NoColumnsDefined.html +124 -0
  39. data/docs/DBF/Record.html +773 -0
  40. data/docs/DBF/Schema.html +980 -0
  41. data/docs/DBF/Table.html +1571 -0
  42. data/docs/_index.html +415 -0
  43. data/docs/class_list.html +51 -0
  44. data/docs/css/common.css +1 -0
  45. data/docs/css/full_list.css +58 -0
  46. data/docs/css/style.css +497 -0
  47. data/docs/file.README.html +359 -0
  48. data/docs/file_list.html +56 -0
  49. data/docs/frames.html +17 -0
  50. data/docs/index.html +359 -0
  51. data/docs/js/app.js +314 -0
  52. data/docs/js/full_list.js +216 -0
  53. data/docs/js/jquery.js +4 -0
  54. data/docs/method_list.html +675 -0
  55. data/docs/top-level-namespace.html +110 -0
  56. data/lib/dbf/column.rb +5 -4
  57. data/lib/dbf/column_type.rb +29 -8
  58. data/lib/dbf/database/foxpro.rb +7 -2
  59. data/lib/dbf/header.rb +11 -3
  60. data/lib/dbf/record.rb +5 -5
  61. data/lib/dbf/schema.rb +4 -3
  62. data/lib/dbf/table.rb +32 -12
  63. data/lib/dbf/version.rb +1 -1
  64. data/spec/dbf/column_spec.rb +17 -17
  65. data/spec/dbf/{database_spec.rb → database/foxpro_spec.rb} +0 -0
  66. data/spec/dbf/file_formats_spec.rb +22 -6
  67. data/spec/dbf/record_spec.rb +2 -2
  68. data/spec/dbf/table_spec.rb +8 -0
  69. data/spec/fixtures/dbase_02.dbf +0 -0
  70. data/spec/fixtures/polygon.dbf +0 -0
  71. data/spec/spec_helper.rb +0 -2
  72. metadata +57 -10
  73. data/docs/supported_encodings.csv +0 -60
  74. data/docs/supported_types.markdown +0 -53
data/lib/dbf/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module DBF
2
- VERSION = '4.1.1'.freeze
2
+ VERSION = '4.1.5'.freeze
3
3
  end
@@ -52,14 +52,14 @@ RSpec.describe DBF::Column do
52
52
  end
53
53
  end
54
54
 
55
- context 'and 0 length' do
55
+ context 'with 0 length' do
56
56
  it 'returns nil' do
57
57
  column = DBF::Column.new table, 'ColumnName', 'N', 0, 0
58
58
  expect(column.type_cast('')).to be_nil
59
59
  end
60
60
  end
61
61
 
62
- context 'and 0 decimals' do
62
+ context 'with 0 decimals' do
63
63
  it 'casts value to Integer' do
64
64
  value = '135'
65
65
  column = DBF::Column.new table, 'ColumnName', 'N', 3, 0
@@ -69,11 +69,11 @@ RSpec.describe DBF::Column do
69
69
  it 'supports negative Integer' do
70
70
  value = '-135'
71
71
  column = DBF::Column.new table, 'ColumnName', 'N', 3, 0
72
- expect(column.type_cast(value)).to eq -135
72
+ expect(column.type_cast(value)).to eq(-135)
73
73
  end
74
74
  end
75
75
 
76
- context 'and more than 0 decimals' do
76
+ context 'with more than 0 decimals' do
77
77
  it 'casts value to Float' do
78
78
  value = '13.5'
79
79
  column = DBF::Column.new table, 'ColumnName', 'N', 2, 1
@@ -83,13 +83,13 @@ RSpec.describe DBF::Column do
83
83
  it 'casts negative value to Float' do
84
84
  value = '-13.5'
85
85
  column = DBF::Column.new table, 'ColumnName', 'N', 2, 1
86
- expect(column.type_cast(value)).to eq -13.5
86
+ expect(column.type_cast(value)).to eq(-13.5)
87
87
  end
88
88
  end
89
89
  end
90
90
 
91
91
  context 'with type F (float)' do
92
- context 'and 0 length' do
92
+ context 'with 0 length' do
93
93
  it 'returns nil' do
94
94
  column = DBF::Column.new table, 'ColumnName', 'F', 0, 0
95
95
  expect(column.type_cast('')).to be_nil
@@ -105,7 +105,7 @@ RSpec.describe DBF::Column do
105
105
  it 'casts negative value to Float' do
106
106
  value = '-135'
107
107
  column = DBF::Column.new table, 'ColumnName', 'F', 3, 0
108
- expect(column.type_cast(value)).to eq -135.0
108
+ expect(column.type_cast(value)).to eq(-135.0)
109
109
  end
110
110
  end
111
111
 
@@ -126,13 +126,13 @@ RSpec.describe DBF::Column do
126
126
  it 'supports negative binary' do
127
127
  column = DBF::Column.new table, 'ColumnName', 'B', 1, 2
128
128
  expect(column.type_cast("\x00\x00\x00\x00\x00\xC0\x65\xC0")).to be_a(Float)
129
- expect(column.type_cast("\x00\x00\x00\x00\x00\xC0\x65\xC0")).to eq -174.0
129
+ expect(column.type_cast("\x00\x00\x00\x00\x00\xC0\x65\xC0")).to eq(-174.0)
130
130
  end
131
131
  end
132
132
  end
133
133
 
134
134
  context 'with type I (integer)' do
135
- context 'and 0 length' do
135
+ context 'with 0 length' do
136
136
  it 'returns nil' do
137
137
  column = DBF::Column.new table, 'ColumnName', 'I', 0, 0
138
138
  expect(column.type_cast('')).to be_nil
@@ -148,7 +148,7 @@ RSpec.describe DBF::Column do
148
148
  it 'supports negative Integer' do
149
149
  value = "\x24\xE1\xFF\xFF"
150
150
  column = DBF::Column.new table, 'ColumnName', 'I', 3, 0
151
- expect(column.type_cast(value)).to eq -7900
151
+ expect(column.type_cast(value)).to eq(-7900)
152
152
  end
153
153
  end
154
154
 
@@ -167,7 +167,7 @@ RSpec.describe DBF::Column do
167
167
  expect(column.type_cast('n')).to be false
168
168
  end
169
169
 
170
- context 'and 0 length' do
170
+ context 'with 0 length' do
171
171
  it 'returns nil' do
172
172
  column = DBF::Column.new table, 'ColumnName', 'L', 0, 0
173
173
  expect(column.type_cast('')).to be_nil
@@ -232,7 +232,7 @@ RSpec.describe DBF::Column do
232
232
  expect(column.type_cast(nil)).to be_nil
233
233
  end
234
234
 
235
- context 'and 0 length' do
235
+ context 'with 0 length' do
236
236
  it 'returns nil' do
237
237
  column = DBF::Column.new table, 'ColumnName', 'M', 0, 0
238
238
  expect(column.type_cast('')).to be_nil
@@ -252,7 +252,7 @@ RSpec.describe DBF::Column do
252
252
  expect(column.type_cast(nil)).to be_nil
253
253
  end
254
254
 
255
- context 'and 0 length' do
255
+ context 'with 0 length' do
256
256
  it 'returns nil' do
257
257
  column = DBF::Column.new table, 'ColumnName', 'G', 0, 0
258
258
  expect(column.type_cast('')).to be_nil
@@ -269,14 +269,14 @@ RSpec.describe DBF::Column do
269
269
  end
270
270
 
271
271
  it 'supports negative currency' do
272
- expect(column.type_cast("\xFC\xF0\xF0\xFE\xFF\xFF\xFF\xFF")).to eq -1776.41
272
+ expect(column.type_cast("\xFC\xF0\xF0\xFE\xFF\xFF\xFF\xFF")).to eq(-1776.41)
273
273
  end
274
274
 
275
275
  it 'supports 64bit negative currency' do
276
- expect(column.type_cast("pN'9\xFF\xFF\xFF\xFF")).to eq -333_609.0
276
+ expect(column.type_cast("pN'9\xFF\xFF\xFF\xFF")).to eq(-333_609.0)
277
277
  end
278
278
 
279
- context 'and 0 length' do
279
+ context 'with 0 length' do
280
280
  it 'returns nil' do
281
281
  column = DBF::Column.new table, 'ColumnName', 'Y', 0, 0
282
282
  expect(column.type_cast('')).to be_nil
@@ -284,7 +284,7 @@ RSpec.describe DBF::Column do
284
284
  end
285
285
  end
286
286
 
287
- context '#name' do
287
+ describe '#name' do
288
288
  it 'contains only ASCII characters' do
289
289
  column = DBF::Column.new table, "--\x1F-\x68\x65\x6C\x6C\x6F world-\x80--", 'N', 1, 0
290
290
  expect(column.name).to eq '---hello world---'
@@ -1,17 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.shared_examples_for 'DBF' do
4
- specify 'sum of column lengths should equal record length specified in header plus one' do
5
- header_record_length = table.instance_eval { @header.record_length }
6
- sum_of_column_lengths = table.columns.inject(1) { |sum, column| sum += column.length }
4
+ let(:header_record_length) { table.instance_eval { header.record_length } }
5
+ let(:sum_of_column_lengths) { table.columns.inject(1) { |sum, column| sum + column.length } }
7
6
 
7
+ specify 'sum of column lengths should equal record length specified in header plus one' do
8
8
  expect(header_record_length).to eq sum_of_column_lengths
9
9
  end
10
10
 
11
11
  specify 'records should be instances of DBF::Record' do
12
- table.each do |record|
13
- expect(record).to be_kind_of(DBF::Record)
14
- end
12
+ expect(table).to all be_kind_of(DBF::Record)
15
13
  end
16
14
 
17
15
  specify 'record count should be the same as reported in the header' do
@@ -50,6 +48,24 @@ RSpec.shared_examples_for 'DBF' do
50
48
  end
51
49
  end
52
50
 
51
+ RSpec.describe DBF, 'of type 02 (FoxBase)' do
52
+ let(:table) { DBF::Table.new fixture('dbase_02.dbf') }
53
+
54
+ it_behaves_like 'DBF'
55
+
56
+ it 'reports the correct version number' do
57
+ expect(table.version).to eq '02'
58
+ end
59
+
60
+ it 'reports the correct version description' do
61
+ expect(table.version_description).to eq 'FoxBase'
62
+ end
63
+
64
+ it 'determines the number of records' do
65
+ expect(table.record_count).to eq 9
66
+ end
67
+ end
68
+
53
69
  RSpec.describe DBF, 'of type 03 (dBase III without memo file)' do
54
70
  let(:table) { DBF::Table.new fixture('dbase_03.dbf') }
55
71
 
@@ -44,13 +44,13 @@ RSpec.describe DBF::Record do
44
44
 
45
45
  describe 'when other does not have attributes' do
46
46
  it 'returns false' do
47
- expect((record == double('other'))).to be_falsey
47
+ expect((record == instance_double('DBF::Record'))).to be_falsey
48
48
  end
49
49
  end
50
50
 
51
51
  describe 'if other attributes match' do
52
52
  let(:attributes) { {x: 1, y: 2} }
53
- let(:other) { double('object', attributes: attributes) }
53
+ let(:other) { instance_double('DBF::Record', attributes: attributes) }
54
54
 
55
55
  before do
56
56
  allow(record).to receive(:attributes).and_return(attributes)
@@ -147,6 +147,14 @@ RSpec.describe DBF::Table do
147
147
  allow(table).to receive(:deleted_record?).and_return(true)
148
148
  expect(table.record(5)).to be_nil
149
149
  end
150
+
151
+ describe 'when dbf has no column definitions' do
152
+ let(:dbf_path) { fixture('polygon.dbf') }
153
+
154
+ it 'raises a DBF::NoColumnsDefined error' do
155
+ expect { DBF::Table.new(dbf_path).record(1) }.to raise_error(DBF::NoColumnsDefined, 'The DBF file has no columns defined')
156
+ end
157
+ end
150
158
  end
151
159
 
152
160
  describe '#current_record' do
Binary file
Binary file
data/spec/spec_helper.rb CHANGED
@@ -4,8 +4,6 @@ begin
4
4
  rescue LoadError
5
5
  end
6
6
 
7
- Encoding.default_external = 'UTF-8'
8
-
9
7
  require 'dbf'
10
8
  require 'yaml'
11
9
  require 'rspec'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbf
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.1
4
+ version: 4.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Morrison
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-26 00:00:00.000000000 Z
11
+ date: 2021-08-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A small fast library for reading dBase, xBase, Clipper and FoxPro database
14
14
  files.
@@ -31,8 +31,53 @@ files:
31
31
  - Rakefile
32
32
  - bin/dbf
33
33
  - dbf.gemspec
34
- - docs/supported_encodings.csv
35
- - docs/supported_types.markdown
34
+ - docs/CNAME
35
+ - docs/DBF.html
36
+ - docs/DBF/Column.html
37
+ - docs/DBF/Column/LengthError.html
38
+ - docs/DBF/Column/NameError.html
39
+ - docs/DBF/ColumnType.html
40
+ - docs/DBF/ColumnType/Base.html
41
+ - docs/DBF/ColumnType/Boolean.html
42
+ - docs/DBF/ColumnType/Currency.html
43
+ - docs/DBF/ColumnType/Date.html
44
+ - docs/DBF/ColumnType/DateTime.html
45
+ - docs/DBF/ColumnType/Double.html
46
+ - docs/DBF/ColumnType/Float.html
47
+ - docs/DBF/ColumnType/General.html
48
+ - docs/DBF/ColumnType/Memo.html
49
+ - docs/DBF/ColumnType/Nil.html
50
+ - docs/DBF/ColumnType/Number.html
51
+ - docs/DBF/ColumnType/SignedLong.html
52
+ - docs/DBF/ColumnType/String.html
53
+ - docs/DBF/Database.html
54
+ - docs/DBF/Database/Foxpro.html
55
+ - docs/DBF/Database/Table.html
56
+ - docs/DBF/FileNotFoundError.html
57
+ - docs/DBF/Header.html
58
+ - docs/DBF/Memo.html
59
+ - docs/DBF/Memo/Base.html
60
+ - docs/DBF/Memo/Dbase3.html
61
+ - docs/DBF/Memo/Dbase4.html
62
+ - docs/DBF/Memo/Foxpro.html
63
+ - docs/DBF/NoColumnsDefined.html
64
+ - docs/DBF/Record.html
65
+ - docs/DBF/Schema.html
66
+ - docs/DBF/Table.html
67
+ - docs/_index.html
68
+ - docs/class_list.html
69
+ - docs/css/common.css
70
+ - docs/css/full_list.css
71
+ - docs/css/style.css
72
+ - docs/file.README.html
73
+ - docs/file_list.html
74
+ - docs/frames.html
75
+ - docs/index.html
76
+ - docs/js/app.js
77
+ - docs/js/full_list.js
78
+ - docs/js/jquery.js
79
+ - docs/method_list.html
80
+ - docs/top-level-namespace.html
36
81
  - lib/dbf.rb
37
82
  - lib/dbf/column.rb
38
83
  - lib/dbf/column_type.rb
@@ -48,12 +93,13 @@ files:
48
93
  - lib/dbf/table.rb
49
94
  - lib/dbf/version.rb
50
95
  - spec/dbf/column_spec.rb
51
- - spec/dbf/database_spec.rb
96
+ - spec/dbf/database/foxpro_spec.rb
52
97
  - spec/dbf/file_formats_spec.rb
53
98
  - spec/dbf/record_spec.rb
54
99
  - spec/dbf/table_spec.rb
55
100
  - spec/fixtures/cp1251.dbf
56
101
  - spec/fixtures/cp1251_summary.txt
102
+ - spec/fixtures/dbase_02.dbf
57
103
  - spec/fixtures/dbase_03.dbf
58
104
  - spec/fixtures/dbase_03_summary.txt
59
105
  - spec/fixtures/dbase_30.dbf
@@ -90,12 +136,13 @@ files:
90
136
  - spec/fixtures/foxprodb/setup.dbf
91
137
  - spec/fixtures/foxprodb/types.CDX
92
138
  - spec/fixtures/foxprodb/types.dbf
139
+ - spec/fixtures/polygon.dbf
93
140
  - spec/spec_helper.rb
94
141
  homepage: http://github.com/infused/dbf
95
142
  licenses:
96
143
  - MIT
97
144
  metadata: {}
98
- post_install_message:
145
+ post_install_message:
99
146
  rdoc_options:
100
147
  - "--charset=UTF-8"
101
148
  require_paths:
@@ -111,13 +158,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
158
  - !ruby/object:Gem::Version
112
159
  version: 1.3.0
113
160
  requirements: []
114
- rubygems_version: 3.0.2
115
- signing_key:
161
+ rubygems_version: 3.0.9
162
+ signing_key:
116
163
  specification_version: 4
117
164
  summary: Read xBase files
118
165
  test_files:
166
+ - spec/dbf/database/foxpro_spec.rb
119
167
  - spec/dbf/file_formats_spec.rb
120
- - spec/dbf/database_spec.rb
121
168
  - spec/dbf/column_spec.rb
122
169
  - spec/dbf/record_spec.rb
123
170
  - spec/dbf/table_spec.rb
@@ -1,60 +0,0 @@
1
- "Code Page", "Encoding", "Description"
2
- "01", "cp437", "U.S. MS–DOS"
3
- "02", "cp850", "International MS–DOS"
4
- "03", "cp1252", "Windows ANSI"
5
- "08", "cp865", "Danish OEM"
6
- "09", "cp437", "Dutch OEM"
7
- "0a", "cp850", "Dutch OEM*"
8
- "0b", "cp437", "Finnish OEM"
9
- "0d", "cp437", "French OEM"
10
- "0e", "cp850", "French OEM*"
11
- "0f", "cp437", "German OEM"
12
- "10", "cp850", "German OEM*"
13
- "11", "cp437", "Italian OEM"
14
- "12", "cp850", "Italian OEM*"
15
- "13", "cp932", "Japanese Shift-JIS"
16
- "14", "cp850", "Spanish OEM*"
17
- "15", "cp437", "Swedish OEM"
18
- "16", "cp850", "Swedish OEM*"
19
- "17", "cp865", "Norwegian OEM"
20
- "18", "cp437", "Spanish OEM"
21
- "19", "cp437", "English OEM (Britain)"
22
- "1a", "cp850", "English OEM (Britain)*"
23
- "1b", "cp437", "English OEM (U.S.)"
24
- "1c", "cp863", "French OEM (Canada)"
25
- "1d", "cp850", "French OEM*"
26
- "1f", "cp852", "Czech OEM"
27
- "22", "cp852", "Hungarian OEM"
28
- "23", "cp852", "Polish OEM"
29
- "24", "cp860", "Portuguese OEM"
30
- "25", "cp850", "Portuguese OEM*"
31
- "26", "cp866", "Russian OEM"
32
- "37", "cp850", "English OEM (U.S.)*"
33
- "40", "cp852", "Romanian OEM"
34
- "4d", "cp936", "Chinese GBK (PRC)"
35
- "4e", "cp949", "Korean (ANSI/OEM)"
36
- "4f", "cp950", "Chinese Big5 (Taiwan)"
37
- "50", "cp874", "Thai (ANSI/OEM)"
38
- "57", "cp1252", "ANSI"
39
- "58", "cp1252", "Western European ANSI"
40
- "59", "cp1252", "Spanish ANSI"
41
- "64", "cp852", "Eastern European MS–DOS"
42
- "65", "cp866", "Russian MS–DOS"
43
- "66", "cp865", "Nordic MS–DOS"
44
- "67", "cp861", "Icelandic MS–DOS"
45
- "6a", "cp737", "Greek MS–DOS (437G)"
46
- "6b", "cp857", "Turkish MS–DOS"
47
- "6c", "cp863", "French–Canadian MS–DOS"
48
- "78", "cp950", "Taiwan Big 5"
49
- "79", "cp949", "Hangul (Wansung)"
50
- "7a", "cp936", "PRC GBK"
51
- "7b", "cp932", "Japanese Shift-JIS"
52
- "7c", "cp874", "Thai Windows/MS–DOS"
53
- "86", "cp737", "Greek OEM"
54
- "87", "cp852", "Slovenian OEM"
55
- "88", "cp857", "Turkish OEM"
56
- "c8", "cp1250", "Eastern European Windows"
57
- "c9", "cp1251", "Russian Windows"
58
- "ca", "cp1254", "Turkish Windows"
59
- "cb", "cp1253", "Greek Windows"
60
- "cc", "cp1257", "Baltic Windows"
@@ -1,53 +0,0 @@
1
- # DBF supported data types
2
-
3
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
4
- | Version | Description | C | N | L | D | M | F | B | G | P | Y | T | I | V | X | @ | O | + |
5
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
6
- | 02 | FoxBase | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | - | - |
7
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
8
- | 03 | dBase III without memo file | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | - | - |
9
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
10
- | 04 | dBase IV without memo file | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | - | - |
11
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
12
- | 05 | dBase V without memo file | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | - | - |
13
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
14
- | 07 | Visual Objects 1.x | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | - | - |
15
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
16
- | 30 | Visual FoxPro | Y | Y | Y | Y | Y | Y | Y | Y | N | Y | N | Y | N | N | N | N | - |
17
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
18
- | 31 | Visual FoxPro with AutoIncrement | Y | Y | Y | Y | Y | Y | Y | Y | N | Y | N | Y | N | N | N | N | N |
19
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
20
- | 7b | dBase IV with memo file | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - |
21
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
22
- | 83 | dBase III with memo file | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | - |
23
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
24
- | 87 | Visual Objects 1.x with memo file | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | - |
25
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
26
- | 8b | dBase IV with memo file | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | N | - | - | - |
27
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
28
- | 8e | dBase IV with SQL table | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | N | - | - | - |
29
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
30
- | f5 | FoxPro with memo file | Y | Y | Y | Y | Y | Y | Y | Y | N | Y | N | Y | N | N | N | N | N |
31
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
32
- | fb | FoxPro without memo file | Y | Y | Y | Y | - | Y | Y | Y | N | Y | N | Y | N | N | N | N | N |
33
- +---------+-----------------------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
34
-
35
- Data type descriptions
36
-
37
- * C = Character
38
- * N = Number
39
- * L = Logical
40
- * D = Date
41
- * M = Memo
42
- * F = Float
43
- * B = Binary
44
- * G = General
45
- * P = Picture
46
- * Y = Currency
47
- * T = DateTime
48
- * I = Integer
49
- * V = VariField
50
- * X = SQL compat
51
- * @ = Timestamp
52
- * O = Double
53
- * + = Autoincrement