dbf 4.0.1 → 4.1.4

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.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +68 -54
  5. data/Guardfile +1 -1
  6. data/LICENSE +1 -1
  7. data/README.md +115 -20
  8. data/bin/dbf +1 -1
  9. data/dbf.gemspec +1 -0
  10. data/docs/CNAME +1 -0
  11. data/docs/DBF.html +200 -0
  12. data/docs/DBF/Column.html +947 -0
  13. data/docs/DBF/Column/LengthError.html +124 -0
  14. data/docs/DBF/Column/NameError.html +124 -0
  15. data/docs/DBF/ColumnType.html +115 -0
  16. data/docs/DBF/ColumnType/Base.html +389 -0
  17. data/docs/DBF/ColumnType/Boolean.html +238 -0
  18. data/docs/DBF/ColumnType/Currency.html +238 -0
  19. data/docs/DBF/ColumnType/Date.html +242 -0
  20. data/docs/DBF/ColumnType/DateTime.html +246 -0
  21. data/docs/DBF/ColumnType/Double.html +238 -0
  22. data/docs/DBF/ColumnType/Float.html +238 -0
  23. data/docs/DBF/ColumnType/General.html +238 -0
  24. data/docs/DBF/ColumnType/Memo.html +246 -0
  25. data/docs/DBF/ColumnType/Nil.html +238 -0
  26. data/docs/DBF/ColumnType/Number.html +242 -0
  27. data/docs/DBF/ColumnType/SignedLong.html +238 -0
  28. data/docs/DBF/ColumnType/String.html +240 -0
  29. data/docs/DBF/Database.html +126 -0
  30. data/docs/DBF/Database/Foxpro.html +653 -0
  31. data/docs/DBF/Database/Table.html +346 -0
  32. data/docs/DBF/FileNotFoundError.html +124 -0
  33. data/docs/DBF/Header.html +723 -0
  34. data/docs/DBF/Memo.html +117 -0
  35. data/docs/DBF/Memo/Base.html +485 -0
  36. data/docs/DBF/Memo/Dbase3.html +242 -0
  37. data/docs/DBF/Memo/Dbase4.html +230 -0
  38. data/docs/DBF/Memo/Foxpro.html +268 -0
  39. data/docs/DBF/NoColumnsDefined.html +124 -0
  40. data/docs/DBF/Record.html +773 -0
  41. data/docs/DBF/Schema.html +980 -0
  42. data/docs/DBF/Table.html +1571 -0
  43. data/docs/_index.html +415 -0
  44. data/docs/class_list.html +51 -0
  45. data/docs/css/common.css +1 -0
  46. data/docs/css/full_list.css +58 -0
  47. data/docs/css/style.css +497 -0
  48. data/docs/file.README.html +359 -0
  49. data/docs/file_list.html +56 -0
  50. data/docs/frames.html +17 -0
  51. data/docs/index.html +359 -0
  52. data/docs/js/app.js +314 -0
  53. data/docs/js/full_list.js +216 -0
  54. data/docs/js/jquery.js +4 -0
  55. data/docs/method_list.html +675 -0
  56. data/docs/top-level-namespace.html +110 -0
  57. data/lib/dbf/column.rb +5 -4
  58. data/lib/dbf/column_type.rb +29 -8
  59. data/lib/dbf/database/foxpro.rb +7 -2
  60. data/lib/dbf/header.rb +11 -3
  61. data/lib/dbf/record.rb +5 -5
  62. data/lib/dbf/schema.rb +4 -3
  63. data/lib/dbf/table.rb +32 -12
  64. data/lib/dbf/version.rb +1 -1
  65. data/spec/dbf/column_spec.rb +17 -17
  66. data/spec/dbf/{database_spec.rb → database/foxpro_spec.rb} +0 -0
  67. data/spec/dbf/file_formats_spec.rb +22 -6
  68. data/spec/dbf/record_spec.rb +2 -2
  69. data/spec/dbf/table_spec.rb +8 -0
  70. data/spec/fixtures/dbase_02.dbf +0 -0
  71. data/spec/fixtures/polygon.dbf +0 -0
  72. data/spec/spec_helper.rb +0 -2
  73. metadata +59 -12
  74. data/docs/supported_encodings.csv +0 -60
  75. data/docs/supported_types.markdown +0 -53
data/lib/dbf/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module DBF
2
- VERSION = '4.0.1'.freeze
2
+ VERSION = '4.1.4'.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.0.1
4
+ version: 4.1.4
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-06 00:00:00.000000000 Z
11
+ date: 2021-08-08 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:
@@ -104,20 +151,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
151
  requirements:
105
152
  - - ">="
106
153
  - !ruby/object:Gem::Version
107
- version: '0'
154
+ version: 2.4.0
108
155
  required_rubygems_version: !ruby/object:Gem::Requirement
109
156
  requirements:
110
157
  - - ">="
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.2.15
162
+ signing_key:
116
163
  specification_version: 4
117
164
  summary: Read xBase files
118
165
  test_files:
119
- - spec/dbf/file_formats_spec.rb
120
- - spec/dbf/database_spec.rb
121
166
  - spec/dbf/column_spec.rb
167
+ - spec/dbf/database/foxpro_spec.rb
168
+ - spec/dbf/file_formats_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