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/ado/Transactor.h
22 
23  \brief DataSourceTransactor class implementation for Microsoft Access driver.
24 */
25 
26 #ifndef __TERRALIB_ADO_INTERNAL_DATASOURCETRANSACTOR_H
27 #define __TERRALIB_ADO_INTERNAL_DATASOURCETRANSACTOR_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 ado
46  {
47  // Forward declarations
48  class BatchExecutor;
49  class Connection;
50  class DataSet;
51  class ObjectIdSet;
52  class PreparedQuery;
53  class Query;
54 
55  /*!
56  \class Transactor
57 
58  \brief The transactor class for the Microsoft Access driver.
59 
60  \sa te::da::DataSourceTransactor, DataSource
61  */
63  {
64  public:
65 
67 
68  ~Transactor();
69 
70  te::da::DataSource* getDataSource() const;
71 
72  void begin();
73 
74  void commit();
75 
76  void rollBack();
77 
78  bool isInTransaction() const;
79 
80  std::auto_ptr<te::da::DataSet> getDataSet(const std::string& name,
82  bool connected = false,
83  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
84 
85  std::auto_ptr<te::da::DataSet> getDataSet(const std::string& name,
86  const std::string& propertyName,
87  const te::gm::Envelope* e,
90  bool connected = false,
91  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
92 
93  std::auto_ptr<te::da::DataSet> getDataSet(const std::string& name,
94  const std::string& propertyName,
95  const te::gm::Geometry* g,
98  bool connected = false,
99  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
100 
101  std::auto_ptr<te::da::DataSet> getDataSet(const std::string& name,
102  const ObjectIdSet* oids,
104  bool connected = false,
105  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
106 
107  std::auto_ptr<te::da::DataSet> query(const te::da::Select& q,
109  bool connected = false,
110  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
111 
112  std::auto_ptr<te::da::DataSet> query(const std::string& query,
114  bool connected = false,
115  const te::common::AccessPolicy accessPolicy = te::common::RAccess);
116 
117  void execute(const te::da::Query& command);
118 
119  void execute(const std::string& command);
120 
121  std::auto_ptr<te::da::PreparedQuery> getPrepared(const std::string& qName = std::string(""));
122 
123  std::auto_ptr<te::da::BatchExecutor> getBatchExecutor();
124 
125  void cancel();
126 
127  boost::int64_t getLastGeneratedId();
128 
129  std::string escape(const std::string& value);
130 
131  std::vector<std::string> getDataSetNames();
132 
133  std::size_t getNumberOfDataSets();
134 
135  std::auto_ptr<te::da::DataSetType> getDataSetType(const std::string& name);
136 
137  boost::ptr_vector<te::dt::Property> getProperties(const std::string& datasetName);
138 
139  std::auto_ptr<te::dt::Property> getProperty(const std::string& datasetName, const std::string& name);
140 
141  std::auto_ptr<te::dt::Property> getProperty(const std::string& datasetName, std::size_t propertyPos);
142 
143  std::vector<std::string> getPropertyNames(const std::string& datasetName);
144 
145  std::size_t getNumberOfProperties(const std::string& datasetName);
146 
147  bool propertyExists(const std::string& datasetName, const std::string& name);
148 
149 // TODO: rever o caso colunas geometricas => adicionar automaticamente as colunas do box => atualizar o cache
150  void addProperty(const std::string& datasetName, te::dt::Property* p);
151 
152 // TODO: rever o caso colunas geometricas => remover as colunas do box => atualizar o cache
153  void dropProperty(const std::string& datasetName, const std::string& name);
154 
155 // TODO: rever o caso colunas geometricas => atualizar o cache e a tabela de metadados
156  void renameProperty(const std::string& datasetName,
157  const std::string& propertyName,
158  const std::string& newPropertyName);
159 
160  void changePropertyDefinition(const std::string& datasetName, const std::string& propName, te::dt::Property* newProp);
161 
162  std::auto_ptr<te::da::PrimaryKey> getPrimaryKey(const std::string& datasetName);
163 
164  bool primaryKeyExists(const std::string& datasetName, const std::string& name);
165 
166  void addPrimaryKey(const std::string& datasetName, te::da::PrimaryKey* pk);
167 
168  void dropPrimaryKey(const std::string& datasetName);
169 
170  std::auto_ptr<te::da::ForeignKey> getForeignKey(const std::string& datasetName, const std::string& name);
171 
172  std::vector<std::string> getForeignKeyNames(const std::string& datasetName);
173 
174  bool foreignKeyExists(const std::string& datasetName, const std::string& name);
175 
176  void addForeignKey(const std::string& datasetName, te::da::ForeignKey* fk);
177 
178  void dropForeignKey(const std::string& datasetName, const std::string& fkName);
179 
180  std::auto_ptr<te::da::UniqueKey> getUniqueKey(const std::string& datasetName, const std::string& name);
181 
182  std::vector<std::string> getUniqueKeyNames(const std::string& datasetName);
183 
184  bool uniqueKeyExists(const std::string& datasetName, const std::string& name);
185 
186  void addUniqueKey(const std::string& datasetName, te::da::UniqueKey* uk);
187 
188  void dropUniqueKey(const std::string& datasetName, const std::string& name);
189 
190  std::auto_ptr<te::da::CheckConstraint> getCheckConstraint(const std::string& datasetName, const std::string& name);
191 
192  std::vector<std::string> getCheckConstraintNames(const std::string& datasetName);
193 
194  bool checkConstraintExists(const std::string& datasetName, const std::string& name);
195 
196  void addCheckConstraint(const std::string& datasetName, te::da::CheckConstraint* cc);
197 
198  void dropCheckConstraint(const std::string& datasetName, const std::string& name);
199 
200  std::auto_ptr<te::da::Index> getIndex(const std::string& datasetName, const std::string& name);
201 
202  std::vector<std::string> getIndexNames(const std::string& datasetName);
203 
204  bool indexExists(const std::string& datasetName, const std::string& name);
205 
206  void addIndex(const std::string& datasetName, te::da::Index* idx,
207  const std::map<std::string, std::string>& options);
208 
209  void dropIndex(const std::string& datasetName, const std::string& idxName);
210 
211  std::auto_ptr<te::da::Sequence> getSequence(const std::string& name);
212 
213  std::vector<std::string> getSequenceNames();
214 
215  bool sequenceExists(const std::string& name);
216 
217  void addSequence(te::da::Sequence* sequence);
218 
219  void dropSequence(const std::string& name);
220 
221  std::auto_ptr<te::gm::Envelope> getExtent(const std::string& datasetName,
222  const std::string& propertyName);
223 
224  std::auto_ptr<te::gm::Envelope> getExtent(const std::string& datasetName,
225  std::size_t propertyPos);
226 
227  std::size_t getNumberOfItems(const std::string& datasetName);
228 
229  bool hasDataSets();
230 
231  bool dataSetExists(const std::string& name);
232 
233  void createDataSet(te::da::DataSetType* dt, const std::map<std::string, std::string>& options);
234 
235  void cloneDataSet(const std::string& name,
236  const std::string& cloneName,
237  const std::map<std::string, std::string>& options);
238 
239  void dropDataSet(const std::string& name);
240 
241  void renameDataSet(const std::string& name, const std::string& newName);
242 
243  void add(const std::string& datasetName,
244  te::da::DataSet* d,
245  const std::map<std::string, std::string>& options,
246  std::size_t limit = 0);
247 
248  void remove(const std::string& datasetName, const te::da::ObjectIdSet* oids = 0);
249 
250  void update(const std::string& datasetName,
251  te::da::DataSet* dataset,
252  const std::vector<std::size_t>& properties,
253  const te::da::ObjectIdSet* oids,
254  const std::map<std::string, std::string>& options,
255  std::size_t limit = 0);
256 
257  void update(const std::string& datasetName,
258  te::da::DataSet* dataset,
259  const std::vector< std::set<int> >& properties,
260  const std::vector<size_t>& ids);
261 
262  void optimize(const std::map<std::string, std::string>& opInfo);
263 
264  DataSource* getAdoDataSource() const;
265 
266  protected:
267 
268  /*!
269  \brief It update the DataSetType about the Primary Key.
270 
271  \param dt The DataSetType that will be updated.
272 
273  \exception Exception It throws an exception if the query execution fails.
274  */
275  void getPrimaryKey(te::da::DataSetType* dt);
276 
277  /*!
278  \brief It update the DataSetType about the Properties.
279 
280  \param dt The DataSetType that will be updated.
281 
282  \exception Exception It throws an exception if the query execution fails.
283  */
284  void getProperties(te::da::DataSetType* dt);
285 
286  /*!
287  \brief It update the DataSetType about the Unique Keys.
288 
289  \param dt The DataSetType that will be updated.
290 
291  \exception Exception It throws an exception if the query execution fails.
292  */
293  void getUniqueKeys(te::da::DataSetType* dt);
294 
295  /*!
296  \brief It update the DataSetType about the Indexes.
297 
298  \param dt The DataSetType that will be updated.
299 
300  \exception Exception It throws an exception if the query execution fails.
301  */
302  void getIndexes(te::da::DataSetType* dt);
303 
304  /*!
305  \brief It update the DataSetType about the Check Constraints.
306 
307  \param dt The DataSetType that will be updated.
308 
309  \exception Exception It throws an exception if the query execution fails.
310  */
311  void getCheckConstraints(te::da::DataSetType* dt);
312 
313  /*!
314  \brief It insert a geometry property in the geometry_clumns (SFS Schema).
315 
316  \param datasetName The DataSet name.
317  \param geomProp The geometry property.
318 
319  \exception Exception It throws an exception if the query execution fails.
320  */
321  void insertIntoGeometryColumns(const std::string& datasetName,
322  te::gm::GeometryProperty* geomProp);
323 
324  private:
325 
326  DataSource* m_ds; //!< The ADO data source associated to this transactor.
327  Connection* m_conn; //!< The connection used by this transactor.
328  bool m_isInTransaction; //!< Tells if there is a transaction in progress.
329 
330  };
331 
333  {
334  return m_ds;
335  }
336 
337  } // end namespace ado
338 } // end namespace te
339 
340 #endif // __TERRALIB_ADO_INTERNAL_DATASOURCETRANSACTOR_H
341 
342 
The transactor class for the Microsoft Access driver.
Definition: Transactor.h:62
Geometric property.
A class that models the description of a dataset.
Definition: DataSetType.h:72
#define TEADOEXPORT
You can use this macro in order to export/import classes and functions from this module.
Definition: Config.h:130
Configuration flags for the TerraLib ADO Data Access driver.
SpatialRelation
Spatial relations between geometric objects.
Definition: Enums.h:127
It describes a sequence (a number generator).
Definition: Sequence.h:56
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
A class that implements a connection to a ADO database.
Definition: Connection.h:60
It models a property definition.
Definition: Property.h:59
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
URI C++ Library.
DataSource * m_ds
The ADO data source associated to this transactor.
Definition: Transactor.h:326
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:74
A Select models a query to be used when retrieving data from a DataSource.
Definition: Select.h:65
Connection * m_conn
The connection used by this transactor.
Definition: Transactor.h:327
Implementation of the data source class for the ADO driver.
DataSource * getAdoDataSource() const
Definition: Transactor.h:332
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:328
It describes a primary key (pk) constraint.
Definition: PrimaryKey.h:52
The ADO driver.
Definition: DataSource.h:61
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