Skip to content

Commit

Permalink
fix issue iryndin#3 (iryndin#3)
Browse files Browse the repository at this point in the history
add record (sequence) number for each DbfRecord
  • Loading branch information
iryndin committed Jul 23, 2014
1 parent e66deed commit 2c5a5df
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 4 deletions.
12 changes: 10 additions & 2 deletions src/main/java/net/iryndin/jdbf/core/DbfRecord.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,27 @@ 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();
}
private void fillBytesFromMetadata() {
bytes = new byte[metadata.getOneRecordLength()];
BitUtils.memset(bytes, 0x20);
BitUtils.memset(bytes, JdbfUtils.EMPTY);
}
*/

public Charset getStringCharset() {
return stringCharset;
Expand All @@ -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) {
Expand Down
11 changes: 9 additions & 2 deletions src/main/java/net/iryndin/jdbf/reader/DbfReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@
import net.iryndin.jdbf.util.IOUtils;

import java.io.*;
import java.util.Arrays;

public class DbfReader implements Closeable {

private ByteArrayInputStream dbfInputStream;
private MemoReader memoReader;
private DbfMetadata metadata;
private byte[] oneRecordBuffer;
private int recordsCounter = 0;

public DbfReader(File dbfFile) throws IOException {
this(new FileInputStream(dbfFile));
Expand Down Expand Up @@ -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 {
Expand All @@ -77,16 +83,17 @@ 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;
}

return createDbfRecord();
}

private DbfRecord createDbfRecord() {
return new DbfRecord(oneRecordBuffer, metadata, memoReader);
return new DbfRecord(oneRecordBuffer, metadata, memoReader, ++recordsCounter);
}
}
68 changes: 68 additions & 0 deletions src/test/java/net/iryndin/jdbf/TestDbfReader.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
}
}
1 change: 1 addition & 0 deletions src/test/java/net/iryndin/jdbf/TestMemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
Binary file added src/test/resources/data1/gds_im.dbf
Binary file not shown.
Binary file added src/test/resources/data1/tir_im.dbf
Binary file not shown.

0 comments on commit 2c5a5df

Please sign in to comment.