27 #include "../common/Globals.h"
28 #include "../common/Translator.h"
29 #include "../dataaccess/dataset/DataSet.h"
30 #include "../dataaccess/dataset/DataSetType.h"
31 #include "../dataaccess/query/Query.h"
32 #include "../datatype/ByteArray.h"
33 #include "../datatype/DateTime.h"
34 #include "../geometry/Geometry.h"
35 #include "../memory/DataSet.h"
48 #include <boost/date_time.hpp>
49 #include <boost/format.hpp>
61 int retval = SQLITE_OK;
67 retval = sqlite3_bind_null(stmt, i + 1);
69 if(retval != SQLITE_OK)
75 switch(propertyDataType)
78 retval = sqlite3_bind_int(stmt, i + 1, d->
getChar(propertyPos));
82 retval = sqlite3_bind_int(stmt, i + 1, d->
getUChar(propertyPos));
86 retval = sqlite3_bind_int(stmt, i + 1, d->
getInt16(propertyPos));
90 retval = sqlite3_bind_int(stmt, i + 1, d->
getInt32(propertyPos));
94 retval = sqlite3_bind_int64(stmt, i + 1, d->
getInt64(propertyPos));
102 retval = sqlite3_bind_double(stmt, i + 1, static_cast<double>(d->
getFloat(propertyPos)));
106 retval = sqlite3_bind_double(stmt, i + 1, d->
getDouble(propertyPos));
111 std::string value = d->
getNumeric(propertyPos);
112 retval = sqlite3_bind_text(stmt, i + 1, value.c_str(), value.size(), SQLITE_TRANSIENT);
118 std::string value = d->
getString(propertyPos);
119 retval = sqlite3_bind_text(stmt, i + 1, value.c_str(), value.size(), SQLITE_TRANSIENT);
133 std::auto_ptr<te::gm::Geometry> g(d->
getGeometry(propertyPos));
137 unsigned char* ewkb =
new unsigned char[ewkbSize];
141 retval = sqlite3_bind_blob(stmt, i + 1, ewkb, ewkbSize, SQLITE_TRANSIENT);
149 std::auto_ptr<te::dt::DateTime> dt(d->
getDateTime(propertyPos));
151 std::string sdate = dt->toString();
153 retval = sqlite3_bind_text(stmt, i + 1, sdate.c_str(), sdate.size(), SQLITE_TRANSIENT);
169 throw te::common::Exception(TR_COMMON(
"There is a TerraLib data type that can not be mapped to SQLite type system!"));
172 if(retval != SQLITE_OK)
188 sqlite3_finalize(m_stmt);
198 assert(m_t && m_t->getDataSource() && m_t->getDataSource()->getDialect());
201 SQLVisitor visitor(*(m_t->getDataSource()->getDialect()), sql);
209 sqlite3_finalize(m_stmt);
213 int ret = sqlite3_prepare_v2(m_db, query.c_str(), -1, &m_stmt, 0);
218 sqlite3_finalize(m_stmt);
222 throw te::common::Exception((boost::format(TR_COMMON(
"Could not excute the given query due to the following error: %1%.")) % sqlite3_errmsg(m_db)).str());
228 int retval = sqlite3_step(m_stmt);
230 if(retval != SQLITE_DONE)
232 boost::format errmsg(TR_COMMON(
"Could not execute prepared query due to the following error: %1%."));
234 const char* litemsg = sqlite3_errmsg(m_db);
237 errmsg = errmsg % litemsg;
242 retval = sqlite3_reset(m_stmt);
244 if(retval != SQLITE_OK)
246 boost::format errmsg(TR_COMMON(
"Could not reset the prepared query to its initial state due to the following error: %1%."));
248 const char* litemsg = sqlite3_errmsg(m_db);
251 errmsg = errmsg % litemsg;
305 int retval = sqlite3_bind_int(m_stmt, i + 1, value);
307 if(retval != SQLITE_OK)
313 int retval = sqlite3_bind_int(m_stmt, i + 1, value);
315 if(retval != SQLITE_OK)
321 int retval = sqlite3_bind_int(m_stmt, i + 1, value);
323 if(retval != SQLITE_OK)
329 int retval = sqlite3_bind_int(m_stmt, i + 1, value);
331 if(retval != SQLITE_OK)
337 int retval = sqlite3_bind_int64(m_stmt, i + 1, value);
339 if(retval != SQLITE_OK)
347 if(retval != SQLITE_OK)
353 int retval = sqlite3_bind_double(m_stmt, i + 1, static_cast<double>(value));
355 if(retval != SQLITE_OK)
361 int retval = sqlite3_bind_double(m_stmt, i + 1, value);
363 if(retval != SQLITE_OK)
369 int retval = sqlite3_bind_text(m_stmt, i + 1, value.c_str(), value.size(), SQLITE_TRANSIENT);
371 if(retval != SQLITE_OK)
377 int retval = sqlite3_bind_text(m_stmt, i + 1, value.c_str(), value.size(), SQLITE_TRANSIENT);
379 if(retval != SQLITE_OK)
385 int retval = sqlite3_bind_blob(m_stmt, i + 1, value.
getData(), value.
bytesUsed(), SQLITE_TRANSIENT);
387 if(retval != SQLITE_OK)
395 unsigned char* ewkb =
new unsigned char[ewkbSize];
399 int retval = sqlite3_bind_blob(m_stmt, i + 1, ewkb, ewkbSize, SQLITE_TRANSIENT);
403 if(retval != SQLITE_OK)
414 std::string sdate = value.
toString();
416 int retval = sqlite3_bind_text(m_stmt, i + 1, sdate.c_str(), sdate.size(), SQLITE_TRANSIENT);
418 if(retval != SQLITE_OK)
440 sqlite3_finalize(m_stmt);
444 sqlite3_finalize(m_stmt);
448 int ret = sqlite3_prepare_v2(m_db, query.c_str(), -1, &m_stmt, 0);
453 sqlite3_finalize(m_stmt);
457 throw te::common::Exception((boost::format(TR_COMMON(
"Could not excute the given query due to the following error: %1%.")) % sqlite3_errmsg(m_db)).str());
465 const std::size_t nparams = propertiesPos.size();
467 for(std::size_t i = 0; i != nparams; ++i)
468 BindValue(m_stmt, d, i + offset, propertiesPos[i]);
474 const std::size_t nparams = propertiesPos.size();
476 for(std::size_t i = 0; i != nparams; ++i)
477 BindValue(m_stmt, d, i, propertiesPos[i]);
484 for(std::size_t i = 0; i != nparams; ++i)
virtual std::auto_ptr< te::dt::DateTime > getDateTime(std::size_t i) const =0
Method for retrieving a date and time attribute value.
virtual boost::int16_t getInt16(std::size_t i) const =0
Method for retrieving a 16-bit integer attribute value (2 bytes long).
void BindValue(sqlite3_stmt *stmt, te::da::DataSet *d, std::size_t i, std::size_t propertyPos)
A visitor for building an SQL statement using SQLite dialect.
#define TE_SQLITE_BOOL_FALSE
A flag that indicates a false value (boolean).
virtual boost::int32_t getInt32(std::size_t i) const =0
Method for retrieving a 32-bit integer attribute value (4 bytes long).
std::size_t bytesUsed() const
It returns the number of used bytes in the internal buffer.
void prepare(const te::da::Query &query, const std::vector< te::dt::Property * > ¶mTypes)
It prepares the query that may be used for commands that are used mutiple times (select, insert, update and delete).
virtual char getChar(std::size_t i) const =0
Method for retrieving a signed character attribute value (1 byte long).
virtual bool getBool(std::size_t i) const =0
Method for retrieving a boolean attribute value.
virtual boost::int64_t getInt64(std::size_t i) const =0
Method for retrieving a 64-bit integer attribute value (8 bytes long).
te::da::DataSet * query(te::common::TraverseType travType=te::common::FORWARDONLY, te::common::AccessPolicy rwRole=te::common::RAccess)
static const MachineByteOrder sm_machineByteOrder
A flag that indicates the machine byte order (Big Endian or Little Endian).
virtual std::string toString() const =0
It returns the data value in a string notation.
virtual std::string getNumeric(std::size_t i) const =0
Method for retrieving a numeric attribute value.
A class that implements a prepared query for the TerraLib SQLite Data Access Driver.
virtual double getDouble(std::size_t i) const =0
Method for retrieving a double attribute value.
AccessPolicy
Supported data access policies (can be used as bitfield).
TraverseType
A dataset can be traversed in two ways:
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
PreparedQuery()
Constructor.
virtual float getFloat(std::size_t i) const =0
Method for retrieving a float attribute value.
An abstract class for raster data strucutures.
virtual bool isNull(std::size_t i) const =0
It checks if the attribute value is NULL.
char * getData() const
It returns the data array.
A class that helps to determine the size of a SpatiaLite geometry.
std::string getName() const
It returns the prepared query name.
A base class for values that can be retrieved from the data access module.
void bind(int i, char value)
Binds the i-th parameter of the query to a value.
A DataSourceTransactor can be viewed as a connection to the data source for reading/writing things in...
virtual std::size_t getNumProperties() const =0
It returns the number of properties that composes an item of the dataset.
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
virtual std::auto_ptr< te::gm::Geometry > getGeometry(std::size_t i) const =0
Method for retrieving a geometric attribute value.
A class that serializes a geometry to the SpatiaLite EWKB format.
A visitor for building an SQL statement using SQLite dialect.
A dataset is the unit of information manipulated by the data access module of TerraLib.
~PreparedQuery()
Virtual destructor.
virtual ReturnType accept(VisitorType &guest) const =0
It call the visit method from the guest object.
void bindNumeric(int i, const std::string &value)
Binds the i-th parameter of the query to a value.
Implements the DataSource class for the SQLite Data Access Driver.
struct sqlite3_stmt sqlite3_stmt
An implementation of DataSourceTransactor class for the TerraLib SQLite Data Access Driver...
virtual std::string getString(std::size_t i) const =0
Method for retrieving a string value attribute.
virtual unsigned char getUChar(std::size_t i) const =0
Method for retrieving an unsigned character attribute value (1 byte long).
virtual int getPropertyDataType(std::size_t i) const =0
It returns the underlying data type of the property at position pos.
static std::size_t getEWKBSize(const te::gm::Geometry *g)
te::da::DataSourceTransactor * getTransactor() const
It returns a pointer to the underlying data source transactor.
#define TE_SQLITE_BOOL_TRUE
A flag that indicates a false value (boolean).
A Query is independent from the data source language/dialect.
Implementation of a forward-only dataset for the TerraLib SQLite Data Access driver.
A class for representing binary data.