org.h2gis.drivers.dbf.DBFEngine Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of h2drivers Show documentation
Show all versions of h2drivers Show documentation
Add H2 read/write support for file formats such as ESRI shape file
The newest version!
/**
* H2GIS is a library that brings spatial support to the H2 Database Engine
* .
*
* H2GIS is distributed under GPL 3 license. It is produced by CNRS
* .
*
* H2GIS is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* H2GIS is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* H2GIS. If not, see .
*
* For more information, please consult:
* or contact directly: info_at_h2gis.org
*/
package org.h2gis.drivers.dbf;
import org.h2.command.ddl.CreateTableData;
import org.h2.table.Column;
import org.h2.value.Value;
import org.h2gis.drivers.file_table.FileEngine;
import org.h2gis.drivers.dbf.internal.DBFDriver;
import org.h2gis.drivers.dbf.internal.DbaseFileHeader;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* SHP Table factory.
* @author Nicolas Fortin
*/
public class DBFEngine extends FileEngine {
@Override
protected DBFDriver createDriver(File filePath, List args) throws IOException {
DBFDriver driver = new DBFDriver();
driver.initDriverFromFile(filePath, args.size() > 1 ? args.get(1) : null);
return driver;
}
@Override
protected void feedCreateTableData(DBFDriver driver, CreateTableData data) throws IOException {
DbaseFileHeader header = driver.getDbaseFileHeader();
feedTableDataFromHeader(header, data);
}
/**
* Parse the DBF file then init the provided data structure
* @param header dbf header
* @param data Data to initialise
* @throws java.io.IOException
*/
public static void feedTableDataFromHeader(DbaseFileHeader header, CreateTableData data) throws IOException {
for (int i = 0; i < header.getNumFields(); i++) {
String fieldsName = header.getFieldName(i);
final int type = dbfTypeToH2Type(header,i);
Column column = new Column(fieldsName.toUpperCase(), type);
column.setPrecision(header.getFieldLength(i)); // set string length
data.columns.add(column);
}
}
/**
* @see "http://www.clicketyclick.dk/databases/xbase/format/data_types.html"
* @param header DBF File Header
* @param i DBF Type identifier
* @return H2 {@see Value}
* @throws java.io.IOException
*/
private static int dbfTypeToH2Type(DbaseFileHeader header, int i) throws IOException {
switch (header.getFieldType(i)) {
// (L)logical (T,t,F,f,Y,y,N,n)
case 'l':
case 'L':
return Value.BOOLEAN;
// (C)character (String)
case 'c':
case 'C':
return Value.STRING_FIXED;
// (D)date (Date)
case 'd':
case 'D':
return Value.DATE;
// (F)floating (Double)
case 'n':
case 'N':
if ((header.getFieldDecimalCount(i) == 0)) {
if ((header.getFieldLength(i) >= 0)
&& (header.getFieldLength(i) < 10)) {
return Value.INT;
} else {
return Value.LONG;
}
}
case 'f':
case 'F': // floating point number
case 'o':
case 'O': // floating point number
return Value.DOUBLE;
default:
throw new IOException("Unknown DBF field type "+header.getFieldType(i));
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy