All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Transactor.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008-2013 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 // TerraLib
21 #include "../common/Translator.h"
22 #include "../dataaccess/dataset/ObjectId.h"
23 #include "../dataaccess/dataset/ObjectIdSet.h"
24 #include "../dataaccess/query/DataSetName.h"
25 #include "../dataaccess/query/Query.h"
26 #include "../dataaccess/query/Select.h"
27 #include "../dataaccess/utils/Utils.h"
28 #include "../datatype/ByteArray.h"
29 #include "../datatype/Date.h"
30 #include "../datatype/TimeInstant.h"
31 #include "../geometry/Envelope.h"
32 #include "../geometry/GeometryProperty.h"
33 #include "../srs/Config.h"
34 #include "DataSource.h"
35 #include "DataSet.h"
36 #include "SQLVisitor.h"
37 #include "Transactor.h"
38 #include "Utils.h"
39 
40 // OGR
41 #include <ogrsf_frmts.h>
42 
43 OGRFieldType GetOGRType(int te_type)
44 {
45  switch (te_type)
46  {
47  case te::dt::CHAR_TYPE:
48  case te::dt::UCHAR_TYPE:
50  return OFTString;
51  break;
52 
53  case te::dt::INT16_TYPE:
55  case te::dt::INT32_TYPE:
57  case te::dt::INT64_TYPE:
59  return OFTInteger;
60  break;
61 
62  case te::dt::FLOAT_TYPE:
65  return OFTReal;
66  break;
67 
69  return OFTDateTime;
70  break;
71  };
72 
73  return OFTInteger;
74 }
75 
77  : te::da::DataSourceTransactor(),
78  m_ogrDs(ds)
79 {
80 }
81 
83 {
84 }
85 
87 {
88  return 0;
89 }
90 
92 {
93 }
94 
96 {
97  if (!m_ogrDs->getOGRDataSource())
98  return;
99 
100  // we have to reopen datasource so pending data gets synched to disk!
101  m_ogrDs->open();
102 }
103 
105 {
106 }
107 
109 {
110  return false;
111 }
112 
113 std::auto_ptr<te::da::DataSet> te::ogr::Transactor::getDataSet(const std::string& name,
114  te::common::TraverseType /*travType*/,
115  bool /*connected*/,
117 {
118  if (!m_ogrDs->getOGRDataSource())
119  return std::auto_ptr<te::da::DataSet>();
120 
121  OGRDataSource* ds = OGRSFDriverRegistrar::Open(m_ogrDs->getOGRDataSource()->GetName());
122 
123  std::string sql = "SELECT FID, * FROM \'" + name + "\'";
124  OGRLayer* layer = ds->ExecuteSQL(sql.c_str(), 0, 0);
125 
126  if(layer == 0)
127  throw Exception(TE_TR("The informed data set could not be found in the data source."));
128 
129  return std::auto_ptr<te::da::DataSet>(new DataSet(ds, layer));
130 }
131 
132 std::auto_ptr<te::da::DataSet> te::ogr::Transactor::getDataSet(const std::string& name,
133  const std::string& /*propertyName*/,
134  const te::gm::Envelope* e,
136  te::common::TraverseType /*travType*/,
137  bool /*connected*/,
139 {
140  if (!m_ogrDs->getOGRDataSource())
141  return std::auto_ptr<te::da::DataSet>();
142 
143  OGRDataSource* ds = OGRSFDriverRegistrar::Open(m_ogrDs->getOGRDataSource()->GetName());
144 
145  std::string sql = "SELECT FID, * FROM \'" + name + "\'";
146  OGRLayer* layer = ds->ExecuteSQL(sql.c_str(), 0, 0);
147 
148  if(layer == 0)
149  throw Exception(TE_TR("The informed data set could not be found in the data source."));
150 
151  layer->SetSpatialFilterRect(e->m_llx, e->m_lly, e->m_urx, e->m_ury);
152 
153  return std::auto_ptr<te::da::DataSet>(new DataSet(ds, layer));
154 }
155 
156 std::auto_ptr<te::da::DataSet> te::ogr::Transactor::getDataSet(const std::string& name,
157  const std::string& /*propertyName*/,
158  const te::gm::Geometry* g,
160  te::common::TraverseType /*travType*/,
161  bool /*connected*/,
163 {
164  if (!m_ogrDs->getOGRDataSource())
165  return std::auto_ptr<te::da::DataSet>();
166 
167  OGRDataSource* ds = OGRSFDriverRegistrar::Open(m_ogrDs->getOGRDataSource()->GetName());
168 
169  std::string sql = "SELECT FID, * FROM \'" + name + "\'";
170  OGRLayer* layer = ds->ExecuteSQL(sql.c_str(), 0, 0);
171 
172  if(layer == 0)
173  throw Exception(TE_TR("The informed data set could not be found in the data source."));
174 
175  OGRGeometry* ogrg = Convert2OGR(g);
176 
177  layer->SetSpatialFilter(ogrg);
178 
179  OGRGeometryFactory::destroyGeometry(ogrg);
180 
181  return std::auto_ptr<te::da::DataSet>(new DataSet(ds, layer));
182 }
183 
184 std::auto_ptr<te::da::DataSet> te::ogr::Transactor::query(const te::da::Select& q,
185  te::common::TraverseType /*travType*/,
186  bool /*connected*/,
188 {
189  if (!m_ogrDs->getOGRDataSource())
190  return std::auto_ptr<te::da::DataSet>();
191 
192  OGRDataSource* ds = OGRSFDriverRegistrar::Open(m_ogrDs->getOGRDataSource()->GetName());
193 
194  std::string sql;
195 
196  SQLVisitor visitor(*m_ogrDs->getDialect(), sql);
197 
198  q.accept(visitor);
199 
200  sql = RemoveSpatialSql(sql);
201 
202  OGRLayer* layer = ds->ExecuteSQL(sql.c_str(), 0, 0);
203 
204  if(layer == 0)
205  throw Exception(TE_TR("Could not retrieve the DataSet from data source."));
206 
207  te::gm::Envelope* e = visitor.getMBR();
208 
209  if(e != 0)
210  layer->SetSpatialFilterRect(e->m_llx, e->m_lly, e->m_urx, e->m_ury);
211 
212  return std::auto_ptr<te::da::DataSet>(new DataSet(ds, layer));
213 }
214 
215 std::auto_ptr<te::da::DataSet> te::ogr::Transactor::query(const std::string& query,
216  te::common::TraverseType /*travType*/,
217  bool /*connected*/,
219 {
220  if (!m_ogrDs->getOGRDataSource())
221  return std::auto_ptr<te::da::DataSet>();
222 
223  OGRDataSource* ds = OGRSFDriverRegistrar::Open(m_ogrDs->getOGRDataSource()->GetName());
224 
225  // Adding FID attribute case "SELECT *"
226  std::string queryCopy = query;
227  std::size_t pos = queryCopy.find("*");
228  if(pos != std::string::npos)
229  {
230  std::string fid = "FID, *";
231  queryCopy.replace(pos, 1, fid);
232  }
233 
234  OGRLayer* layer = ds->ExecuteSQL(queryCopy.c_str(), 0, 0);
235 
236  if(layer == 0)
237  throw Exception(TE_TR("Could not retrieve the DataSet from data source."));
238 
239  return std::auto_ptr<te::da::DataSet>(new DataSet(ds, layer));
240 }
241 
243 {
244  std::string sql;
245  SQLVisitor v(*m_ogrDs->getDialect(), sql);
246 
247  command.accept(v);
248 
249  execute(sql);
250 }
251 
252 void te::ogr::Transactor::execute(const std::string& command)
253 {
254  if (!m_ogrDs->getOGRDataSource())
255  return;
256 
257  OGRLayer* layer = m_ogrDs->getOGRDataSource()->ExecuteSQL(command.c_str(), 0, "");
258 
259  if(layer != 0)
260  m_ogrDs->getOGRDataSource()->ReleaseResultSet(layer);
261 }
262 
263 std::auto_ptr<te::da::PreparedQuery> te::ogr::Transactor::getPrepared(const std::string& /*qName*/)
264 {
265  return std::auto_ptr<te::da::PreparedQuery>(0);
266 }
267 
268 std::auto_ptr<te::da::BatchExecutor> te::ogr::Transactor::getBatchExecutor()
269 {
270  return std::auto_ptr<te::da::BatchExecutor>(0);
271 }
272 
274 {
275 }
276 
278 {
279  return 0;
280 }
281 
282 std::string te::ogr::Transactor::escape(const std::string& value)
283 {
284  return value;
285 }
286 
287 std::vector<std::string> te::ogr::Transactor::getDataSetNames()
288 {
289  std::vector<std::string> names;
290 
291  if (!m_ogrDs->getOGRDataSource())
292  return names;
293 
294  for(int i=0; i<m_ogrDs->getOGRDataSource()->GetLayerCount(); i++)
295  names.push_back(m_ogrDs->getOGRDataSource()->GetLayer(i)->GetName());
296 
297  return names;
298 }
299 
301 {
302  if (!m_ogrDs->getOGRDataSource())
303  return 0;
304 
305  return m_ogrDs->getOGRDataSource()->GetLayerCount();
306 }
307 
308 std::auto_ptr<te::da::DataSetType> te::ogr::Transactor::getDataSetType(const std::string& name)
309 {
310  if (!m_ogrDs->getOGRDataSource())
311  return std::auto_ptr<te::da::DataSetType>();
312 
313  std::string sql("SELECT FID, * FROM \'");
314  sql += name + "\'";
315 
316  OGRLayer* l = m_ogrDs->getOGRDataSource()->ExecuteSQL(sql.c_str(), 0, 0);
317 
318  if(l==0)
319  return std::auto_ptr<te::da::DataSetType>();
320 
321  std::auto_ptr<te::da::DataSetType> type(Convert2TerraLib(l->GetLayerDefn()));
322 
323  type->setName(name);
324 
325  const char* colIdName = l->GetFIDColumn();
326 
327  if(colIdName == 0 || colIdName[0] == '\0')
328  colIdName = "FID";
329 
330  int pos = l->GetLayerDefn()->GetFieldIndex(colIdName);
331  if(pos >= 0)
332  {
333  te::da::PrimaryKey* pk = new te::da::PrimaryKey(colIdName, type.get());
334  pk->add(type->getProperty(pos));
335  }
336 
337  int srs = te::ogr::Convert2TerraLibProjection(l->GetSpatialRef());
338 
340 
341  if(gp != 0)
342  gp->setSRID(srs);
343 
344  m_ogrDs->getOGRDataSource()->ReleaseResultSet(l);
345 
346  return type;
347 }
348 
349 std::auto_ptr<te::da::DataSetTypeCapabilities> te::ogr::Transactor::getCapabilities(const std::string &name)
350 {
351  std::auto_ptr<te::da::DataSetTypeCapabilities> cap(new te::da::DataSetTypeCapabilities);
352 
353  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(name.c_str());
354 
355  if(l != 0)
356  {
357  cap->setSupportAddColumn((l->TestCapability(OLCCreateField) == 0) ? false : true);
358  cap->setSupportRemoveColumn((l->TestCapability(OLCDeleteField) == 0) ? false : true);
359  cap->setSupportDataEdition((l->TestCapability(OLCRandomWrite) == 0) ? false : true);
360  }
361 
362  return cap;
363 }
364 
365 boost::ptr_vector<te::dt::Property> te::ogr::Transactor::getProperties(const std::string& datasetName)
366 {
367  boost::ptr_vector<te::dt::Property> ps;
368 
369  if (!m_ogrDs->getOGRDataSource())
370  return ps;
371 
372  std::string sql("SELECT FID, * FROM \'");
373  sql += datasetName + "\'";
374 
375  OGRLayer* l = m_ogrDs->getOGRDataSource()->ExecuteSQL(sql.c_str(), 0, 0);
376 
377  if(l!=0)
378  {
379  int srs = te::ogr::Convert2TerraLibProjection(l->GetSpatialRef());
380  std::auto_ptr<te::da::DataSetType> dt(Convert2TerraLib(l->GetLayerDefn(),srs));
381  std::vector<te::dt::Property*> props = dt->getProperties();
382  std::vector<te::dt::Property*>::iterator it;
383 
384  for(it=props.begin(); it!=props.end(); ++it)
385  ps.push_back((*it)->clone());
386  }
387 
388  m_ogrDs->getOGRDataSource()->ReleaseResultSet(l);
389 
390  return ps;
391 }
392 
393 std::auto_ptr<te::dt::Property> te::ogr::Transactor::getProperty(const std::string& datasetName, const std::string& name)
394 {
395  if (!m_ogrDs->getOGRDataSource())
396  return std::auto_ptr<te::dt::Property>();
397 
398  int idx = -1;
399  std::string sql("SELECT FID, * FROM \'");
400  sql += datasetName + "\'";
401 
402  OGRLayer* l = m_ogrDs->getOGRDataSource()->ExecuteSQL(sql.c_str(), 0, 0);
403 
404  if(l != 0)
405  idx = l->GetLayerDefn()->GetFieldIndex(name.c_str());
406 
407  m_ogrDs->getOGRDataSource()->ReleaseResultSet(l);
408 
409  return getProperty(datasetName, idx);
410 }
411 
412 std::auto_ptr<te::dt::Property> te::ogr::Transactor::getProperty(const std::string& datasetName, std::size_t propertyPos)
413 {
414  OGRDataSource* ogrds = m_ogrDs->getOGRDataSource();
415  if (!ogrds)
416  return std::auto_ptr<te::dt::Property>();
417 
418  std::auto_ptr<te::dt::Property> res;
419  std::string sql ("SELECT FID, * FROM \'");
420  sql += datasetName + "\'";
421 
422  OGRLayer* l = ogrds->ExecuteSQL(sql.c_str(), 0, 0);
423 
424  if(l != 0)
425  {
426  OGRFeatureDefn* def = l->GetLayerDefn();
427  OGRFieldDefn* fdef = def->GetFieldDefn(propertyPos);
428 
429  if(fdef != 0)
430  res.reset(Convert2TerraLib(fdef));
431  }
432 
433  m_ogrDs->getOGRDataSource()->ReleaseResultSet(l);
434 
435  return res;
436 }
437 
438 std::vector<std::string> te::ogr::Transactor::getPropertyNames(const std::string& datasetName)
439 {
440  OGRDataSource* ogrds = m_ogrDs->getOGRDataSource();
441  if (!ogrds)
442  return std::vector<std::string>();
443 
444  std::vector<std::string> res;
445  std::string sql ("SELECT FID, * FROM \'");
446  sql += datasetName + "\'";
447 
448  OGRLayer* l = ogrds->ExecuteSQL(sql.c_str(), 0, 0);
449 
450  if(l != 0)
451  {
452  OGRFeatureDefn* def = l->GetLayerDefn();
453 
454  for(int i=0; i<def->GetFieldCount(); i++)
455  res.push_back(def->GetFieldDefn(i)->GetNameRef());
456  }
457 
458  ogrds->ReleaseResultSet(l);
459 
460  return res;
461 }
462 
463 std::size_t te::ogr::Transactor::getNumberOfProperties(const std::string& datasetName)
464 {
465  OGRDataSource* ogrds = m_ogrDs->getOGRDataSource();
466  if (!ogrds)
467  return 0;
468 
469  std::string sql("SELECT FID, * FROM \'");
470  sql += datasetName + "\'";
471 
472  OGRLayer* l = ogrds->ExecuteSQL(sql.c_str(), 0, 0);
473 
474  int res = 0;
475 
476  if(l != 0)
477  {
478  res = l->GetLayerDefn()->GetFieldCount();
479  ogrds->ReleaseResultSet(l);
480  }
481 
482  return res;
483 }
484 
485 bool te::ogr::Transactor::propertyExists(const std::string& datasetName, const std::string& name)
486 {
487  OGRDataSource* ogrds = m_ogrDs->getOGRDataSource();
488  if (!ogrds)
489  return false;
490 
491  std::string sql("SELECT FID, * FROM \'");
492  sql += datasetName + "\'";
493  bool res = false;
494 
495  OGRLayer* l = ogrds->ExecuteSQL(sql.c_str(), 0, 0);
496 
497  if(l != 0)
498  {
499  res = (l->GetLayerDefn()->GetFieldIndex(name.c_str()) != -1);
500  ogrds->ReleaseResultSet(l);
501  }
502 
503  return res;
504 }
505 
506 void te::ogr::Transactor::addProperty(const std::string& datasetName, te::dt::Property* p)
507 {
508  if (!m_ogrDs->getOGRDataSource())
509  return;
510 
511  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(datasetName.c_str());
512 
513  if(l != 0)
514  {
515  if(p->getType() != te::dt::GEOMETRY_TYPE)
516  {
517 // if(!l->TestCapability(OLCCreateField))
518 // throw Exception(TE_TR("This dataset do not support add fields operation."));
519 
520  OGRFieldDefn* nField = Convert2OGR(p);
521  OGRErr error = l->CreateField(nField);
522 
523  delete nField;
524 
525  if(error != OGRERR_NONE)
526  throw Exception(TE_TR("Error when attempting add the property: " + p->getName() + "."));
527 
528  error = l->SyncToDisk();
529 
530  if(error != OGRERR_NONE)
531  throw Exception(TE_TR("Error saving changes on the file."));
532  }
533  }
534 }
535 
536 void te::ogr::Transactor::dropProperty(const std::string& datasetName, const std::string& name)
537 {
538  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(datasetName.c_str());
539 
540  if(l != 0)
541  {
542  if(!l->TestCapability(OLCDeleteField))
543  throw Exception(TE_TR("This dataset do not support remove properties operation."));
544 
545  int fPos = l->GetLayerDefn()->GetFieldIndex(name.c_str());
546 
547  if(fPos < 0)
548  throw Exception(TE_TR("Field not found."));
549 
550  OGRErr error = l->DeleteField(fPos);
551 
552  if(error != OGRERR_NONE)
553  throw Exception(TE_TR("Error when attempting remove the property."));
554 
555  error = l->SyncToDisk();
556 
557  if(error != OGRERR_NONE)
558  throw Exception(TE_TR("Error saving changes on the file."));
559  }
560 }
561 
562 void te::ogr::Transactor::renameProperty(const std::string& datasetName,
563  const std::string& propertyName,
564  const std::string& newPropertyName)
565 {
566  if (!m_ogrDs->getOGRDataSource())
567  return;
568 
569  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(datasetName.c_str());
570 
571  if(l != 0)
572  {
573  int idx = l->GetLayerDefn()->GetFieldIndex(propertyName.c_str());
574 
575  if(idx == -1)
576  throw Exception(TE_TR("Field to be renamed does not exists."));
577 
578  OGRFieldDefn* df = l->GetLayerDefn()->GetFieldDefn(idx);
579 
580  OGRFieldDefn* dfn = new OGRFieldDefn(df);
581 
582  dfn->SetName(newPropertyName.c_str());
583 
584  OGRErr err = l->AlterFieldDefn(idx, dfn, ALTER_NAME_FLAG);
585 
586  if(err != OGRERR_NONE)
587  throw Exception(TE_TR("Fail to rename field."));
588  }
589 }
590 
591 void te::ogr::Transactor::changePropertyDefinition(const std::string& datasetName, const std::string& propName, te::dt::Property* newProp)
592 {
593  if (!m_ogrDs->getOGRDataSource())
594  return;
595 
596  std::auto_ptr<te::dt::Property> p;
597 
598  p.reset(newProp);
599 
600  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(datasetName.c_str());
601 
602  if(l != 0)
603  {
604  if(!l->TestCapability(OLCAlterFieldDefn))
605  throw Exception(TE_TR("This data source do not support the operation of alter columns type."));
606 
607  int idx = l->GetLayerDefn()->GetFieldIndex(propName.c_str());
608 
609  if(idx == -1)
610  throw Exception(TE_TR("Field to be renamed does not exists."));
611 
612  OGRFieldDefn* dfn = new OGRFieldDefn(l->GetLayerDefn()->GetFieldDefn(idx));
613 
614  dfn->SetType(GetOGRType(newProp->getType()));
615 
616  OGRErr err = l->AlterFieldDefn(idx, dfn, ALTER_TYPE_FLAG);
617 
618  if(err != OGRERR_NONE)
619  throw Exception(TE_TR("Fail to to change field type."));
620 
621  std::string name = m_ogrDs->getOGRDataSource()->GetName();
622 
623  err = l->SyncToDisk();
624  }
625 }
626 
627 std::auto_ptr<te::da::PrimaryKey> te::ogr::Transactor::getPrimaryKey(const std::string& datasetName)
628 {
629  if (!m_ogrDs->getOGRDataSource())
630  return std::auto_ptr<te::da::PrimaryKey>();
631 
632  std::auto_ptr<te::da::PrimaryKey> res;
633  std::string sql("SELECT FID, * FROM \'");
634  sql += datasetName + "\'";
635 
636  OGRLayer* layer = m_ogrDs->getOGRDataSource()->ExecuteSQL(sql.c_str(), 0, 0);
637 
638  if(layer != 0)
639  {
640  const char* colIdName = layer->GetFIDColumn();
641 
642  if(colIdName == 0 || colIdName[0] == '\0')
643  colIdName = "FID";
644 
645  int pos = layer->GetLayerDefn()->GetFieldIndex(colIdName);
646 
647  if(pos >= 0)
648  {
649  res.reset(new te::da::PrimaryKey);
650  res->add(getProperty(datasetName, pos).get());
651  }
652  }
653 
654  m_ogrDs->getOGRDataSource()->ReleaseResultSet(layer);
655 
656  return res;
657 }
658 
659 bool te::ogr::Transactor::primaryKeyExists(const std::string& /*datasetName*/, const std::string& /*name*/)
660 {
661  return false;
662 }
663 
664 void te::ogr::Transactor::addPrimaryKey(const std::string& /*datasetName*/, te::da::PrimaryKey* /*pk*/)
665 {
666 }
667 
668 void te::ogr::Transactor::dropPrimaryKey(const std::string& /*datasetName*/)
669 {
670 }
671 
672 std::auto_ptr<te::da::ForeignKey> te::ogr::Transactor::getForeignKey(const std::string& /*datasetName*/, const std::string& /*name*/)
673 {
674  return std::auto_ptr<te::da::ForeignKey>();
675 }
676 
677 std::vector<std::string> te::ogr::Transactor::getForeignKeyNames(const std::string& /*datasetName*/)
678 {
679  return std::vector<std::string>();
680 }
681 
682 bool te::ogr::Transactor::foreignKeyExists(const std::string& /*datasetName*/, const std::string& /*name*/)
683 {
684  return false;
685 }
686 
687 void te::ogr::Transactor::addForeignKey(const std::string& /*datasetName*/, te::da::ForeignKey* /*fk*/)
688 {
689 }
690 
691 void te::ogr::Transactor::dropForeignKey(const std::string& /*datasetName*/, const std::string& /*fkName*/)
692 {
693 }
694 
695 std::auto_ptr<te::da::UniqueKey> te::ogr::Transactor::getUniqueKey(const std::string& /*datasetName*/, const std::string& /*name*/)
696 {
697  return std::auto_ptr<te::da::UniqueKey>();
698 }
699 
700 std::vector<std::string> te::ogr::Transactor::getUniqueKeyNames(const std::string& /*datasetName*/)
701 {
702  return std::vector<std::string>();
703 }
704 
705 bool te::ogr::Transactor::uniqueKeyExists(const std::string& /*datasetName*/, const std::string& /*name*/)
706 {
707  return false;
708 }
709 
710 void te::ogr::Transactor::addUniqueKey(const std::string& /*datasetName*/, te::da::UniqueKey* /*uk*/)
711 {
712 }
713 
714 void te::ogr::Transactor::dropUniqueKey(const std::string& /*datasetName*/, const std::string& /*name*/)
715 {
716 }
717 
718 std::auto_ptr<te::da::CheckConstraint> te::ogr::Transactor::getCheckConstraint(const std::string& /*datasetName*/, const std::string& /*name*/)
719 {
720  return std::auto_ptr<te::da::CheckConstraint>();
721 }
722 
723 std::vector<std::string> te::ogr::Transactor::getCheckConstraintNames(const std::string& /*datasetName*/)
724 {
725  return std::vector<std::string>();
726 }
727 
728 bool te::ogr::Transactor::checkConstraintExists(const std::string& /*datasetName*/, const std::string& /*name*/)
729 {
730  return false;
731 }
732 
733 void te::ogr::Transactor::addCheckConstraint(const std::string& /*datasetName*/, te::da::CheckConstraint* /*cc*/)
734 {
735 }
736 
737 void te::ogr::Transactor::dropCheckConstraint(const std::string& /*datasetName*/, const std::string& /*name*/)
738 {
739 }
740 
741 std::auto_ptr<te::da::Index> te::ogr::Transactor::getIndex(const std::string& /*datasetName*/, const std::string& /*name*/)
742 {
743  return std::auto_ptr<te::da::Index>();
744 }
745 
746 std::vector<std::string> te::ogr::Transactor::getIndexNames(const std::string& /*datasetName*/)
747 {
748  return std::vector<std::string>();
749 }
750 
751 bool te::ogr::Transactor::indexExists(const std::string& /*datasetName*/, const std::string& /*name*/)
752 {
753  return false;
754 }
755 
756 void te::ogr::Transactor::addIndex(const std::string& /*datasetName*/, te::da::Index* /*idx*/,
757  const std::map<std::string, std::string>& /*options*/)
758 {
759 }
760 
761 void te::ogr::Transactor::dropIndex(const std::string& /*datasetName*/, const std::string& /*idxName*/)
762 {
763 }
764 
765 std::auto_ptr<te::da::Sequence> te::ogr::Transactor::getSequence(const std::string& /*name*/)
766 {
767  return std::auto_ptr<te::da::Sequence>();
768 }
769 
770 std::vector<std::string> te::ogr::Transactor::getSequenceNames()
771 {
772  return std::vector<std::string>();
773 }
774 
775 bool te::ogr::Transactor::sequenceExists(const std::string& /*name*/)
776 {
777  return false;
778 }
779 
781 {
782 }
783 
784 void te::ogr::Transactor::dropSequence(const std::string& /*name*/)
785 {
786 }
787 
788 std::auto_ptr<te::gm::Envelope> te::ogr::Transactor::getExtent(const std::string& datasetName,
789  const std::string& propertyName)
790 {
791  if (!m_ogrDs->getOGRDataSource())
792  return std::auto_ptr<te::gm::Envelope>();
793 
794  std::auto_ptr<te::gm::Envelope> res;
795  std::string sql("SELECT ");
796  sql += propertyName + " FROM \'";
797  sql += datasetName + "\'";
798 
799  OGRLayer* l = m_ogrDs->getOGRDataSource()->ExecuteSQL(sql.c_str(), 0, 0);
800 
801  if(l != 0)
802  {
803  std::auto_ptr<OGREnvelope> env(new OGREnvelope);
804 
805  if(l->GetExtent(env.get()) != OGRERR_NONE)
806  {
807  m_ogrDs->getOGRDataSource()->ReleaseResultSet(l);
808  throw Exception(TE_TR("Error when attempting get extent."));
809  }
810 
811  res.reset(Convert2TerraLib(env.get()));
812 
813  m_ogrDs->getOGRDataSource()->ReleaseResultSet(l);
814  }
815 
816  return res;
817 }
818 
819 std::auto_ptr<te::gm::Envelope> te::ogr::Transactor::getExtent(const std::string& datasetName,
820  std::size_t /*propertyPos*/)
821 {
822  return getExtent(datasetName, "OGR_GEOMETRY");
823 }
824 
825 std::size_t te::ogr::Transactor::getNumberOfItems(const std::string& datasetName)
826 {
827  if (!m_ogrDs->getOGRDataSource())
828  return 0;
829 
830  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(datasetName.c_str());
831 
832  if(l != 0)
833  return l->GetFeatureCount();
834 
835  return 0;
836 }
837 
839 {
840  if (!m_ogrDs->getOGRDataSource())
841  return false;
842 
843  return (m_ogrDs->getOGRDataSource()->GetLayerCount() > 0);
844 }
845 
846 bool te::ogr::Transactor::dataSetExists(const std::string& name)
847 {
848  if (!m_ogrDs->getOGRDataSource())
849  return false;
850 
851  return (m_ogrDs->getOGRDataSource()->GetLayerByName(name.c_str()) != 0);
852 }
853 
854 void te::ogr::Transactor::createDataSet(te::da::DataSetType* dt, const std::map<std::string, std::string>& /*options*/)
855 {
856  if (!m_ogrDs->getOGRDataSource())
857  return;
858 
859  if(!m_ogrDs->getOGRDataSource()->TestCapability(ODsCCreateLayer))
860  throw Exception(TE_TR("This driver does not support dataset creation."));
861 
862  OGRwkbGeometryType geomType = wkbUnknown;
863  OGRSpatialReference* srs = 0;
864  if(dt->hasGeom())
865  {
866  geomType = Convert2OGR(te::da::GetFirstGeomProperty(dt)->getGeometryType());
867  int srid = te::da::GetFirstGeomProperty(dt)->getSRID();
868  if (srid != TE_UNKNOWN_SRS)
869  {
870  srs = new OGRSpatialReference();
871  srs->importFromEPSG(srid);
872  }
873  }
874 
875  char** papszOptions = 0;
876  std::map<std::string, std::string>::const_iterator it = m_ogrDs->getConnectionInfo().begin();
877  while(it != m_ogrDs->getConnectionInfo().end())
878  {
879  if(it->first == "URI" || it->first == "SOURCE" || it->first == "DRIVER")
880  {
881  ++it;
882  continue;
883  }
884  papszOptions = CSLSetNameValue(papszOptions, it->first.c_str(), it->second.c_str());
885  ++it;
886  }
887 
888  OGRLayer* newLayer = m_ogrDs->getOGRDataSource()->CreateLayer(dt->getName().c_str(), srs, geomType, papszOptions);
889 
890  if(papszOptions)
891  CSLDestroy(papszOptions);
892 
893  if(newLayer == 0)
894  throw Exception(TE_TR("Error when attempting create the dataset type."));
895 
896  dt->setName(newLayer->GetName());
897 
898 // add the properties
899  for(size_t i = 0; i < dt->size(); ++i)
900  addProperty(dt->getName(), dt->getProperty(i));
901 }
902 
903 void te::ogr::Transactor::cloneDataSet(const std::string& name,
904  const std::string& cloneName,
905  const std::map<std::string, std::string>& /*options*/)
906 {
907  if (!m_ogrDs->getOGRDataSource())
908  return;
909 
910  if(!m_ogrDs->getOGRDataSource()->TestCapability(ODsCCreateLayer))
911  throw Exception(TE_TR("This driver does not support creates a dataset."));
912 
913  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(name.c_str());
914 
915  if(l == 0)
916  throw Exception(TE_TR("Could not retrieve the DataSet from data source."));
917 
918  OGRLayer* cl = m_ogrDs->getOGRDataSource()->CopyLayer(l, cloneName.c_str());
919 
920  if(cl == 0)
921  throw Exception(TE_TR("Error when attempting clone the dataset."));
922 }
923 
924 void te::ogr::Transactor::dropDataSet(const std::string& name)
925 {
926  if (!m_ogrDs->getOGRDataSource())
927  return;
928 
929  if(!m_ogrDs->getOGRDataSource()->TestCapability(ODsCDeleteLayer))
930  throw Exception(TE_TR("This driver does not support remove a dataset."));
931 
932  int i=0;
933 
934  for(; i<m_ogrDs->getOGRDataSource()->GetLayerCount(); i++)
935  if(name.compare(m_ogrDs->getOGRDataSource()->GetLayer(i)->GetName()) == 0)
936  break;
937 
938  if(i == m_ogrDs->getOGRDataSource()->GetLayerCount())
939  throw Exception(TE_TR("Could not retrieve the DataSet from data source."));
940 
941  if(m_ogrDs->getOGRDataSource()->DeleteLayer(i) != OGRERR_NONE)
942  throw Exception(TE_TR("Error when attempting to remove the dataset."));
943 }
944 
945 void te::ogr::Transactor::renameDataSet(const std::string& /*name*/, const std::string& /*newName*/)
946 {
947 }
948 
949 void te::ogr::Transactor::add(const std::string& datasetName,
950  te::da::DataSet* d,
951  const std::map<std::string, std::string>& options,
952  std::size_t limit)
953 {
954  if(limit == 0)
955  limit = std::string::npos;
956 
957  if (!m_ogrDs->getOGRDataSource())
958  return;
959 
960  OGRLayer* layer = m_ogrDs->getOGRDataSource()->GetLayerByName(datasetName.c_str());
961 
962  if(layer == 0)
963  throw Exception(TE_TR("Could not retrieve the DataSet from data source."));
964 
965  try
966  {
967  begin();
968 
969  std::size_t nproperties = d->getNumProperties();
970 
971  std::size_t nProcessedRows = 0;
972 
973  while(d->moveNext() && (nProcessedRows != limit))
974  {
975  OGRFeature* feat = OGRFeature::CreateFeature(layer->GetLayerDefn());
976 
977  std::size_t currfield = 0;
978 
979  for(std::size_t i = 0; i != nproperties; ++i)
980  {
981  if(d->isNull(i))
982  {
984  ++currfield;
985 
986  continue;
987  }
988 
989  switch(d->getPropertyDataType(i))
990  {
991  case te::dt::INT16_TYPE:
992  feat->SetField(currfield, d->getInt16(i));
993  ++currfield;
994  break;
995 
996  case te::dt::INT32_TYPE:
997  feat->SetField(currfield, d->getInt32(i));
998  ++currfield;
999  break;
1000 
1001  case te::dt::STRING_TYPE:
1002  feat->SetField(currfield, d->getAsString(i).c_str());
1003  ++currfield;
1004  break;
1005 
1006  case te::dt::DOUBLE_TYPE:
1007  feat->SetField(currfield, d->getDouble(i));
1008  ++currfield;
1009  break;
1010 
1011  case te::dt::NUMERIC_TYPE:
1012  feat->SetField(currfield, atof(d->getNumeric(i).c_str()));
1013  ++currfield;
1014  break;
1015 
1017  {
1018  std::auto_ptr<te::dt::ByteArray> ba(d->getByteArray(i));
1019  feat->SetField(currfield, ba->bytesUsed(), reinterpret_cast<unsigned char*>(ba->getData()));
1020  ++currfield;
1021  }
1022  break;
1023 
1024  case te::dt::DATETIME_TYPE:
1025  {
1026  std::auto_ptr<te::dt::DateTime> dtm(d->getDateTime(i));
1027 
1028  te::dt::Date* dtime = dynamic_cast<te::dt::Date*>(dtm.get());
1029 
1030  if(dtime)
1031  {
1032  feat->SetField(currfield,
1033  static_cast<int>(dtime->getYear()),
1034  static_cast<int>(dtime->getMonth()),
1035  static_cast<int>(dtime->getDay()));
1036  ++currfield;
1037  break;
1038  }
1039 
1040  te::dt::TimeDuration* tduration = dynamic_cast<te::dt::TimeDuration*>(dtm.get());
1041 
1042  if(tduration)
1043  {
1044  feat->SetField(currfield, 0, 0, 0,
1045  static_cast<int>(tduration->getHours()),
1046  static_cast<int>(tduration->getMinutes()),
1047  static_cast<int>(tduration->getSeconds()));
1048  ++currfield;
1049  break;
1050  }
1051 
1052  te::dt::TimeInstant* tinst = dynamic_cast<te::dt::TimeInstant*>(dtm.get());
1053 
1054  if(tinst)
1055  {
1056  feat->SetField(currfield,
1057  static_cast<int>(dtime->getYear()),
1058  static_cast<int>(dtime->getMonth()),
1059  static_cast<int>(dtime->getDay()),
1060  static_cast<int>(tduration->getHours()),
1061  static_cast<int>(tduration->getMinutes()),
1062  static_cast<int>(tduration->getSeconds()));
1063  ++currfield;
1064  break;
1065  }
1066 
1067  throw Exception (TE_TR("Unsupported date and time type by OGR."));
1068  }
1069  break;
1070 
1071  case te::dt::GEOMETRY_TYPE:
1072  {
1073  std::auto_ptr<te::gm::Geometry> geom(d->getGeometry(i));
1074  OGRGeometry* OGRgeom = Convert2OGR(geom.get());
1075  feat->SetGeometryDirectly(OGRgeom);
1076  }
1077  break;
1078 
1079  default:
1080  throw Exception(TE_TR("Unsupported data type by OGR."));
1081  }
1082  }
1083 
1084  if(layer->CreateFeature(feat) != OGRERR_NONE)
1085  {
1086  OGRFeature::DestroyFeature(feat);
1087  throw Exception(TE_TR("Fail to insert dataset item."));
1088  }
1089 
1090  OGRFeature::DestroyFeature(feat);
1091  nProcessedRows++;
1092  }
1093 
1094  commit();
1095  }
1096  catch(Exception& e)
1097  {
1098  rollBack();
1099  throw e;
1100  }
1101 }
1102 
1103 void te::ogr::Transactor::remove(const std::string& datasetName, const te::da::ObjectIdSet* oids)
1104 {
1105  if(!m_ogrDs->getOGRDataSource())
1106  return;
1107 
1108  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(datasetName.c_str());
1109 
1110  if(l == 0)
1111  throw Exception(TE_TR("Could not retrieve the DataSet from data source."));
1112 
1113  if(!l->TestCapability(OLCDeleteFeature))
1114  throw Exception(TE_TR("Driver does not support removal of features."));
1115 
1116  std::set<te::da::ObjectId*, te::common::LessCmp<te::da::ObjectId*> >::const_iterator it = oids->begin();
1117 
1118  while(it != oids->end())
1119  {
1120  begin();
1121 
1122  if(l->DeleteFeature(atoi((*it)->getValue()[0].toString().c_str())) != OGRERR_NONE)
1123  {
1124  rollBack();
1125  throw Exception(TE_TR("Error when attempting to remove the feature."));
1126  }
1127 
1128  ++it;
1129  }
1130 
1131  commit();
1132 }
1133 
1134 
1135 void te::ogr::Transactor::update(const std::string& datasetName,
1136  te::da::DataSet* /*dataset*/,
1137  const std::vector<std::size_t>& properties,
1138  const te::da::ObjectIdSet* /*oids*/,
1139  const std::map<std::string, std::string>& /*options*/,
1140  std::size_t /*limit*/)
1141 {
1142 }
1143 
1144 void te::ogr::Transactor::update(const std::string &datasetName, te::da::DataSet *dataset, const std::vector< std::set<int> >& properties,
1145  const std::vector<size_t>& ids)
1146 {
1147  if(m_ogrDs->getOGRDataSource() == 0)
1148  throw Exception(TE_TR("Data source failure"));
1149 
1150  OGRLayer* l = m_ogrDs->getOGRDataSource()->GetLayerByName(datasetName.c_str());
1151 
1152  if(l == 0)
1153  throw Exception(TE_TR("Could not retrieve dataset"));
1154 
1155  dataset->moveFirst();
1156  int i = 0;
1157 
1158  do
1159  {
1160  size_t id_pos = ids[0];
1161  int id = dataset->getInt32(id_pos);
1162 
1163  OGRFeature* feat = l->GetFeature(id)->Clone();
1164 
1165  std::set<int> ls = properties[i];
1166  std::set<int>::iterator it;
1167 
1168  for(it = ls.begin(); it != ls.end(); ++it)
1169  {
1170  int fpos = *it;
1171  int fpos_o = fpos - 1;
1172 
1173  switch(dataset->getPropertyDataType(fpos))
1174  {
1175  case te::dt::INT32_TYPE:
1176  feat->SetField(fpos_o, dataset->getInt32(fpos));
1177  break;
1178 
1179  case te::dt::DOUBLE_TYPE:
1180  case te::dt::NUMERIC_TYPE:
1181  feat->SetField(fpos_o, dataset->getDouble(fpos));
1182  break;
1183 
1184  case te::dt::STRING_TYPE:
1185  feat->SetField(fpos_o, dataset->getString(fpos).c_str());
1186  break;
1187  }
1188  }
1189 
1190  l->SetFeature(feat);
1191 
1192  i++;
1193  } while (dataset->moveNext());
1194 
1195  l->SyncToDisk();
1196 }
1197 
1198 void te::ogr::Transactor::optimize(const std::map<std::string, std::string>& /*opInfo*/)
1199 {
1200 }
1201 
1203 {
1204  return te::common::LATIN1;
1205 }
Property * getProperty(std::size_t i) const
It returns the i-th property.
std::vector< std::string > getUniqueKeyNames(const std::string &datasetName)
It gets the unique key names of the given dataset.
Definition: Transactor.cpp:700
te::common::CharEncoding getEncoding()
It return the DataSource current encoding.
void dropProperty(const std::string &datasetName, const std::string &name)
It removes a property from the given dataset.
Definition: Transactor.cpp:536
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).
Geometric property.
std::auto_ptr< te::gm::Envelope > getExtent(const std::string &datasetName, const std::string &propertyName)
It retrieves the bounding rectangle of the spatial property for the given dataset.
Definition: Transactor.cpp:788
void add(te::dt::Property *p)
It adds a property to the list of properties of the primary key.
Definition: PrimaryKey.h:123
void addForeignKey(const std::string &datasetName, te::da::ForeignKey *fk)
It adds a foreign key constraint to a dataset.
Definition: Transactor.cpp:687
Utility functions for the data access module.
void dropCheckConstraint(const std::string &datasetName, const std::string &name)
It removes the check constraint from the dataset.
Definition: Transactor.cpp:737
boost::int64_t getLastGeneratedId()
It returns the last id generated by an insertion command.
Definition: Transactor.cpp:277
A class that informs what kind of constraint and index is supported by a given data source...
TEOGREXPORT OGRGeometry * Convert2OGR(const te::gm::Geometry *teGeom)
It converts the TerraLib Geometry to OGR Geometry.
Definition: Utils.cpp:79
void setSRID(int srid)
It sets the spatial reference system identifier associated to this property.
virtual boost::int32_t getInt32(std::size_t i) const =0
Method for retrieving a 32-bit integer attribute value (4 bytes long).
CharEncoding
Supported charsets (character encoding).
A class for data providers of OGR.
bool isInTransaction() const
It returns true if a transaction is in progress, otherwise, it returns false.
Definition: Transactor.cpp:108
void commit()
It commits the transaction.
Definition: Transactor.cpp:95
bool hasGeom() const
It returns true if the DataSetType has at least one geometry property; otherwise, it returns false...
Definition: DataSetType.h:655
boost::ptr_vector< te::dt::Property > getProperties(const std::string &datasetName)
It retrieves the properties of the dataset.
Definition: Transactor.cpp:365
std::auto_ptr< te::da::Sequence > getSequence(const std::string &name)
It gets the sequence with the given name in the data source.
Definition: Transactor.cpp:765
std::auto_ptr< te::da::DataSetTypeCapabilities > getCapabilities(const std::string &name)
It gets capabilities about a data set.
Definition: Transactor.cpp:349
bool sequenceExists(const std::string &name)
It checks if a sequence with the given name exists in the data source.
Definition: Transactor.cpp:775
te::da::DataSource * getDataSource() const
It returns the parent data source of the transactor.
Definition: Transactor.cpp:86
A class that models the description of a dataset.
Definition: DataSetType.h:72
void addProperty(const std::string &datasetName, te::dt::Property *p)
It adds a new property to the dataset schema.
Definition: Transactor.cpp:506
long getSeconds() const
It returns the seconds of a minute - from 0 to 59.
Definition: TimeDuration.h:105
std::size_t getNumberOfProperties(const std::string &datasetName)
It gets the number of properties of the given dataset.
Definition: Transactor.cpp:463
std::auto_ptr< te::da::Index > getIndex(const std::string &datasetName, const std::string &name)
It gets the index with the given name from the dataset.
Definition: Transactor.cpp:741
bool checkConstraintExists(const std::string &datasetName, const std::string &name)
It checks if a check-constraint with the given name exists in the data source.
Definition: Transactor.cpp:728
void cloneDataSet(const std::string &name, const std::string &cloneName, const std::map< std::string, std::string > &options)
It clones the dataset in the data source.
Definition: Transactor.cpp:903
void dropForeignKey(const std::string &datasetName, const std::string &fkName)
It removes the foreign key constraint from the dataset schema.
Definition: Transactor.cpp:691
virtual std::auto_ptr< te::dt::ByteArray > getByteArray(std::size_t i) const =0
Method for retrieving a byte array.
bool indexExists(const std::string &datasetName, const std::string &name)
It checks if an index with the given name exists in the dataset.
Definition: Transactor.cpp:751
double m_urx
Upper right corner x-coordinate.
Definition: Envelope.h:346
void renameDataSet(const std::string &name, const std::string &newName)
It renames a dataset.
Definition: Transactor.cpp:945
SpatialRelation
Spatial relations between geometric objects.
Definition: Enums.h:122
It describes a sequence (a number generator).
Definition: Sequence.h:56
std::auto_ptr< te::da::PrimaryKey > getPrimaryKey(const std::string &datasetName)
It retrieves the primary key of the dataset.
Definition: Transactor.cpp:627
bool dataSetExists(const std::string &name)
It checks if a dataset with the given name exists in the data source.
Definition: Transactor.cpp:846
std::auto_ptr< te::da::CheckConstraint > getCheckConstraint(const std::string &datasetName, const std::string &name)
It gets the check constraint of the dataset with the given name.
Definition: Transactor.cpp:718
Transactor(DataSource *ds)
Definition: Transactor.cpp:76
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:118
virtual std::string getNumeric(std::size_t i) const =0
Method for retrieving a numeric attribute value.
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:345
TEOGREXPORT std::string RemoveSpatialSql(const std::string &sql)
Definition: Utils.cpp:529
std::auto_ptr< te::da::BatchExecutor > getBatchExecutor()
It creates a batch command executor.
Definition: Transactor.cpp:268
void dropUniqueKey(const std::string &datasetName, const std::string &name)
It removes the unique key constraint from the dataset.
Definition: Transactor.cpp:714
void dropDataSet(const std::string &name)
It removes the dataset schema from the data source.
Definition: Transactor.cpp:924
Implementation of a DataSet for OGR data provider.
Definition: DataSet.h:59
void update(const std::string &datasetName, te::da::DataSet *dataset, const std::vector< std::size_t > &properties, const te::da::ObjectIdSet *oids, const std::map< std::string, std::string > &options, std::size_t limit=0)
It updates the contents of a dataset for the set of data items.
It models a property definition.
Definition: Property.h:59
void cancel()
It requests that the data source stop the processing of the current command.
Definition: Transactor.cpp:273
bool foreignKeyExists(const std::string &datasetName, const std::string &name)
It checks if a foreign key with the given name exists in the data source.
Definition: Transactor.cpp:682
void remove(const std::string &datasetName, const te::da::ObjectIdSet *oids=0)
It removes all the informed items from the dataset.
virtual double getDouble(std::size_t i) const =0
Method for retrieving a double attribute value.
void optimize(const std::map< std::string, std::string > &opInfo)
For some data access drivers, this method will perform some operations to optimize the data storage...
A class to represent time instant.
Definition: TimeInstant.h:55
void addPrimaryKey(const std::string &datasetName, te::da::PrimaryKey *pk)
It adds a primary key constraint to the dataset schema.
Definition: Transactor.cpp:664
std::vector< std::string > getCheckConstraintNames(const std::string &datasetName)
It gets the check constraint names of the given dataset.
Definition: Transactor.cpp:723
bool primaryKeyExists(const std::string &datasetName, const std::string &name)
It checks if a primary key exists in the dataset.
Definition: Transactor.cpp:659
void begin()
It starts a new transaction.
Definition: Transactor.cpp:91
std::size_t getNumberOfDataSets()
It retrieves the number of data sets available in the data source.
Definition: Transactor.cpp:300
virtual bool moveNext()=0
It moves the internal pointer to the next item of the collection.
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
void addCheckConstraint(const std::string &datasetName, te::da::CheckConstraint *cc)
It adds a check constraint to the dataset.
Definition: Transactor.cpp:733
void setName(const std::string &name)
It sets the property name.
Definition: Property.h:136
double m_llx
Lower left corner x-coordinate.
Definition: Envelope.h:344
int getSRID() const
It returns the spatial reference system identifier associated to this property.
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
#define TE_UNKNOWN_SRS
A numeric value to represent a unknown SRS identification in TerraLib.
Definition: Config.h:44
A base class for date data types.
Definition: Date.h:53
This class represents a set of unique ids created in the same context. i.e. from the same data set...
Definition: ObjectIdSet.h:53
virtual bool isNull(std::size_t i) const =0
It checks if the attribute value is NULL.
void changePropertyDefinition(const std::string &datasetName, const std::string &propName, te::dt::Property *newProp)
Definition: Transactor.cpp:591
TEOGREXPORT te::gm::Geometry * Convert2TerraLib(OGRGeometry *ogrGeom)
It converts the OGR Geometry to TerraLib Geometry.
Definition: Utils.cpp:54
std::auto_ptr< te::dt::Property > getProperty(const std::string &datasetName, const std::string &name)
It retrieves the property with the given name from the dataset.
Definition: Transactor.cpp:393
A visitor for building an SQL statement using OGR dialect.
It models a foreign key constraint for a DataSetType.
Definition: ForeignKey.h:50
virtual std::string getAsString(std::size_t i, int precision=0) const
Method for retrieving a data value as a string plain representation.
Definition: DataSet.cpp:218
It describes a unique key (uk) constraint.
Definition: UniqueKey.h:53
std::size_t size() const
It returns the number of properties of the CompositeProperty.
std::auto_ptr< te::da::ForeignKey > getForeignKey(const std::string &datasetName, const std::string &name)
It retrieves the foreign key from the given dataset.
Definition: Transactor.cpp:672
virtual std::size_t getNumProperties() const =0
It returns the number of properties that composes an item of the dataset.
std::vector< std::string > getDataSetNames()
It It gets the dataset names available in the data source.
Definition: Transactor.cpp:287
The OGR data source provider.
Definition: DataSource.h:48
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
Definition: Geometry.h:73
void dropPrimaryKey(const std::string &datasetName)
It removes the primary key constraint from the dataset schema.
Definition: Transactor.cpp:668
A Select models a query to be used when retrieving data from a DataSource.
Definition: Select.h:65
virtual std::auto_ptr< te::gm::Geometry > getGeometry(std::size_t i) const =0
Method for retrieving a geometric attribute value.
void dropSequence(const std::string &name)
It removes the sequence from the data source.
Definition: Transactor.cpp:784
double m_lly
Lower left corner y-coordinate.
Definition: Envelope.h:345
void execute(const te::da::Query &command)
It executes the specified command using a generic query representation.
Definition: Transactor.cpp:242
void dropIndex(const std::string &datasetName, const std::string &idxName)
It removes the index from the dataset schema.
Definition: Transactor.cpp:761
int getType() const
It returns the property data type.
Definition: Property.h:143
A dataset is the unit of information manipulated by the data access module of TerraLib.
Definition: DataSet.h:112
std::string escape(const std::string &value)
It escapes a string for using in commands and queries.
Definition: Transactor.cpp:282
void createDataSet(te::da::DataSetType *dt, const std::map< std::string, std::string > &options)
It creates the dataset schema definition in the target data source.
Definition: Transactor.cpp:854
double m_ury
Upper right corner y-coordinate.
Definition: Envelope.h:347
virtual ReturnType accept(VisitorType &guest) const =0
It call the visit method from the guest object.
std::set< ObjectId *, te::common::LessCmp< ObjectId * > >::const_iterator end() const
Returns an iterator for the object ids in container.
A class to represent time duration with nano-second/micro-second resolution.
Definition: TimeDuration.h:51
void addSequence(te::da::Sequence *sequence)
It creates a new sequence in the data source.
Definition: Transactor.cpp:780
It describes a primary key (pk) constraint.
Definition: PrimaryKey.h:52
void renameProperty(const std::string &datasetName, const std::string &propertyName, const std::string &newPropertyName)
It renames a property of the given dataset.
Definition: Transactor.cpp:562
std::auto_ptr< te::da::DataSet > query(const te::da::Select &q, te::common::TraverseType travType=te::common::FORWARDONLY, bool connected=false, const te::common::AccessPolicy accessPolicy=te::common::RAccess)
It executes a query that may return some data using a generic query. A dataset can be connected or di...
Definition: Transactor.cpp:184
std::auto_ptr< te::da::DataSet > getDataSet(const std::string &name, te::common::TraverseType travType=te::common::FORWARDONLY, bool connected=false, const te::common::AccessPolicy accessPolicy=te::common::RAccess)
It gets the dataset identified by the given name. A dataset can be connected or disconnected. A connected dataset, after its creation through the data source transactor, continues to depend on the connection given by its associated data source. Differently, a disconnected dataset, after its creation, no more depends of the connection given by the data source, and it continues to live after the connection has been released to the data source.
Definition: Transactor.cpp:113
Implementation of a DataSet for OGR data provider.
void add(const std::string &datasetName, te::da::DataSet *d, const std::map< std::string, std::string > &options, std::size_t limit=0)
It adds data items to the dataset in the data source.
Definition: Transactor.cpp:949
void rollBack()
It aborts the transaction. Any changes will be rolled-back.
Definition: Transactor.cpp:104
std::auto_ptr< te::da::DataSetType > getDataSetType(const std::string &name)
It gets information about the given dataset.
Definition: Transactor.cpp:308
virtual std::string getString(std::size_t i) const =0
Method for retrieving a string value attribute.
std::vector< std::string > getPropertyNames(const std::string &datasetName)
It gets the property names of the given dataset.
Definition: Transactor.cpp:438
std::auto_ptr< te::da::UniqueKey > getUniqueKey(const std::string &datasetName, const std::string &name)
It gets the unique key in the dataset with the given name.
Definition: Transactor.cpp:695
long getMinutes() const
It returns the minutes of a hour - from 0 to 59.
Definition: TimeDuration.h:98
std::vector< std::string > getForeignKeyNames(const std::string &datasetName)
It gets the foreign key names of the given dataset.
Definition: Transactor.cpp:677
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
Definition: Utils.cpp:508
virtual int getPropertyDataType(std::size_t i) const =0
It returns the underlying data type of the property at position pos.
void addUniqueKey(const std::string &datasetName, te::da::UniqueKey *uk)
It adds a unique key constraint to the dataset.
Definition: Transactor.cpp:710
OGRFieldType GetOGRType(int te_type)
Definition: Transactor.cpp:43
std::set< ObjectId *, te::common::LessCmp< ObjectId * > >::const_iterator begin() const
Returns an iterator for the object ids in container.
std::auto_ptr< te::da::PreparedQuery > getPrepared(const std::string &qName=std::string(""))
It creates a prepared query object that may be used for query commands (select, insert, update and delete) that are used repeatedly.
Definition: Transactor.cpp:263
std::vector< std::string > getSequenceNames()
It gets the sequence names available in the data source.
Definition: Transactor.cpp:770
virtual bool moveFirst()=0
It moves the internal pointer to the first item in the collection.
void addIndex(const std::string &datasetName, te::da::Index *idx, const std::map< std::string, std::string > &options)
It adds an index to the dataset.
Definition: Transactor.cpp:756
bool propertyExists(const std::string &datasetName, const std::string &name)
It checks if a property with the given name exists in the dataset.
Definition: Transactor.cpp:485
bool uniqueKeyExists(const std::string &datasetName, const std::string &name)
It checks if a unique key with the given name exists in the dataset.
Definition: Transactor.cpp:705
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
long getHours() const
It returns the hours of a day - from 0 to 23.
Definition: TimeDuration.h:91
TEOGREXPORT int Convert2TerraLibProjection(OGRSpatialReference *osrs)
It converts the OGR Projection to TerraLib Projection.
Definition: Utils.cpp:125
std::size_t getNumberOfItems(const std::string &datasetName)
It retrieves the number of items of the given dataset.
Definition: Transactor.cpp:825
const std::string & getName() const
It returns the property name.
Definition: Property.h:126
std::vector< std::string > getIndexNames(const std::string &datasetName)
It gets the index names of the given dataset.
Definition: Transactor.cpp:746
bool hasDataSets()
It checks if the data source has any dataset.
Definition: Transactor.cpp:838