From 2c5a5df5993a490507d7634a056401ce394653d8 Mon Sep 17 00:00:00 2001 From: iryndin Date: Wed, 23 Jul 2014 18:07:58 +0400 Subject: [PATCH] fix issue #3 (https://github.com/iryndin/jdbf/issues/3) add record (sequence) number for each DbfRecord --- .../java/net/iryndin/jdbf/core/DbfRecord.java | 12 +++- .../net/iryndin/jdbf/reader/DbfReader.java | 11 ++- .../java/net/iryndin/jdbf/TestDbfReader.java | 68 ++++++++++++++++++ src/test/java/net/iryndin/jdbf/TestMemo.java | 1 + src/test/resources/data1/gds_im.dbf | Bin 0 -> 3325 bytes src/test/resources/data1/tir_im.dbf | Bin 0 -> 6541 bytes 6 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/test/java/net/iryndin/jdbf/TestDbfReader.java create mode 100644 src/test/resources/data1/gds_im.dbf create mode 100644 src/test/resources/data1/tir_im.dbf diff --git a/src/main/java/net/iryndin/jdbf/core/DbfRecord.java b/src/main/java/net/iryndin/jdbf/core/DbfRecord.java index 88d57e7..bb064de 100644 --- a/src/main/java/net/iryndin/jdbf/core/DbfRecord.java +++ b/src/main/java/net/iryndin/jdbf/core/DbfRecord.java @@ -21,14 +21,17 @@ public class DbfRecord { private DbfMetadata metadata; private MemoReader memoReader; private Charset stringCharset; + private final int recordNumber; - public DbfRecord(byte[] source, DbfMetadata metadata, MemoReader memoReader) { + public DbfRecord(byte[] source, DbfMetadata metadata, MemoReader memoReader, int recordNumber) { + this.recordNumber = recordNumber; this.bytes = new byte[source.length]; System.arraycopy(source, 0, this.bytes, 0, source.length); this.metadata = metadata; this.memoReader = memoReader; } + /* public DbfRecord(DbfMetadata metadata) { this.metadata = metadata; fillBytesFromMetadata(); @@ -36,8 +39,9 @@ public DbfRecord(DbfMetadata metadata) { private void fillBytesFromMetadata() { bytes = new byte[metadata.getOneRecordLength()]; - BitUtils.memset(bytes, 0x20); + BitUtils.memset(bytes, JdbfUtils.EMPTY); } + */ public Charset getStringCharset() { return stringCharset; @@ -51,6 +55,10 @@ public byte[] getBytes() { return bytes; } + public int getRecordNumber() { + return recordNumber; + } + public String getString(String fieldName) { Charset charset = this.stringCharset; if (charset == null) { diff --git a/src/main/java/net/iryndin/jdbf/reader/DbfReader.java b/src/main/java/net/iryndin/jdbf/reader/DbfReader.java index cf1228d..181fe22 100644 --- a/src/main/java/net/iryndin/jdbf/reader/DbfReader.java +++ b/src/main/java/net/iryndin/jdbf/reader/DbfReader.java @@ -5,6 +5,7 @@ import net.iryndin.jdbf.util.IOUtils; import java.io.*; +import java.util.Arrays; public class DbfReader implements Closeable { @@ -12,6 +13,7 @@ public class DbfReader implements Closeable { private MemoReader memoReader; private DbfMetadata metadata; private byte[] oneRecordBuffer; + private int recordsCounter = 0; public DbfReader(File dbfFile) throws IOException { this(new FileInputStream(dbfFile)); @@ -61,10 +63,14 @@ private void readHeader() throws IOException { public void close() throws IOException { if (memoReader != null) { memoReader.close(); + memoReader = null; } if (dbfInputStream != null) { dbfInputStream.close(); + dbfInputStream = null; } + metadata = null; + recordsCounter = 0; } public void findFirstRecord() throws IOException { @@ -77,9 +83,10 @@ private void seek(ByteArrayInputStream inputStream, int position) { } public DbfRecord read() throws IOException { + Arrays.fill(oneRecordBuffer, (byte)0x0); int readLength = dbfInputStream.read(oneRecordBuffer); - if (readLength == -1) { + if (readLength < metadata.getOneRecordLength()) { return null; } @@ -87,6 +94,6 @@ public DbfRecord read() throws IOException { } private DbfRecord createDbfRecord() { - return new DbfRecord(oneRecordBuffer, metadata, memoReader); + return new DbfRecord(oneRecordBuffer, metadata, memoReader, ++recordsCounter); } } diff --git a/src/test/java/net/iryndin/jdbf/TestDbfReader.java b/src/test/java/net/iryndin/jdbf/TestDbfReader.java new file mode 100644 index 0000000..8ef392a --- /dev/null +++ b/src/test/java/net/iryndin/jdbf/TestDbfReader.java @@ -0,0 +1,68 @@ +package net.iryndin.jdbf; + +import net.iryndin.jdbf.core.DbfMetadata; +import net.iryndin.jdbf.core.DbfRecord; +import net.iryndin.jdbf.reader.DbfReader; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.text.ParseException; + +import static org.junit.Assert.assertEquals; + +public class TestDbfReader { + + @Test + public void test1() throws IOException, ParseException { + Charset stringCharset = Charset.forName("Cp866"); + + InputStream dbf = getClass().getClassLoader().getResourceAsStream("data1/gds_im.dbf"); + + DbfRecord rec; + try (DbfReader reader = new DbfReader(dbf)) { + DbfMetadata meta = reader.getMetadata(); + + assertEquals(5, meta.getRecordsQty()); + assertEquals(28, meta.getFields().size()); + + System.out.println("Read DBF Metadata: " + meta); + int recCounter = 0; + while ((rec = reader.read()) != null) { + rec.setStringCharset(stringCharset); + System.out.println(rec.getRecordNumber()); + System.out.println(rec.toMap()); + + recCounter++; + assertEquals(recCounter, rec.getRecordNumber()); + } + } + } + + @Test + public void test2() throws IOException, ParseException { + Charset stringCharset = Charset.forName("Cp866"); + + InputStream dbf = getClass().getClassLoader().getResourceAsStream("data1/tir_im.dbf"); + + DbfRecord rec; + try (DbfReader reader = new DbfReader(dbf)) { + DbfMetadata meta = reader.getMetadata(); + + assertEquals(1, meta.getRecordsQty()); + assertEquals(117, meta.getFields().size()); + + System.out.println("Read DBF Metadata: " + meta); + int recCounter = 0; + while ((rec = reader.read()) != null) { + rec.setStringCharset(stringCharset); + System.out.println(rec.getRecordNumber()); + System.out.println(rec.toMap()); + + recCounter++; + assertEquals(recCounter, rec.getRecordNumber()); + } + } + } +} diff --git a/src/test/java/net/iryndin/jdbf/TestMemo.java b/src/test/java/net/iryndin/jdbf/TestMemo.java index 1109a0d..0c41869 100644 --- a/src/test/java/net/iryndin/jdbf/TestMemo.java +++ b/src/test/java/net/iryndin/jdbf/TestMemo.java @@ -24,6 +24,7 @@ public void test1() { try (DbfReader reader = new DbfReader(dbf, memo)) { DbfMetadata meta = reader.getMetadata(); + System.out.println("Read DBF Metadata: " + meta); assertEquals(5, meta.getField("TEXVER").getLength()); assertEquals(DbfFieldTypeEnum.Character, meta.getField("TEXVER").getType()); diff --git a/src/test/resources/data1/gds_im.dbf b/src/test/resources/data1/gds_im.dbf new file mode 100644 index 0000000000000000000000000000000000000000..2222aad2bf6062cfe4780d8847f721501703e803 GIT binary patch literal 3325 zcmeHJ-EPw`6b=*+0}bvGLY5GBrNnX4B$rzgLbNTd+HPFt6?lZu&6}4lZju2VLTuv6 zcn_{PaemgO)#$|}dNHewPyC%f`#ZMN__Xojp(IJa8o%#Bx6pRF-mssKcCxOnqkJoR&+pqE+dZ)RxqUspLr7^M@_SOg z6}>}n89?BF7I3W`5%D)`34%Q?6omaosa^Dd8?*ScMZ63k{6AgvuM5YLB)Uf3UQy=a zFT?%q{T(n{Zm*Wp&)4sHE&fi|8u-0o7Imq;z_+$L;6>mybIJ3E!w-4R0)Lgu)zeW` zrEfdleqsNzLUO^fcijWO*Mk}o_K#|~qsk&V7+xA5@X|uyugkZh2Yhb*>-i762mZiy zymEf^`s(!Ut)XqfU$Qcn_4?lHTJC$-wtQxvYduN#Ly(>Q$|t3k7#@xdeQ-XJz+=rbQviXxiQ zFiGR{n8kb)MA470Xu`+r=NA@dauiJHG)OamqV;bWX5W(KJW&O&knsM%f}dg%+#>V( zhH0uQG2STzoDzKnU$?AsO)r)aZp(6;DA@$ln1wtIjx$PtE1pIH@Or_bh#zvnZG1iz z^62UWD&eXqg(hMrC}B}bQ#PeZ$bep!($gm5VH{l0jN>Lc8egHqAU;~c+-1dG(Th#xCfyt>=*3D~Y2i8jb)pyF?cR(oOk|^? zm+0+P=_Q7yw_uOVwsoRcx!b)NHL9jx(~IHrXqK;~a=v@9tee2EHmkBu^b$d@MwIM$ zDsJ8KT;@r{M_io4;&csTen!#t2`+A1p3(@VaQ%uacfwEDH+G8Pz{hXlp{{an&#ujX blG~bEZC->8_$2vPD-LHFw_9YbcJGV7I4@3V literal 0 HcmV?d00001 diff --git a/src/test/resources/data1/tir_im.dbf b/src/test/resources/data1/tir_im.dbf new file mode 100644 index 0000000000000000000000000000000000000000..235d23c2249d3dcaa654d39aea34055bfb75b8fc GIT binary patch literal 6541 zcmeHK-HzNe6dqVW6j7k45>k;+UZ8E9znMYYWD`%;nv5MKnQ8aRH+_IU!fI(H=+CHI zB)H^RxaN(x;`rE^&Ytzm(jTf;kd@X+K7Z$Y{%oIk4(?z1_Jh%A^v4%}eg@5jYp!J9 z+P8&iOyBKG>P6Yu7l?nl4Z=O3HSc@gb|b_;B={X&i>}vFjYiTy6fc&5w!G5P@;@Pb zgR4cOy58b6f5|&hN!>J!pI@a(i^hv9-6M< zrdswh^MvEOfJf1gAMvk<0abjSe~sd4%v>teNA*{E>|nn?RX)%yesAdQ+FZ+8U}TGb zegQ8B-0NQzZpMdEYQhJ65QzA%6lbZ;?)*RS;5t7nz(njv>={*QI1CW+g!0pH@E>uS zzkua`T()AxZG4&^AuGU}AMv(7Zn&L)x_>OLs@ARVFNr=OrM7)+{_6y{nCM~gVE(IK zT+f8E_zzyZ$vd|{za#jOs!QIAa)|#m!Do5JWiNBsA()@euf_ASZ2dSWhwWW(v9dTF ze-%#7%@2(a_}=wnoNcXU)JNlkzYezf>H3~G%{hHn$oN73IX?AY$@*AHZt4R{r}OXX zgNd=TK4_a^Uwzo{X?-yDu~1M2-TJstAHZM0%;lXwF<_+LYB*8+ZSf6(!-1j;hK(ckNY-xs=2OH+g`esB@D)!*?w`r2I7 z97JIJYlLs~As+d0$iGtc(i{N%{>ChG9~g{3C-JK^GTYC*MV#uZl4Oj4!*5*VmwAtT z|MxWw6G!pl-GbLOM+nn=L*hH!r10{M_*ym^&S%J{^+PTfdK>?U#Gk2_;{mMpuV2G& zYPA3w#;5gJ$%5;=G&uTC>u0fObW`CPL_Wpg^a4jiyu9-VUspBPY6*RiPuHKtagloQ zQVXfoyac}2zor#NySb2m&)#qT!{q9w#1-V_o3p2p2R)Ea&!3H`xRNtbGmF#x)vG?Q zwOp>8e{}uX{3vH{{z3oF{OAs!s?^vC&;fZ(Wl^mVTS09UjWu~ zECF793ss7l;H578`r+r>5pVJa3ZR$Y^?ASSU=tMn{BS-Q)~a{^3zN`3MInpAX_&F;_i+U8SbQr9 zCs}-JI&u92mZeE}D|7^S3lZ2P3`5&yFMxsZmf9{~h@RgK;3HKESp{|7ymIF1FbEc+ z?v)JY{8;iXILuq~)T+D;*!YzLzZNk{vY9wrpFV$f^7QQF^!fVcll9r7)01F*vfdk* zMJ!I4?flE*;K};&`oa3g)01Zp9{zmx=;ZgkVJ51x-u$DtA%h&&%c?YMiDi4%WZ$J^7G8V-! zF+tEZhe3N>bH2(0Hoch#jamfh&7(Jv6q;-HZwpdNS|L*#CuQw-=oW? z@E>^;|A$xB@i>YVXVWQod8eD3+6fnYa3