[Gvsig_desarrolladores] Info on shp/dbf driver

Francisco José Peñarrubia fpenarru en gmail.com
Mie Abr 8 11:13:45 CEST 2009


Hi Stefano.

Yes, then it's a problem about ConcreteMemoryDriver. Think about this 
class as something that might be extended, then, create your own class 
inheriting from it and override this function:

public int getFieldType(int i) throws ReadDriverException  (from 
MemoryDriver).

Hope this helps, and keep going!! :-)

Fran Peñarrubia
gvSIG Team
www.scolab.es

Stefano Orlando escribió:
> Hello Francisco, sorry for the delay of my answer.
>
> I was a little vague: now I'm experimenting with the .dbf writer 
> trying to
> export to .shp format the content of a memory driver; if a field in 
> the data
> table is set to SQL TIMESTAMP type, the RuntimeException "Unknown 
> type" with
> the number 93 (that is the code of TIMESTAMP in java.sql.Types) is cast
> (I've not tested it, but looking at code of the .dbf reader this 
> should also
> occur when reading a .dbf file). I don't use .dbfs with a TIMESTAMP 
> column
> (I've tried to create one with Openoffice but surprisingly - for me ;-) -
> the column is transformed to a text data type), but I've tested it with a
> Postgres table with a "timestamp without time zone" field and the 
> 'export to
> .shp' function fails.
> Regarding the detection of the field type, this is also related to the
> attempt to export to a .shp file the content of a memory driver
> (ConcreteMemoryDriver): perhaps I miss something, but when you create a
> ConcreteMemoryDriver is there a method to set the types of the columns 
> (and
> not only the names by the .getTableModel().setColumnIdentifiers(...)
> method)? If not, how the type is retrieved by the data table of the 
> memory
> driver (especially when I set a NullValue through the ValueFactory)?
>
> Thank you for your help!
>
> Stefano
>
> ----- Original Message ----- From: "Francisco José Peñarrubia" 
> <fpenarru en gmail.com>
> To: "Lista de Desarrolladores de gvSIG" 
> <gvsig_desarrolladores en runas.cap.gva.es>
> Sent: Monday, April 06, 2009 7:54 PM
> Subject: Re: [Gvsig_desarrolladores] Info on shp/dbf driver
>
>
>> Hi, Stefano.
>>
>> As far as I know, the Dbf driver 
>> (com.iver.cit.gvsig.fmap.drivers.dbf.DBFDriver.java) reads the field 
>> type from the dBase Header (using DbaseFileHeader class). It seems 
>> that we are only taking care of some field types:
>>
>>    public int getFieldType(int i) throws ReadDriverException {
>>        char fieldType = fieldTypes[i];
>>
>>        if (fieldType == 'L') {
>>            return Types.BOOLEAN;
>>        } else if ((fieldType == 'F') || (fieldType == 'N')) {
>>            if (dbf.getFieldDecimalLength(i)>0)
>>                return Types.DOUBLE;
>>            else
>>                return Types.INTEGER;
>>        } else if (fieldType == 'C') {
>>            return Types.VARCHAR;
>>        } else if (fieldType == 'D') {
>>            return Types.DATE;
>>        } else {
>>            throw new 
>> BadFieldDriverException(getName(),null,String.valueOf(fieldType));
>>        }
>>    }
>>
>> From here:
>>
>> http://www.clicketyclick.dk/databases/xbase/format/data_types.html
>>
>> It seems we should take care of '@' character, at least. Do you have 
>> any example of dbf file with this kind of data?.
>>
>> Or maybe you mean the DbfWriter. Then, you can have a look to this 
>> function in DbaseFileWriterNIO:
>>
>> private String fieldString(Object obj,final int col) {
>>    String o;
>>    final int fieldLen = header.getFieldLength(col);
>>    switch (header.getFieldType(col)) {
>>      case 'C':
>>      case 'c':
>>        o = formatter.getFieldString(
>>          fieldLen,
>>          (obj instanceof NullValue)? NULL_STRING : ((StringValue) 
>> obj).getValue()
>>        );
>>        break;
>>      case 'L':
>>      case 'l':
>>        o = (obj instanceof NullValue) ? "F" : 
>> ((BooleanValue)obj).getValue() == true ? "T" : "F";
>>        break;
>>      case 'M':
>>      case 'G':
>>        o = formatter.getFieldString(
>>          fieldLen,
>>          (obj instanceof NullValue) ? NULL_STRING : ((StringValue) 
>> obj).getValue()
>>        );
>>        break;
>>     /* case 'N':
>>      case 'n':
>>        // int?
>>        if (header.getFieldDecimalCount(col) == 0) {
>>           o = formatter.getFieldString(
>>            fieldLen, 0, (Number) (obj == null ? NULL_NUMBER : 
>> Double.valueOf(obj.toString()))
>>          );
>>          break;
>>      }
>>      */
>>      case 'N':
>>      case 'n':
>>      case 'F':
>>      case 'f':
>>        Number number = null;
>>        if(obj instanceof NullValue){
>>            number = NULL_NUMBER;
>>        }else{
>>            NumericValue gVal = (NumericValue) obj;
>>            number = new Double(gVal.doubleValue());
>>        }
>>        o = formatter.getFieldString(fieldLen,
>>                header.getFieldDecimalCount(col),
>>                    number);
>>        break;
>>      case 'D':
>>      case 'd':
>>          if (obj instanceof NullValue)
>>              o = NULL_DATE;
>>          else
>>              o = formatter.getFieldString(((DateValue)obj).getValue());
>>        break;
>>      default:
>>        throw new RuntimeException("Unknown type " + 
>> header.getFieldType(col));
>>    }
>>
>>    return o;
>>  }
>>
>> It seems there is not support to TIMESTAMP  type.
>>
>> Hope this helps... If you find the problema and wants to contribute, 
>> please, let us know.
>>
>> Thanks for your help.
>>
>> Fran Peñarrubia
>> gvSIG Team
>>
>>
>> Stefano Orlando escribió:
>>> Playing a bit with data conversion in gvSIG 1.9 alpha, I've noticed 
>>> that the .shp driver (the .dbf part really) doesn't support the SQL 
>>> 'TIMESTAMP' type and that the driver determines the type of a column 
>>> reading the value from the first row of the table (so, if the value 
>>> is a null value, there are some troubles because there isn't a 
>>> 'null' data type in .dbf specs). Could you confirm these behaviours 
>>> or I've missed something? And if this is true, there will be any 
>>> changes in future versions of gvSIG?
>>> Thank you for your assistance!
>>>
>>> Stefano
>>> ------------------------------------------------------------------------ 
>>>
>>>
>>> _______________________________________________
>>> gvSIG_desarrolladores mailing list
>>> gvSIG_desarrolladores en runas.cap.gva.es
>>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>>>
>>
>> _______________________________________________
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores en runas.cap.gva.es
>> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores 
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores



Más información sobre la lista de distribución gvSIG_desarrolladores