Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Utility methods 5 : * Author: Even Rouault, <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2009-2011, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "ogr_pg.h" 14 : #include "cpl_conv.h" 15 : 16 : /************************************************************************/ 17 : /* OGRPG_PQexec() */ 18 : /************************************************************************/ 19 : 20 15605 : PGresult *OGRPG_PQexec(PGconn *conn, const char *query, 21 : int bMultipleCommandAllowed, int bErrorAsDebug) 22 : { 23 : PGresult *hResult = bMultipleCommandAllowed 24 15605 : ? PQexec(conn, query) 25 14470 : : PQexecParams(conn, query, 0, nullptr, nullptr, 26 15605 : nullptr, nullptr, 0); 27 : 28 : #ifdef DEBUG 29 15605 : const char *pszRetCode = "UNKNOWN"; 30 15605 : char szNTuples[32] = {}; 31 15605 : if (hResult) 32 : { 33 15605 : switch (PQresultStatus(hResult)) 34 : { 35 7265 : case PGRES_TUPLES_OK: 36 7265 : pszRetCode = "PGRES_TUPLES_OK"; 37 7265 : snprintf(szNTuples, sizeof(szNTuples), ", ntuples = %d", 38 : PQntuples(hResult)); 39 7265 : break; 40 8130 : case PGRES_COMMAND_OK: 41 8130 : pszRetCode = "PGRES_COMMAND_OK"; 42 8130 : break; 43 0 : case PGRES_NONFATAL_ERROR: 44 0 : pszRetCode = "PGRES_NONFATAL_ERROR"; 45 0 : break; 46 25 : case PGRES_FATAL_ERROR: 47 25 : pszRetCode = "PGRES_FATAL_ERROR"; 48 25 : break; 49 185 : default: 50 185 : break; 51 : } 52 : } 53 15605 : if (bMultipleCommandAllowed) 54 1135 : CPLDebug("PG", "PQexec(%s) = %s%s", query, pszRetCode, szNTuples); 55 : else 56 14470 : CPLDebug("PG", "PQexecParams(%s) = %s%s", query, pszRetCode, szNTuples); 57 : #endif 58 : 59 : /* -------------------------------------------------------------------- */ 60 : /* Generate an error report if an error occurred. */ 61 : /* -------------------------------------------------------------------- */ 62 31210 : if (!hResult || (PQresultStatus(hResult) == PGRES_NONFATAL_ERROR || 63 15605 : PQresultStatus(hResult) == PGRES_FATAL_ERROR)) 64 : { 65 25 : if (bErrorAsDebug) 66 0 : CPLDebug("PG", "%s", PQerrorMessage(conn)); 67 : else 68 25 : CPLError(CE_Failure, CPLE_AppDefined, "%s", PQerrorMessage(conn)); 69 : } 70 : 71 15605 : return hResult; 72 : } 73 : 74 : /************************************************************************/ 75 : /* OGRPG_Check_Table_Exists() */ 76 : /************************************************************************/ 77 : 78 846 : bool OGRPG_Check_Table_Exists(PGconn *hPGConn, const char *pszTableName) 79 : { 80 846 : CPLString osSQL; 81 : osSQL.Printf( 82 : "SELECT 1 FROM information_schema.tables WHERE table_name = %s LIMIT 1", 83 846 : OGRPGEscapeString(hPGConn, pszTableName).c_str()); 84 846 : PGresult *hResult = OGRPG_PQexec(hPGConn, osSQL); 85 846 : bool bRet = (hResult && PQntuples(hResult) == 1); 86 846 : if (!bRet) 87 0 : CPLDebug("PG", "Does not have %s table", pszTableName); 88 846 : OGRPGClearResult(hResult); 89 1692 : return bRet; 90 : }