summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpqpp/Jamfile.jam15
-rw-r--r--libpqpp/pq-binarycolumn.cpp6
-rw-r--r--libpqpp/pq-bulkselectcommand.cpp8
-rw-r--r--libpqpp/pq-column.cpp15
-rw-r--r--libpqpp/pq-column.h11
-rw-r--r--libpqpp/pq-command.cpp10
-rw-r--r--libpqpp/pq-connection.cpp4
-rw-r--r--libpqpp/pq-cursorselectcommand.cpp8
-rw-r--r--libpqpp/pq-mock.cpp2
-rw-r--r--libpqpp/pq-modifycommand.cpp8
-rw-r--r--libpqpp/pq-prepared.cpp3
-rw-r--r--libpqpp/pq-selectbase.cpp4
-rw-r--r--libpqpp/unittests/testpq.cpp40
13 files changed, 74 insertions, 60 deletions
diff --git a/libpqpp/Jamfile.jam b/libpqpp/Jamfile.jam
index ca1bd6a..86f8f92 100644
--- a/libpqpp/Jamfile.jam
+++ b/libpqpp/Jamfile.jam
@@ -17,6 +17,21 @@ project
<variant>release:<lto>on
<variant>debug:<warnings>extra
<variant>debug:<warnings-as-errors>on
+ <variant>debug:<cflags>-Wnon-virtual-dtor
+ <variant>debug:<cflags>-Wold-style-cast
+ <variant>debug:<cflags>-Wcast-align
+ <variant>debug:<cflags>-Wunused
+ <variant>debug:<cflags>-Woverloaded-virtual
+ <variant>debug:<cflags>-Wpedantic
+ <variant>debug:<cflags>-Wconversion
+ <variant>debug:<cflags>-Wsign-conversion
+ <variant>debug:<cflags>-Wnull-dereference
+ <variant>debug:<cflags>-Wdouble-promotion
+ <variant>debug:<cflags>-Wformat=2
+ <toolset>gcc,<variant>debug:<cflags>-Wduplicated-cond
+ <toolset>gcc,<variant>debug:<cflags>-Wduplicated-branches
+ <toolset>gcc,<variant>debug:<cflags>-Wlogical-op
+ <toolset>gcc,<variant>debug:<cflags>-Wuseless-cast
<variant>coverage:<coverage>on
;
diff --git a/libpqpp/pq-binarycolumn.cpp b/libpqpp/pq-binarycolumn.cpp
index 1e75343..ce4e8c1 100644
--- a/libpqpp/pq-binarycolumn.cpp
+++ b/libpqpp/pq-binarycolumn.cpp
@@ -22,13 +22,13 @@ PQ::BinaryColumn::apply(DB::HandleField & h) const
h.boolean(valueAs<bool>());
break;
case 21: // INT2OID:
- h.integer(be16toh(valueAs<uint16_t>()));
+ h.integer(static_cast<int64_t>(be16toh(valueAs<uint16_t>())));
break;
case 23: // INT4OID:
- h.integer(be32toh(valueAs<uint32_t>()));
+ h.integer(static_cast<int64_t>(be32toh(valueAs<uint32_t>())));
break;
case 20: // INT8OID:
- h.integer(be64toh(valueAs<uint64_t>()));
+ h.integer(static_cast<int64_t>(be64toh(valueAs<uint64_t>())));
break;
case 17: // BYTEAOID
h.blob(DB::Blob(value(), length()));
diff --git a/libpqpp/pq-bulkselectcommand.cpp b/libpqpp/pq-bulkselectcommand.cpp
index ff9f2f4..de2ecb4 100644
--- a/libpqpp/pq-bulkselectcommand.cpp
+++ b/libpqpp/pq-bulkselectcommand.cpp
@@ -14,11 +14,11 @@ void
PQ::BulkSelectCommand::execute()
{
if (!executed) {
- execRes = c->checkResult(PQexecPrepared(c->conn, prepare(), values.size(), &values.front(), &lengths.front(),
- &formats.front(), binary),
+ execRes = c->checkResult(PQexecPrepared(c->conn, prepare(), static_cast<int>(values.size()), &values.front(),
+ &lengths.front(), &formats.front(), binary),
PGRES_TUPLES_OK);
- nTuples = PQntuples(execRes);
- tuple = -1;
+ nTuples = static_cast<decltype(nTuples)>(PQntuples(execRes));
+ tuple = static_cast<decltype(tuple)>(-1);
createColumns(execRes);
executed = true;
}
diff --git a/libpqpp/pq-column.cpp b/libpqpp/pq-column.cpp
index e4d85d8..c1e0d40 100644
--- a/libpqpp/pq-column.cpp
+++ b/libpqpp/pq-column.cpp
@@ -5,7 +5,8 @@
#include <cstring>
PQ::Column::Column(const SelectBase * s, unsigned int i) :
- DB::Column(PQfname(s->execRes, (int)i), i), sc(s), oid(PQftype(sc->execRes, (int)colNo)), buf(nullptr)
+ DB::Column(PQfname(s->execRes, static_cast<int>(i)), i), sc(s), oid(PQftype(sc->execRes, static_cast<int>(colNo))),
+ buf(nullptr)
{
}
@@ -19,19 +20,19 @@ PQ::Column::~Column()
bool
PQ::Column::isNull() const
{
- return PQgetisnull(sc->execRes, (int)sc->tuple, (int)colNo);
+ return PQgetisnull(sc->execRes, static_cast<int>(sc->tuple), static_cast<int>(colNo));
}
std::size_t
PQ::Column::length() const
{
- return PQgetlength(sc->execRes, (int)sc->tuple, (int)colNo);
+ return static_cast<std::size_t>(PQgetlength(sc->execRes, static_cast<int>(sc->tuple), static_cast<int>(colNo)));
}
const char *
PQ::Column::value() const
{
- return PQgetvalue(sc->execRes, (int)sc->tuple, (int)colNo);
+ return PQgetvalue(sc->execRes, static_cast<int>(sc->tuple), static_cast<int>(colNo));
}
void
@@ -74,8 +75,8 @@ PQ::Column::apply(DB::HandleField & h) const
>= 4) {
h.interval(boost::posix_time::time_duration((24 * days) + hours, minutes, seconds,
fractions
- * (long)pow(10,
- boost::posix_time::time_res_traits::num_fractional_digits() + flen1 - flen2)));
+ * static_cast<long>(pow(10,
+ boost::posix_time::time_res_traits::num_fractional_digits() + flen1 - flen2))));
}
else {
h.interval(boost::posix_time::duration_from_string(val));
@@ -96,7 +97,7 @@ PQ::Column::apply(DB::HandleField & h) const
PQfreemem(buf);
}
size_t len;
- buf = PQunescapeBytea(valueAsPtr<unsigned char>(), &len);
+ buf = PQunescapeBytea(reinterpret_cast<const unsigned char *>(value()), &len);
h.blob(DB::Blob(buf, len));
break;
}
diff --git a/libpqpp/pq-column.h b/libpqpp/pq-column.h
index b43880e..f893fef 100644
--- a/libpqpp/pq-column.h
+++ b/libpqpp/pq-column.h
@@ -2,6 +2,7 @@
#define PG_COLUMN_H
#include <column.h>
+#include <cstring>
#include <libpq-fe.h>
namespace PQ {
@@ -19,13 +20,9 @@ namespace PQ {
inline T
valueAs() const
{
- return *(T *)(value());
- }
- template<typename T>
- inline T *
- valueAsPtr() const
- {
- return (T *)(value());
+ T v {};
+ std::memcpy(&v, value(), sizeof(T));
+ return v;
}
const char * value() const;
std::size_t length() const;
diff --git a/libpqpp/pq-command.cpp b/libpqpp/pq-command.cpp
index 98cd725..aaa8260 100644
--- a/libpqpp/pq-command.cpp
+++ b/libpqpp/pq-command.cpp
@@ -6,7 +6,7 @@
#include <cstring>
#include <factory.h>
-NAMEDFACTORY("postgresql", PQ::CommandOptions, DB::CommandOptionsFactory);
+NAMEDFACTORY("postgresql", PQ::CommandOptions, DB::CommandOptionsFactory)
AdHocFormatter(PQCommondStatement, "pStatement_id%?");
PQ::Command::Command(Connection * conn, const std::string & sql, const DB::CommandOptionsCPtr & opts) :
@@ -16,7 +16,7 @@ PQ::Command::Command(Connection * conn, const std::string & sql, const DB::Comma
}
PQ::CommandOptions::CommandOptions(std::size_t hash, const DB::CommandOptionsMap & map) :
- DB::CommandOptions(hash), fetchTuples(get(map, "page-size", 35)), useCursor(!isSet(map, "no-cursor")),
+ DB::CommandOptions(hash), fetchTuples(get(map, "page-size", 35U)), useCursor(!isSet(map, "no-cursor")),
fetchBinary(isSet(map, "fetch-binary"))
{
}
@@ -68,7 +68,7 @@ PQ::Command::paramSet(unsigned int n, const T &... v)
{
paramsAtLeast(n);
bufs[n] = std::make_unique<std::string>(PQCommandParamFmt::get(v...));
- lengths[n] = bufs[n]->length();
+ lengths[n] = static_cast<int>(bufs[n]->length());
formats[n] = 0;
values[n] = bufs[n]->data();
}
@@ -78,7 +78,7 @@ PQ::Command::paramSet(unsigned int n, const std::string_view & b)
{
paramsAtLeast(n);
bufs[n] = std::make_unique<std::string>(b);
- lengths[n] = b.length();
+ lengths[n] = static_cast<int>(b.length());
formats[n] = 0;
values[n] = bufs[n]->data();
}
@@ -152,7 +152,7 @@ void
PQ::Command::bindParamBLOB(unsigned int n, const DB::Blob & v)
{
paramsAtLeast(n);
- lengths[n] = v.len;
+ lengths[n] = static_cast<int>(v.len);
formats[n] = 1;
values[n] = static_cast<const char *>(v.data);
bufs[n].reset();
diff --git a/libpqpp/pq-connection.cpp b/libpqpp/pq-connection.cpp
index 46e1917..4b201f5 100644
--- a/libpqpp/pq-connection.cpp
+++ b/libpqpp/pq-connection.cpp
@@ -8,7 +8,7 @@
#include <poll.h>
#include <unistd.h>
-NAMEDFACTORY("postgresql", PQ::Connection, DB::ConnectionFactory);
+NAMEDFACTORY("postgresql", PQ::Connection, DB::ConnectionFactory)
static void setup() __attribute__((constructor(101)));
static void
@@ -161,7 +161,7 @@ size_t
PQ::Connection::bulkUploadData(const char * data, size_t len) const
{
int rc;
- while (!(rc = PQputCopyData(conn, data, len))) {
+ while (!(rc = PQputCopyData(conn, data, static_cast<int>(len)))) {
sleep(1);
}
if (rc != 1) {
diff --git a/libpqpp/pq-cursorselectcommand.cpp b/libpqpp/pq-cursorselectcommand.cpp
index 1981bc8..9ae9655 100644
--- a/libpqpp/pq-cursorselectcommand.cpp
+++ b/libpqpp/pq-cursorselectcommand.cpp
@@ -38,8 +38,8 @@ PQ::CursorSelectCommand::execute()
if (s_declare.empty()) {
s_declare = mkdeclare();
}
- c->checkResultFree(PQexecParams(c->conn, s_declare.c_str(), values.size(), nullptr, &values.front(),
- &lengths.front(), &formats.front(), binary),
+ c->checkResultFree(PQexecParams(c->conn, s_declare.c_str(), static_cast<int>(values.size()), nullptr,
+ &values.front(), &lengths.front(), &formats.front(), binary),
PGRES_COMMAND_OK);
fetchTuples();
createColumns(execRes);
@@ -52,8 +52,8 @@ PQ::CursorSelectCommand::fetchTuples()
{
execRes = c->checkResult(
PQexecParams(c->conn, s_fetch.c_str(), 0, nullptr, nullptr, nullptr, nullptr, binary), PGRES_TUPLES_OK);
- nTuples = PQntuples(execRes);
- tuple = -1;
+ nTuples = static_cast<decltype(nTuples)>(PQntuples(execRes));
+ tuple = static_cast<decltype(tuple)>(-1);
}
bool
diff --git a/libpqpp/pq-mock.cpp b/libpqpp/pq-mock.cpp
index 34d903e..fcff52e 100644
--- a/libpqpp/pq-mock.cpp
+++ b/libpqpp/pq-mock.cpp
@@ -6,7 +6,7 @@
#include <selectcommand.h>
#include <selectcommandUtil.impl.h>
-NAMEDFACTORY("postgresql", PQ::Mock, DB::MockDatabaseFactory);
+NAMEDFACTORY("postgresql", PQ::Mock, DB::MockDatabaseFactory)
namespace PQ {
diff --git a/libpqpp/pq-modifycommand.cpp b/libpqpp/pq-modifycommand.cpp
index 4c25a7e..8697b10 100644
--- a/libpqpp/pq-modifycommand.cpp
+++ b/libpqpp/pq-modifycommand.cpp
@@ -11,13 +11,13 @@ PQ::ModifyCommand::ModifyCommand(Connection * conn, const std::string & sql, con
unsigned int
PQ::ModifyCommand::execute(bool anc)
{
- PGresult * res
- = PQexecPrepared(c->conn, prepare(), values.size(), &values.front(), &lengths.front(), &formats.front(), 0);
+ PGresult * res = PQexecPrepared(c->conn, prepare(), static_cast<int>(values.size()), &values.front(),
+ &lengths.front(), &formats.front(), 0);
c->checkResult(res, PGRES_COMMAND_OK, PGRES_TUPLES_OK);
- unsigned int rows = atoi(PQcmdTuples(res));
+ auto rows = atoi(PQcmdTuples(res));
PQclear(res);
if (rows == 0 && !anc) {
throw DB::NoRowsAffected();
}
- return rows;
+ return static_cast<unsigned int>(rows);
}
diff --git a/libpqpp/pq-prepared.cpp b/libpqpp/pq-prepared.cpp
index 287eda8..640b3db 100644
--- a/libpqpp/pq-prepared.cpp
+++ b/libpqpp/pq-prepared.cpp
@@ -19,6 +19,7 @@ PQ::PreparedStatement::prepare() const
std::stringstream psql;
prepareSql(psql, sql);
c->checkResultFree(
- PQprepare(c->conn, stmntName.c_str(), psql.str().c_str(), values.size(), nullptr), PGRES_COMMAND_OK);
+ PQprepare(c->conn, stmntName.c_str(), psql.str().c_str(), static_cast<int>(values.size()), nullptr),
+ PGRES_COMMAND_OK);
return (pstmt = c->preparedStatements.insert({hash, stmntName}).first->second.c_str());
}
diff --git a/libpqpp/pq-selectbase.cpp b/libpqpp/pq-selectbase.cpp
index 49b78d2..4d4cada 100644
--- a/libpqpp/pq-selectbase.cpp
+++ b/libpqpp/pq-selectbase.cpp
@@ -19,8 +19,8 @@ PQ::SelectBase::~SelectBase()
void
PQ::SelectBase::createColumns(PGresult * execRes)
{
- unsigned int nFields = PQnfields(execRes);
- for (unsigned int f = 0; f < nFields; f += 1) {
+ auto nFields = PQnfields(execRes);
+ for (decltype(nFields) f = 0; f < nFields; f += 1) {
if (binary) {
insertColumn(std::make_unique<BinaryColumn>(this, f));
}
diff --git a/libpqpp/unittests/testpq.cpp b/libpqpp/unittests/testpq.cpp
index 76a5d5d..6b86814 100644
--- a/libpqpp/unittests/testpq.cpp
+++ b/libpqpp/unittests/testpq.cpp
@@ -25,7 +25,7 @@ public:
BOOST_GLOBAL_FIXTURE(StandardMockDatabase);
-BOOST_FIXTURE_TEST_SUITE(Core, DB::TestCore);
+BOOST_FIXTURE_TEST_SUITE(Core, DB::TestCore)
BOOST_AUTO_TEST_CASE(transactions)
{
@@ -55,23 +55,23 @@ BOOST_AUTO_TEST_CASE(bindAndSend)
mod->bindParamT(4, testDateTime);
mod->bindParamT(5, testInterval);
mod->execute();
- mod->bindParamI(0, (unsigned int)(testInt + 10));
- mod->bindParamF(1, (float)(testDouble + 10));
+ mod->bindParamI(0, static_cast<unsigned int>(testInt + 10));
+ mod->bindParamF(1, static_cast<float>(testDouble + 10));
mod->bindParamS(2, std::string(testString) + " something");
mod->bindParamB(3, true);
mod->bindParamT(4, testDateTime);
mod->bindParamT(5, testInterval);
mod->execute();
mod->bindNull(0);
- mod->bindParamI(1, (long long unsigned int)(testDouble + 10));
- mod->bindParamI(2, (long long int)testInt);
+ mod->bindParamI(1, static_cast<long long unsigned int>(testDouble + 10));
+ mod->bindParamI(2, static_cast<long long int>(testInt));
mod->bindParamB(3, true);
mod->bindNull(4);
mod->bindNull(5);
mod->execute();
mod->bindNull(0);
- mod->bindParamI(1, (long unsigned int)(testDouble + 10));
- mod->bindParamI(2, (long int)testInt);
+ mod->bindParamI(1, static_cast<long unsigned int>(testDouble + 10));
+ mod->bindParamI(2, testInt);
mod->bindParamB(3, true);
mod->bindParamS(4, "2016-01-01T12:34:56");
mod->bindNull(5);
@@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE(bulkload)
}
std::array<char, BUFSIZ> buf {};
for (std::streamsize r; (r = in.readsome(buf.data(), buf.size())) > 0;) {
- ro->bulkUploadData(buf.data(), r);
+ ro->bulkUploadData(buf.data(), static_cast<size_t>(r));
}
ro->endBulkUpload(nullptr);
assertScalarValueHelper(*count, 800);
@@ -274,7 +274,7 @@ BOOST_AUTO_TEST_CASE(bulkSelect)
auto co = std::make_shared<PQ::CommandOptions>(0, 35, false);
auto sel = ro->select("SELECT * FROM test WHERE id > ?", co);
sel->bindParamI(0, 1);
- int totalInt = 0, count = 0;
+ int64_t totalInt = 0, count = 0;
sel->forEachRow<int64_t>([&totalInt, &count](auto i) {
totalInt += i;
count += 1;
@@ -289,7 +289,7 @@ BOOST_AUTO_TEST_CASE(selectWithSmallPages)
auto co = std::make_shared<PQ::CommandOptions>(0, 1, true);
auto sel = ro->select("SELECT * FROM test WHERE id > ?", co);
sel->bindParamI(0, 1);
- int totalInt = 0, count = 0;
+ int64_t totalInt = 0, count = 0;
sel->forEachRow<int64_t>([&totalInt, &count](auto i) {
totalInt += i;
count += 1;
@@ -313,7 +313,7 @@ BOOST_AUTO_TEST_CASE(insertReturning)
auto ro = DB::MockDatabase::openConnectionTo("PQmock");
auto co = std::make_shared<PQ::CommandOptions>(0, 35, false);
auto sel = ro->select("INSERT INTO test(id, fl) VALUES(1, 3) RETURNING id + fl", co);
- int totalInt = 0, count = 0;
+ int64_t totalInt = 0, count = 0;
sel->forEachRow<int64_t>([&totalInt, &count](auto i) {
totalInt += i;
count += 1;
@@ -324,7 +324,7 @@ BOOST_AUTO_TEST_CASE(insertReturning)
BOOST_AUTO_TEST_CASE(closeOnError)
{
- auto ro = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("PQmock"));
+ auto ro = DB::MockDatabase::openConnectionTo("PQmock");
BOOST_REQUIRE_THROW(
{
ro->select("SELECT * FROM test")->forEachRow<>([&ro]() {
@@ -363,7 +363,7 @@ BOOST_AUTO_TEST_CASE(closeOnError)
BOOST_AUTO_TEST_CASE(blobs)
{
- auto ro = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("PQmock"));
+ auto ro = DB::MockDatabase::openConnectionTo("PQmock");
std::vector<char> buf(29);
memcpy(&buf[0], "This is some binary text data", 29);
auto ins = ro->modify("INSERT INTO blobtest(data) VALUES(?)");
@@ -380,7 +380,7 @@ BOOST_AUTO_TEST_CASE(blobs)
BOOST_REQUIRE_EQUAL(r.value<1>(), "37c7c3737f93e8d17e845deff8fa74d2");
// Assert the fetch of the data is correct
BOOST_REQUIRE_EQUAL(r.value<0>().len, buf.size());
- std::string str((const char *)r.value<0>().data, r.value<0>().len);
+ std::string_view str(reinterpret_cast<const char *>(r.value<0>().data), r.value<0>().len);
BOOST_REQUIRE_EQUAL(str, "This is some binary text data");
BOOST_REQUIRE_EQUAL(r.value<0>(), blob);
}
@@ -388,7 +388,7 @@ BOOST_AUTO_TEST_CASE(blobs)
BOOST_AUTO_TEST_CASE(fetchAsBinary)
{
- auto ro = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("PQmock"));
+ auto ro = DB::MockDatabase::openConnectionTo("PQmock");
std::vector<char> buf(29);
memcpy(&buf[0], "This is some binary text data", 29);
DB::Blob blob(buf);
@@ -432,10 +432,10 @@ BOOST_AUTO_TEST_CASE(fetchAsBinary)
BOOST_AUTO_TEST_CASE(largeBlob)
{
- auto ro = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("PQmock"));
+ auto ro = DB::MockDatabase::openConnectionTo("PQmock");
ro->execute("TRUNCATE TABLE blobtest");
AdHoc::FileUtils::MemMap f("/proc/self/exe");
- DB::Blob blob(f.data, f.getStat().st_size);
+ DB::Blob blob(f.data, static_cast<size_t>(f.getStat().st_size));
BOOST_REQUIRE(blob.len > 140000); // Just assert the mapped file is actually "large"
auto ins = ro->modify("INSERT INTO blobtest(data) VALUES(?)");
ins->bindParamBLOB(0, blob);
@@ -453,7 +453,7 @@ BOOST_AUTO_TEST_CASE(largeBlob)
BOOST_AUTO_TEST_CASE(bulkPerfTest)
{
- auto ro = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("PQmock"));
+ auto ro = DB::MockDatabase::openConnectionTo("PQmock");
auto sel = ro->select(R"SQL(select s a, cast(s as numeric(7,1)) b, cast(s as text) c,
make_interval(secs => s) d, make_timestamp(2019,1,1,1,1,1) + make_interval(mins=>s) e,
s % 2 = 0 f
@@ -462,12 +462,12 @@ BOOST_AUTO_TEST_CASE(bulkPerfTest)
int64_t tot = 0;
for (const auto & [a, b, c, d, e, f] : sel->as<int64_t, double, std::string_view, boost::posix_time::time_duration,
boost::posix_time::ptime, bool>()) {
- tot += a + b + c.length() + d.hours() + e.time_of_day().hours() + f;
+ tot += a + static_cast<int64_t>(b) + static_cast<int64_t>(c.length()) + d.hours() + e.time_of_day().hours() + f;
}
BOOST_REQUIRE_EQUAL(tot, 1013265);
}
-BOOST_AUTO_TEST_SUITE_END();
+BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(connfail)
{