/***************************************************************************** * * This file is part of Mapnik (c++ mapping toolkit) * * Copyright (C) 2006 Artem Pavlenko * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *****************************************************************************/ // stl #include // boost #include #include // mapnik #include #include "dbffile.hpp" dbf_file::dbf_file() : num_records_(0), num_fields_(0), record_length_(0), record_(0) {} dbf_file::dbf_file(const char* file_name) :num_records_(0), num_fields_(0), record_length_(0), record_(0) { file_.open(file_name); if (file_.is_open()) { read_header(); } } dbf_file::~dbf_file() { ::operator delete(record_); file_.close(); } bool dbf_file::open(const std::string& file_name) { file_.open(file_name.c_str(),std::ios::in|std::ios::binary); if (file_.is_open()) read_header(); return file_?true:false; } bool dbf_file::is_open() { return file_.is_open(); } void dbf_file::close() { if (file_ && file_.is_open()) file_.close(); } int dbf_file::num_records() const { return num_records_; } int dbf_file::num_fields() const { return num_fields_; } void dbf_file::move_to(int index) { if (index>0 && index<=num_records_) { long pos=(num_fields_<<5)+34+(index-1)*(record_length_+1); file_.seekg(pos,std::ios::beg); file_.read(record_,record_length_); } } std::string dbf_file::string_value(int col) const { if (col>=0 && col=0 && col=0 && col0 ) { try { double d = boost::lexical_cast(str); boost::put(f,name,d); } catch (boost::bad_lexical_cast &) { boost::put(f,name,0.0); } } else { try { int i = boost::lexical_cast(str); boost::put(f,name,i); } catch (boost::bad_lexical_cast &) { boost::put(f,name,0); } } break; } } } } void dbf_file::read_header() { char c=file_.get(); if (c=='\3' || c=='\131') { skip(3); num_records_=read_int(); assert(num_records_>0); num_fields_=read_short(); assert(num_fields_>0); num_fields_=(num_fields_-33)/32; skip(22); int offset=0; char name[11]; memset(&name,0,11); fields_.reserve(num_fields_); for (int i=0;i0) { record_=static_cast(::operator new (sizeof(char)*record_length_)); } } } int dbf_file::read_short() { char b[2]; file_.read(b,2); return (b[0] & 0xff) | (b[1] & 0xff) << 8; } int dbf_file::read_int() { char b[4]; file_.read(b,4); return (b[0] & 0xff) | (b[1] & 0xff) << 8 | (b[2] & 0xff) << 16 | (b[3] & 0xff) <<24; } void dbf_file::skip(int bytes) { file_.seekg(bytes,std::ios::cur); }