Package chunmap.data.provider.shp

Source Code of chunmap.data.provider.shp.DbfReader

/**
* Copyright (c) 2009-2011, chunquedong(YangJiandong)
*
* This file is part of ChunMap project
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE(Version >=3)
*
* History:
*     2010-05-05  Jed Young  Creation
*/
package chunmap.data.provider.shp;

import java.io.File;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Arrays;

import chunmap.data.ChunMapDataException;
import chunmap.data.feature.FeatureSchama;
import chunmap.data.feature.Field;
import chunmap.util.Logger;

public class DbfReader {
  private static final Logger Log=new Logger(Logger.Off,DbfReader.class.getName());
 
  private ResultSet resultSet;
  private Connection connDbf = null;
  private PreparedStatement psDbf = null;
  private FeatureSchama featureSchama;
  private Charset charset;
 
  public DbfReader(String path) {
    open(path);
  }

  public Object[] getValues(long index){
    try{
      while(resultSet.next()){
        if(resultSet.getRow()==index+1){
          int n=resultSet.getMetaData().getColumnCount();
         
          Object[] values=new Object[n];
          for(int i=0;i<n;i++){
            values[i]=readData(resultSet,i);
          }
          Log.debug(Arrays.toString(values));
          return values;
        }
      }
      throw new ChunMapDataException("no data in index="+index);
    }catch (SQLException e) {
      throw new ChunMapDataException(e);
    }
  }
 
  private Object readData(ResultSet resultSet,int i) throws SQLException{
    int dataType=resultSet.getMetaData().getColumnType(i+1);
    if(charset !=null && (dataType==Types.CHAR || dataType==Types.VARCHAR)){
      byte[] bs=resultSet.getBytes(i+1);
      if(bs==null)return "";
      byte[] bs2 = new String(bs,charset).getBytes();
      //return new String(bs2,Charset.forName("UTF-8"));
      return new String(bs2);
    }
   
    return resultSet.getObject(i+1);
  }
 
  public void close(){
    try {
      resultSet.close();
      psDbf.close();
      connDbf.close();
     
    } catch (SQLException e) {
      throw new ChunMapDataException(e);
    }
  }

  private void open(String apath){
    try {
      readDbf(apath);
      featureSchama=loadFeatureSchama();
     
    } catch (ClassNotFoundException e) {
      throw new ChunMapDataException(e);
    } catch (SQLException e) {
      throw new ChunMapDataException(e);
    }
  }

  private void readDbf(String apath) throws ClassNotFoundException, SQLException{
    File file = new File(apath);
    String name = file.getName();
    name=name.substring(0,name.lastIndexOf("."));
    String path = apath.substring(0, apath.lastIndexOf(File.separator));
   
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    connDbf = DriverManager.getConnection(
        "jdbc:odbc:DRIVER={Microsoft dBase Driver (*.dbf)};DBQ="
        + path + ";","","");
    String sql = "select * from " + name;
    psDbf = connDbf.prepareStatement(sql);
    resultSet = psDbf.executeQuery();
  }

  private FeatureSchama loadFeatureSchama() throws SQLException{
    ResultSetMetaData rm= resultSet.getMetaData();
    int n=rm.getColumnCount();
   
    Field[] fields=new Field[n];
    for(int i=0;i<n;i++){
      Field f=new Field(rm.getColumnName(i+1),i,rm.getColumnType(i+1));
      fields[i]=f;
    }
    FeatureSchama fs=new FeatureSchama(fields,-1,-1);
    return fs;
  }

  public FeatureSchama getFeatureSchama() {
    return featureSchama;
  }

  public void setCharset(Charset charset) {
    this.charset = charset;
  }
}
TOP

Related Classes of chunmap.data.provider.shp.DbfReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.