Transactor.h
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/postgis/Transactor.h
22 
23  \brief A Transactor can be viewed as a connection to the data source for reading/writing things into it.
24 */
25 
26 #ifndef __TERRALIB_POSTGIS_INTERNAL_TRANSACTOR_H
27 #define __TERRALIB_POSTGIS_INTERNAL_TRANSACTOR_H
28 
29 // TerraLib
30 #include "../dataaccess/datasource/DataSourceTransactor.h"
31 #include "Config.h"
32 #include "DataSource.h"
33 
34 // STL
35 #include <memory>
36 #include <map>
37 #include <string>
38 
39 namespace te
40 {
41 // Forward declarations
42  namespace dt { class Property; }
43  namespace gm { class Envelope; class Geometry; }
44 
45  namespace pgis
46  {
47  // Forward declarations
48  class BatchExecutor;
49  class DataSet;
50  class Connection;
51  class ObjectIdSet;
52  class PreparedQuery;
53  class Query;
54  class ScopedConnection;
55 
56  /*!
57  \class Transactor
58 
59  \brief The transactor class for the PostGIS driver.
60 
61  \sa te::da::DataSourceTransactor, DataSource
62  */
64  {
65  public:
66 
67  /*!
68  \brief Constructor.
69 
70  \param ds The PostGIS data source associated to this transactor.
71  \param conn An available connection that will be released when the transactor is deleted
72  */
73  Transactor(DataSource* ds, const int& connectionId = -1);
74 
75  /*! \brief The destructor will automatically release the connection to the pool. */
76  ~Transactor();
77 
78  te::da::DataSource* getDataSource() const;
79 
80  /*!
81  \brief It returns the underlying connection.
82 
83  \return The underlying connection.
84 
85  \note PostGIS driver extended method.
86  */
87  Connection* getConnection(const int& id = -1) const;
88 
89  /*!
90  \brief It returns the underlying connection ID.
91 
92  \return The underlying connection ID.
93 
94  \note PostGIS driver extended method.
95  */
96  int getConnectionID() const;
97 
98  void begin();
99 
100  void commit();
101 
102  void rollBack();
103 
104  bool isInTransaction() const;
105 
106  std::unique_ptr<te::da::DataSet> getDataSet(const std::string& name,
108  bool isConnected = false,
109  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
110 
111  std::unique_ptr<te::da::DataSet> getDataSet(const std::string& name,
112  const std::string& propertyName,
113  const te::gm::Envelope* e,
116  bool isConnected = false,
117  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
118 
119  std::unique_ptr<te::da::DataSet> getDataSet(const std::string& name,
120  const std::string& propertyName,
121  const te::gm::Geometry* g,
124  bool isConnected = false,
125  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
126 
127  std::unique_ptr<te::da::DataSet> query(const te::da::Select& q,
129  bool connected = false,
130  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
131 
132 
133  std::unique_ptr<te::da::DataSet> query(const std::string& query,
135  bool connected = false,
136  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
137 
138  void execute(const te::da::Query& command);
139 
140  void execute(const std::string& command);
141 
142  std::unique_ptr<te::da::PreparedQuery> getPrepared(const std::string& qName = std::string(""));
143 
144  std::unique_ptr<te::da::BatchExecutor> getBatchExecutor();
145 
146  void cancel();
147 
148  boost::int64_t getLastGeneratedId();
149 
150  std::string escape(const std::string& value);
151 
152  std::vector<std::string> getDataSetNames();
153 
154  std::size_t getNumberOfDataSets();
155 
156  std::unique_ptr<te::da::DataSetType> getDataSetType(const std::string& name);
157 
158  boost::ptr_vector<te::dt::Property> getProperties(const std::string& datasetName);
159 
160  std::unique_ptr<te::dt::Property> getProperty(const std::string& datasetName, const std::string& name);
161 
162  std::unique_ptr<te::dt::Property> getProperty(const std::string& datasetName, std::size_t propertyPos);
163 
164  std::vector<std::string> getPropertyNames(const std::string& datasetName);
165 
166  std::size_t getNumberOfProperties(const std::string& datasetName);
167 
168  bool propertyExists(const std::string& datasetName, const std::string& name);
169 
170  void addProperty(const std::string& datasetName, te::dt::Property* p);
171 
172  void dropProperty(const std::string& datasetName, const std::string& name);
173 
174  void renameProperty(const std::string& datasetName,
175  const std::string& propertyName,
176  const std::string& newPropertyName);
177 
178 
179  void changePropertyDefinition(const std::string& datasetName, const std::string& propName, te::dt::Property* newProp);
180 
181 
182  std::unique_ptr<te::da::PrimaryKey> getPrimaryKey(const std::string& datasetName);
183 
184  bool primaryKeyExists(const std::string& datasetName, const std::string& name);
185 
186  void addPrimaryKey(const std::string& datasetName, te::da::PrimaryKey* pk);
187 
188  void dropPrimaryKey(const std::string& datasetName);
189 
190  std::unique_ptr<te::da::ForeignKey> getForeignKey(const std::string& datasetName, const std::string& name);
191 
192  std::vector<std::string> getForeignKeyNames(const std::string& datasetName);
193 
194  bool foreignKeyExists(const std::string& datasetName, const std::string& name);
195 
196  void addForeignKey(const std::string& datasetName, te::da::ForeignKey* fk);
197 
198  void dropForeignKey(const std::string& datasetName, const std::string& fkName);
199 
200  std::unique_ptr<te::da::UniqueKey> getUniqueKey(const std::string& datasetName, const std::string& name);
201 
202  std::vector<std::string> getUniqueKeyNames(const std::string& datasetName);
203 
204  bool uniqueKeyExists(const std::string& datasetName, const std::string& name);
205 
206  void addUniqueKey(const std::string& datasetName, te::da::UniqueKey* uk);
207 
208  void dropUniqueKey(const std::string& datasetName, const std::string& name);
209 
210  std::unique_ptr<te::da::CheckConstraint> getCheckConstraint(const std::string& datasetName, const std::string& name);
211 
212  std::vector<std::string> getCheckConstraintNames(const std::string& datasetName);
213 
214  bool checkConstraintExists(const std::string& datasetName, const std::string& name);
215 
216  void addCheckConstraint(const std::string& datasetName, te::da::CheckConstraint* cc);
217 
218  void dropCheckConstraint(const std::string& datasetName, const std::string& name);
219 
220  std::unique_ptr<te::da::Index> getIndex(const std::string& datasetName, const std::string& name);
221 
222  std::vector<std::string> getIndexNames(const std::string& datasetName);
223 
224  bool indexExists(const std::string& datasetName, const std::string& name);
225 
226  void addIndex(const std::string& datasetName, te::da::Index* idx,
227  const std::map<std::string, std::string>& options);
228 
229  void dropIndex(const std::string& datasetName, const std::string& idxName);
230 
231  std::unique_ptr<te::da::Sequence> getSequence(const std::string& name);
232 
233  std::vector<std::string> getSequenceNames();
234 
235  bool sequenceExists(const std::string& name);
236 
237  void addSequence(te::da::Sequence* sequence);
238 
239  void dropSequence(const std::string& name);
240 
241  std::unique_ptr<te::gm::Envelope> getExtent(const std::string& datasetName,
242  const std::string& propertyName);
243 
244  std::unique_ptr<te::gm::Envelope> getExtent(const std::string& datasetName,
245  std::size_t propertyPos);
246 
247  std::size_t getNumberOfItems(const std::string& datasetName);
248 
249  bool hasDataSets();
250 
251  bool dataSetExists(const std::string& name);
252 
253  void createDataSet(te::da::DataSetType* dt, const std::map<std::string, std::string>& options);
254 
255  void cloneDataSet(const std::string& name,
256  const std::string& cloneName,
257  const std::map<std::string, std::string>& options);
258 
259  void dropDataSet(const std::string& name);
260 
261  void renameDataSet(const std::string& name, const std::string& newName);
262 
263  void add(const std::string& datasetName,
264  te::da::DataSet* d,
265  const std::map<std::string, std::string>& options,
266  std::size_t limit = 0,
267  bool enableProgress = true);
268 
269  void remove(const std::string& datasetName, const te::da::ObjectIdSet* oids = 0);
270 
271  void update(const std::string& datasetName,
272  te::da::DataSet* dataset,
273  const std::vector<std::size_t>& properties,
274  const te::da::ObjectIdSet* oids,
275  const std::map<std::string, std::string>& options,
276  std::size_t limit = 0);
277 
278  void update(const std::string& datasetName,
279  te::da::DataSet* dataset,
280  const std::vector< std::set<int> >& properties,
281  const std::vector<size_t>& ids);
282 
283  void optimize(const std::map<std::string, std::string>& opInfo);
284 
285  /*!
286  \brief It will check in the database catalog the number that identifies the PostGIS Geometry type.
287 
288  \return The oid of the geometry type or 0 if it is not found.
289 
290  \exception Exception It may throws an exception.
291 
292  \note PostGIS driver extended method.
293  */
294  unsigned int getGeomTypeId();
295 
296  /*!
297  \brief It will check in the database catalog the number that identifies the PostGIS Raster type.
298 
299  \return The oid of the raster type or 0 if it is not found.
300 
301  \exception Exception It may throws an exception.
302 
303  \note PostGIS driver extended method.
304  */
305  unsigned int getRasterTypeId();
306 
307  /*!
308  \brief It retrieves some information about the database such as the default schema used when no one is provided.
309 
310  \param currentSchema A reference to output the current schema.
311 
312  \exception Exception It throws an exception if it was not possible to query the database.
313 
314  \note PostGIS driver extended method.
315  */
316  void getDatabaseInfo(std::string& currentSchema);
317 
318  /*!
319  \brief It loads information about a given geometry column.
320 
321  \param datasetName The name of the dataset containing the geometric property.
322  \param gp The geometric columns to load its information.
323 
324  \exception It throws an exception if it can not load the information.
325  */
326  void getGeometryInfo(const std::string& datasetName, te::gm::GeometryProperty* gp);
327 
328  /*!
329  \brief It loads information about a given raster column.
330 
331  \param datasetName The name of the dataset containing the geometric property.
332  \param rp The raster column to load its information.
333 
334  \exception It throws an exception if it can not load the information.
335  */
336  void getRasterInfo(const std::string& datasetName, te::rst::RasterProperty* rp);
337 
338  /*!
339  \brief It gets the full name of the given name including the schema name.
340 
341  \param name The dataset name.
342 
343  \return The dataset full name.
344  */
345  std::string getFullName(const std::string& name);
346 
347  protected:
348 
349  /*!
350  \brief It looks for the dataset id in the PostgreSQL system.
351 
352  \param datasetName Dataset name. If it has no schema prefix name, it will look the dataset id in the default schema.
353 
354  \exception Exception It throws an exception, if it was not possible to get the dataset id.
355 
356  \note PostGIS driver extended method.
357  */
358  unsigned int getDataSetId(const std::string& datasetName);
359 
360  /*!
361  \brief It looks for a dataset name with the given id in the PostgreSQL.
362 
363  \param id The dataset id.
364 
365  \return The dataset name.
366 
367  \exception Exception It throws an exception if it was not possible to retrieve the information.
368 
369  \note PostGIS driver extended method.
370  */
371  std::string getDataSetName(unsigned int id);
372 
373  /*!
374  \brief It gets the information about the given dataset.
375 
376  \param datasetName The dataset name.
377 
378  \return The information about the given dataset.
379 
380  \note Internally, a record set will be generated containing the following fields:
381  <ul>
382  <li>0 (int2): attribute number in the table (a.attnum), remember that attribute number is 1 based</li>
383  <li>1 (name): attribute name (a.attname)</li>
384  <li>2 (Oid): attribute type oid (t.oid)</li>
385  <li>3 (bool): 't' if attribute is NOT NULL, otherwise, its value is 'f' (a.attnotnull)</li>
386  <li>4 (text): type modifier information, like precision and scale (format_type(a.atttypid, a.atttypmod))</li>
387  <li>5 (bool): 't' if attribute is has a default value, otherwise, its value is 'f' (a.atthasdef)</li>
388  <li>6 (text): attribute default value if field number 5 is true (pg_get_expr(d.adbin, d.adrelid))</li>
389  <li>7 (int4): Number of dimensions, if the column is an array type; otherwise 0 (a.attndims)</li>
390  </ul>
391 
392  \exception Exception It throws an exception if it was not possible to get the information needed.
393 
394  \note PostGIS driver extended method.
395  */
396  std::unique_ptr<te::da::DataSet> getPropertiesInfo(const std::string& datasetName);
397 
398  /*!
399  \brief It sets the property id from the PostgreSQL system.
400 
401  \param p The property whose oid will be set from PostgreSQL system tables.
402 
403  \exception Exception It throws an exception if it was not possible to set the oid information.
404 
405  \note PostGIS driver extended method.
406  */
407  void getPropertyId(te::dt::Property* p);
408 
409  /*!
410  \brief It retrieves a property with the given id from the given dataset.
411 
412  \param pid The property id.
413  \param datasetName The dataset name.
414 
415  \return The property with the given id from the dataset.
416 
417  \note PostGIS driver extended method.
418  */
419  std::unique_ptr<te::dt::Property> getProperty(unsigned int pid, const std::string& datasetName);
420 
421  /*!
422  \brief It gets the dataset containing information about one of the constraints(primary, foreign or
423  unique keys, or the check constraints) of the given dataset. If the constraint type
424  is not specified, it gets all the constraints of the given dataset.
425 
426  \param datasetName The dataset name.
427  \param conType The type of constraint to be retrieved. If this value is '\0' all the types are retrieved.
428 
429  \return A recordset with the following fields:
430  <ul>
431  <li>0 (Oid): constraint oid (c.oid)</li>
432  <li>1 (name): constraint schema name (n.nspname)</li>
433  <li>2 (name): constraint name (c.conname)</li>
434  <li>3 (char): constraint type (c.contype), one of the following values: 'c', 'f', 'p', 'u'</li>
435  <li>4 (Oid): the referenced table (c.confrelid)</li>
436  <li>5 (char): OnUpdate action (c.confupdtype)</li>
437  <li>6 (char): OnDeletion action (c.confdeltype)</li>
438  <li>7 (char): ??? (c.confmatchtype)</li>
439  <li>8 (int2[]): array of attribute numbers (c.conkey), the list of keys in a foreign key, primary key or unique key</li>
440  <li>9 (int2[]): array of attribute numbers in the referenced table (c.confkey)</li>
441  <li>10 (text): constraint expression (pg_get_constraintdef(c.oid))</li>
442  </ul>
443 
444  \return The dataset containing information about the constraints of the given dataset.
445  */
446  std::unique_ptr<te::da::DataSet> getConstraints(const std::string& datasetName, char conType = '\0');
447 
448  /*!
449  \brief It gets the information about all the dataset constraints(primary, foreign and
450  unique keys, and the check constraints) and loads it on the given dataset schema.
451 
452  \param dt The dataset schema.
453  */
454  void getConstraints(te::da::DataSetType* dt);
455 
456  /*!
457  \brief It gets all the indexes of the given dataset and adds them to the dummy schema.
458 
459  \param dt The dataset schema.
460 
461  \return The dataset indexes.
462  */
463  void getIndexes(te::da::DataSetType* dt);
464 
465  /*!
466  \brief It gets information about all the sequences in the datasource.
467 
468  \exception It throws an exception if the sequences cannot be loaded.
469 
470  \return The list of sequences in the data source,
471 
472  \note Not thread-safe!
473  \note PostGIS driver extended method.
474  */
475  std::vector<te::da::Sequence*> getSequences();
476 
477  private:
478 
479  DataSource* m_ds; //!< The PostGIS data source associated to this transactor.
480  int m_connectionId; //!< The connection id used by this transactor.
481  const int m_fetchSize; //!< The size of cursor fetch.
482  bool m_isInTransaction; //!< Tells if there is a transaction in progress.
483  bool m_getConstraints; //!< Flag that defines if the method getConstraints must be called.
484  };
485 
486  typedef boost::shared_ptr<Transactor> TransactorPtr;
487 
488  } // end namespace da
489 } // end namespace te
490 
491 #endif // __TERRALIB_POSTGIS_INTERNAL_TRANSACTOR_H
Geometric property.
A class that models the description of a dataset.
Definition: DataSetType.h:72
SpatialRelation
Spatial relations between geometric objects.
Definition: Enums.h:127
It describes a sequence (a number generator).
Definition: Sequence.h:56
A class that implements a connection to a PostgreSQL database.
Definition: Connection.h:68
A class that describes a check constraint.
An abstract class for data providers like a DBMS, Web Services or a regular file. ...
Definition: DataSource.h:119
int m_connectionId
The connection id used by this transactor.
Definition: Transactor.h:480
bool m_getConstraints
Flag that defines if the method getConstraints must be called.
Definition: Transactor.h:483
It models a property definition.
Definition: Property.h:59
Raster property.
#define TEPGISEXPORT
You can use this macro in order to export/import classes and functions from this module.
Definition: Config.h:195
The PostGIS driver.
Definition: DataSource.h:54
The transactor class for the PostGIS driver.
Definition: Transactor.h:63
AccessPolicy
Supported data access policies (can be used as bitfield).
Definition: Enums.h:40
TraverseType
A dataset can be traversed in two ways:
Definition: Enums.h:53
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
This class represents a set of unique ids created in the same context. i.e. from the same data set...
Definition: ObjectIdSet.h:55
Configuration flags for the PostGIS Driver Implementation of TerraLib.
URI C++ Library.
It models a foreign key constraint for a DataSetType.
Definition: ForeignKey.h:50
It describes a unique key (uk) constraint.
Definition: UniqueKey.h:53
A DataSourceTransactor can be viewed as a connection to the data source for reading/writing things in...
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
Definition: Geometry.h:75
A Select models a query to be used when retrieving data from a DataSource.
Definition: Select.h:65
Implementation of the data source for the PostGIS driver.
boost::shared_ptr< Transactor > TransactorPtr
Definition: Transactor.h:486
A dataset is the unit of information manipulated by the data access module of TerraLib.
Definition: DataSet.h:112
bool m_isInTransaction
Tells if there is a transaction in progress.
Definition: Transactor.h:482
It describes a primary key (pk) constraint.
Definition: PrimaryKey.h:52
const int m_fetchSize
The size of cursor fetch.
Definition: Transactor.h:481
A Query is independent from the data source language/dialect.
Definition: Query.h:46
It describes an index associated to a DataSetType.
Definition: Index.h:54
DataSource * m_ds
The PostGIS data source associated to this transactor.
Definition: Transactor.h:479