![]() |
TerraLib 4.1
|
00001 /************************************************************************************ 00002 TerraLib - a library for developing GIS applications. 00003 Copyright � 2001-2007 INPE and Tecgraf/PUC-Rio. 00004 00005 This code is part of the TerraLib library. 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Lesser General Public 00008 License as published by the Free Software Foundation; either 00009 version 2.1 of the License, or (at your option) any later version. 00010 00011 You should have received a copy of the GNU Lesser General Public 00012 License along with this library. 00013 00014 The authors reassure the license terms regarding the warranties. 00015 They specifically disclaim any warranties, including, but not limited to, 00016 the implied warranties of merchantability and fitness for a particular purpose. 00017 The library provided hereunder is on an "as is" basis, and the authors have no 00018 obligation to provide maintenance, support, updates, enhancements, or modifications. 00019 In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct, 00020 indirect, special, incidental, or consequential damages arising out of the use 00021 of this library and its documentation. 00022 *************************************************************************************/ 00028 /* 00029 * TODO: 01. Implementar o alterTable que nao pode simplesmente alterar o tipo da coluna 00030 * 02. No metodo query do portal, determinar os campos que fazem parte da chave primaria 00031 * 00032 */ 00033 00034 #ifndef __TERRALIB_INTERNAL_POSTGRESQL_H 00035 #define __TERRALIB_INTERNAL_POSTGRESQL_H 00036 00037 #include "../../kernel/TeDatabase.h" 00038 #include "../../kernel/TeDatabaseFactory.h" 00039 #include "TePostgreSQLDefines.h" 00040 00041 class TePostgreSQLPortal; 00042 class TePGConnection; 00043 class TePGRecordset; 00044 00045 struct pg_conn; 00046 00048 00057 class TLPOSTGRESQL_DLL TePostgreSQL : public TeDatabase 00058 { 00059 friend class TePostgreSQLPortal; 00060 00061 public: 00062 00064 TePostgreSQL(); 00065 00067 virtual ~TePostgreSQL(); 00068 00073 00075 virtual void setConnection(TeConnection* c); 00076 00080 virtual TeConnection* getConnection(); 00081 00083 00085 string errorMessage(); 00086 00088 virtual bool newDatabase(const string& database, const string& user, const string& password, const string& host, const int& port = -1, bool terralibModel=true, const std::string& characterSet = ""); 00089 00091 virtual bool connect(const string& host, const string& user, const string& password, const string& database, int port = -1); 00092 00093 virtual bool connect(pg_conn* conn); 00094 00096 virtual bool showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port = -1); 00097 00099 void close(void); 00100 00101 bool listTables(vector<string>& tableList); 00102 00104 virtual bool listDatabases(std::vector<std::string> &databaseList); 00105 00107 virtual bool dropDatabase(const std::string &databaseName); 00108 00110 bool tableExist(const string& table); 00111 00113 virtual bool deleteTable (const string& table); 00114 00116 bool columnExist(const string& table, const string& column, TeAttribute& attr); 00117 00119 virtual bool createTable(const string& table, TeAttributeList &attr); 00120 00122 virtual bool addColumn(const string& table, TeAttributeRep &rep); 00123 00125 bool createRelation(const string& relName, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion); 00126 00128 TeDBRelationType existRelation(const string& tableName, const string& relName); 00129 00131 bool execute(const string &sql); 00132 00134 virtual TeDatabasePortal* getPortal(); 00135 00137 bool insertTable(TeTable &table); 00138 00140 bool updateTable (TeTable &table); 00141 00143 bool insertRelationInfo(const int tableId, const string& tField, const string& rTable, const string& rField, int& relId); 00144 00146 bool insertTableInfo(int layerId, TeTable& table, const string& user = ""); 00147 00149 bool alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName=""); 00150 00152 bool alterTable(const string& oldTableName, const string& newTableName); 00153 00155 bool insertBlob (const string& tableName, const string& columnBlob, const string& whereClause, unsigned char* data, int size); 00156 00158 bool insertProjection(TeProjection *proj); 00159 00161 bool insertLayer(TeLayer *layer); 00162 00164 bool insertProject(TeProject *proj); 00165 00167 bool insertRepresentation(int layerId, TeRepresentation& rep); 00168 00170 bool insertView(TeView *view); 00171 00173 bool insertViewTree(TeViewTree *tree); 00174 00176 bool insertThemeGroup(TeViewTree* tree); 00177 00179 bool insertTheme(TeAbstractTheme *theme); 00180 00182 bool insertThemeTable(int themeId, int tableId, int relationId, int tableOrder); 00183 00185 virtual bool generateLabelPositions(TeTheme *theme, const std::string& objectId = ""); 00186 00188 bool insertLegend(TeLegendEntry *legend); 00189 00191 virtual bool loadPolygonSet(const string& table, TeBox& box, TePolygonSet& ps); 00192 00194 virtual TeDatabasePortal* loadPolygonSet(const string& table, TeBox& box); 00195 00197 virtual bool locatePolygon(const string& table, TeCoord2D& pt, TePolygon& polygon, const double& tol = 0.0); 00198 00200 virtual bool locatePolygonSet (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons); 00201 00203 virtual bool insertPolygon(const string& table, TePolygon& p); 00204 00206 virtual bool updatePolygon(const string& table, TePolygon& p); 00207 00208 virtual bool loadLineSet(const string& table, TeBox& box, TeLineSet& linSet); 00209 00210 virtual TeDatabasePortal* loadLineSet(const string& table, TeBox& box); 00211 00213 virtual bool insertLine(const string& table, TeLine2D& l); 00214 00216 virtual bool updateLine(const string& table, TeLine2D& l); 00217 00219 virtual bool locateLine(const string& table, TeCoord2D& pt, TeLine2D& line, const double& tol = 0.0); 00220 00222 virtual bool insertPoint(const string& table, TePoint& p); 00223 00224 virtual bool updatePoint(const string& table, TePoint& p); 00225 00227 virtual bool locatePoint(const string& table, TeCoord2D& pt, TePoint& point, const double& tol = 0.0); 00228 00230 bool insertText(const string& table, TeText& t); 00231 00233 bool insertArc(const string& table,TeArc& arc); 00234 00236 virtual bool insertNode(const string& table, TeNode& node); 00237 virtual bool updateNode(const string& table, TeNode &node); 00238 00240 virtual bool insertCell(const string& table, TeCell& c); 00241 virtual bool updateCell(const string& table, TeCell &c); 00242 00243 // Locates a cell 00244 virtual bool locateCell(const string& table, TeCoord2D& pt, TeCell& c, const double& tol = 0.0); 00245 00247 virtual bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char* buf,unsigned long size, int band = 0, unsigned int res = 1, unsigned int subband = 0); 00248 00250 string getSQLStatistics(TeGroupingAttr& attrs); 00251 00253 string getSQLTemporalWhere(TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime); 00254 00256 string getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, const string& initialTime, const string& finalTime); 00257 00259 string getAutoNumberSQL(const string& table); 00260 00262 string getSQLTime(const TeTime& t) const; 00263 00265 string concatValues(vector<string>& values, const string& unionString); 00266 00268 string toUpper(const string& value); 00269 00271 string leftString(const string& name, const int& length); 00272 00274 virtual bool createSpatialIndex(const string& table, const string& column, TeSpatialIndexType type = TeRTREE, short level = 0, short tile = 0); 00275 00277 virtual string getSQLBoxWhere(const TeBox& box, const TeGeomRep rep, const std::string& tableName); 00278 00280 virtual string getSQLBoxWhere(const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1 = TePOLYGONS); 00281 00283 virtual string getSQLBoxSelect(const string& tableName, TeGeomRep rep); 00284 00286 virtual bool getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom); 00287 00289 virtual bool getMBRSelectedObjects(string geomTable, string colGeom, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType, TeBox& bout, const double& tol = 0.0); 00290 00292 virtual string getSpatialIdxColumn(TeGeomRep rep); 00293 00295 bool beginTransaction(); 00296 00298 bool commitTransaction(); 00299 00301 bool rollbackTransaction(); 00302 00304 virtual std::string getClientEncoding(); 00305 00307 virtual bool setClientEncoding(const std::string& characterSet); 00308 00310 virtual bool getEncodingList(std::vector<std::string>& vecEncodingList); 00311 00313 virtual bool getEncodingList(const std::string& host, const std::string& user, const std::string& password, const int& port, std::vector<std::string>& vecEncodingList); 00314 00316 virtual bool getIndexesFromTable(const string& tableName, std::vector<TeDatabaseIndex>& vecIndexes); 00317 00319 virtual bool getAttributeList(const string& tableName,TeAttributeList& attList); 00320 00321 protected: 00322 00324 virtual void getInsertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql); 00325 00327 virtual void getUpdateRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql); 00328 00330 string escapeSequence(const string& from); 00331 00332 00334 bool realConnect(const string& host, const string& user, const string& password, const string& database, int port = -1); 00335 00337 TePGConnection* tepg_connection_; 00338 TePGConnection* tepg_connection_ref; 00339 00341 std::string gistBoxOps_; 00342 00344 int transactionCounter_; 00345 00346 }; 00347 00348 00350 00353 class TLPOSTGRESQL_DLL TePostgreSQLPortal : public TeDatabasePortal 00354 { 00355 public: 00356 00358 TePostgreSQLPortal(); 00359 00361 TePostgreSQLPortal(TeDatabase *pDatabase); 00362 00364 virtual ~TePostgreSQLPortal(); 00365 00367 virtual bool query(const string &qry, TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR); 00368 00370 bool fetchRow(); 00371 00373 bool fetchRow(int i); 00374 00376 void freeResult(); 00377 00379 string errorMessage(); 00380 00382 char* getData(int i); 00383 00385 char* getData(const string& s); 00386 00388 double getDouble(int i); 00389 00391 double getDouble(const string& s); 00392 00394 int getInt(int i); 00395 00397 int getInt(const string& s); 00398 00400 bool getBool(const string& s); 00401 00403 bool getBool(int i); 00404 00406 TeTime getDate(int i); 00407 00409 TeTime getDate(const string& s); 00410 00412 string getDateAsString(int i); 00413 00415 string getDateAsString(const string& s); 00416 00418 bool getBlob(const string& s, unsigned char*& data, long& size); 00419 00420 virtual bool getRasterBlock(unsigned long& size, unsigned char* ptData); 00421 00422 virtual bool fetchGeometry(TePolygon& pol); 00423 virtual bool fetchGeometry(TeLine2D& line); 00424 virtual bool fetchGeometry(TeNode& n); 00425 virtual bool fetchGeometry(TePoint& p); 00426 virtual bool fetchGeometry (TeCell& cell); 00427 virtual bool fetchGeometry(TePolygon& pol, const unsigned int& initIndex); 00428 virtual bool fetchGeometry(TeLine2D& line, const unsigned int& initIndex); 00429 virtual bool fetchGeometry(TeNode& n, const unsigned int& initIndex); 00430 virtual bool fetchGeometry(TePoint& p, const unsigned int& initIndex); 00431 virtual bool fetchGeometry (TeCell& cell, const unsigned int& initIndex); 00432 00433 00434 protected: 00435 00437 TeLinearRing getLinearRing(int& numberOfHoles); 00438 00440 TeLinearRing getLinearRing(int& numberOfHoles, const unsigned int& i); 00441 00443 string escapeSequence(const string& from); 00444 00445 // Protected data members 00446 TePGConnection *con_; 00447 TePGRecordset* tepg_recordset_; 00448 00449 long curRow_; 00450 00451 }; 00452 00453 00459 class TLPOSTGRESQL_DLL TePostgreSQLFactory : public TeDatabaseFactory 00460 { 00461 public : 00462 00466 TePostgreSQLFactory() : TeDatabaseFactory( 00467 std::string( "PostgreSQL" ) ) {}; 00468 00472 ~TePostgreSQLFactory() {}; 00473 00474 protected : 00475 00483 TeDatabase* build( const TeDatabaseFactoryParams& arg ) 00484 { 00485 TePostgreSQL* instance_ptr = new TePostgreSQL(); 00486 00487 if( arg.host_ != "" ) { 00488 instance_ptr->connect( arg.host_, arg.user_, arg.password_, 00489 arg.database_, arg.port_ ); 00490 } 00491 00492 return (TeDatabase*)instance_ptr; 00493 } 00494 }; 00495 00496 namespace { 00497 static TePostgreSQLFactory TePostgreSQLFactory_instance; 00498 }; 00499 00500 #endif // __TERRALIB_INTERNAL_TePOSTGRESQL_H 00501 00502 /* 00503 * Updates: 00504 * - 2007/03/26: Mario Rocco Added new method - string leftString(const string& name, const int& length); 00505 */ 00506