From d1114793a1b9d234d31b7a03889c9739e33f6c2d Mon Sep 17 00:00:00 2001 From: eelke Date: Sun, 17 Dec 2017 20:22:55 +0100 Subject: [PATCH] Fixed missing comman in pg_class query. Added checks on row and column indexes in Pgsql::Result to detect these kind of problems earlier in the future. --- pglab/PgClassContainer.cpp | 2 +- pgsql/Pgsql_Result.cpp | 23 +++++++++++++++++++++++ pgsql/Pgsql_Result.h | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pglab/PgClassContainer.cpp b/pglab/PgClassContainer.cpp index d75023c..85c86a2 100644 --- a/pglab/PgClassContainer.cpp +++ b/pglab/PgClassContainer.cpp @@ -7,7 +7,7 @@ std::string PgClassContainer::getLoadQuery() const return "SELECT oid, relname, relnamespace, reltype, reloftype, " " relowner, relam, relfilenode, reltablespace, relpages, " " reltuples, reltoastrelid, relisshared, relpersistence, " - " relkind, relhasoids, relispopulated, relfrozenxid, relminmxid " + " relkind, relhasoids, relispopulated, relfrozenxid, relminmxid, " " relacl, reloptions \n" "FROM pg_catalog.pg_class"; } diff --git a/pgsql/Pgsql_Result.cpp b/pgsql/Pgsql_Result.cpp index 04a482d..0a1744a 100644 --- a/pgsql/Pgsql_Result.cpp +++ b/pgsql/Pgsql_Result.cpp @@ -158,13 +158,31 @@ const char * Result::getColName(int idx) const return PQfname(result, idx); } +inline void Result::colRangeCheck(int col) const +{ + if (col < 0 || col >= cols()) + throw std::range_error("column index out of range"); +} + +inline void Result::rowRangeCheck(int row) const +{ + if (row < 0 || row >= rows()) + throw std::range_error("row index out of range"); +} + + const char * Result::val(int col, int row) const { + colRangeCheck(col); + rowRangeCheck(row); return PQgetvalue(result, row, col); } Value Result::get(int col, int row) const { + colRangeCheck(col); + rowRangeCheck(row); + return Value( PQgetvalue(result, row, col), PQftype(result, col) @@ -173,10 +191,15 @@ Value Result::get(int col, int row) const Oid Result::type(int col) const { + colRangeCheck(col); + return PQftype(result, col); } bool Result::null(int col, int row) const { + colRangeCheck(col); + rowRangeCheck(row); + return PQgetisnull(result, row, col); } diff --git a/pgsql/Pgsql_Result.h b/pgsql/Pgsql_Result.h index 471ad38..2f3c490 100644 --- a/pgsql/Pgsql_Result.h +++ b/pgsql/Pgsql_Result.h @@ -127,6 +127,9 @@ namespace Pgsql { // iterator begin(); private: PGresult *result = nullptr; + + void colRangeCheck(int col) const; + void rowRangeCheck(int row) const; };