Skip to content
Snippets Groups Projects
Select Git revision
  • 73c4b8a4b3d61b45131f75b2cc5ab9afbfc6686a
  • master default protected
  • image_support_for_boolean
  • image_support_lofar_fixes
  • image_support
  • moved-to-gitlab
  • remove-libpqxx-submodule
  • v0.11.2
  • v0.11.1
  • v0.11.0
  • v0.10.0
  • v0.9.1
  • v0.9.0
13 results

DbInsertionTests.cpp

Blame
  • user avatar
    Stuart James authored
    73c4b8a4
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    DbInsertionTests.cpp 29.30 KiB
    /* Copyright (C) : 2014-2019
       European Synchrotron Radiation Facility
       BP 220, Grenoble 38043, FRANCE
    
       This file is part of libhdb++timescale.
    
       libhdb++timescale is free software: you can redistribute it and/or modify
       it under the terms of the Lesser GNU General Public License as published by
       the Free Software Foundation, either version 3 of the License, or
       (at your option) any later version.
    
       libhdb++timescale is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser
       GNU General Public License for more details.
    
       You should have received a copy of the Lesser GNU General Public License
       along with libhdb++timescale.  If not, see <http://www.gnu.org/licenses/>. */
    
    #include "DbConnection.hpp"
    #include "HdbppDefines.hpp"
    #include "QueryBuilder.hpp"
    #include "TestHelpers.hpp"
    
    #include <benchmark/benchmark.h>
    #include <memory>
    
    //=============================================================================
    //=============================================================================
    void clearTables()
    {
        auto conn = make_unique<pqxx::connection>(hdbpp_test::psql_connection::postgres_db::HdbppConnectionString);
    
        auto traits_array = hdbpp_test::utils::getTraits();
    
        {
            auto query = string("TRUNCATE ");
    
            pqxx::work tx {*conn};
    
            for (auto &traits : traits_array)
            {
                query += hdbpp_internal::pqxx_conn::QueryBuilder::tableName(traits);
                query += ",";
            }
    
            query += hdbpp_internal::pqxx_conn::schema::ErrTableName + ",";
            query += hdbpp_internal::pqxx_conn::schema::ParamTableName + ",";
            query += hdbpp_internal::pqxx_conn::schema::HistoryEventTableName + ",";
            query += hdbpp_internal::pqxx_conn::schema::HistoryTableName + ",";
            query += hdbpp_internal::pqxx_conn::schema::ConfTableName + " RESTART IDENTITY";
    
            tx.exec(query);
            tx.commit();
        }
    }
    
    //=============================================================================
    //=============================================================================
    template<Tango::CmdArgType Type, Tango::AttrDataFormat Format, int Size = 0>
    void bmAllocateData(benchmark::State &state)
    {
        // TEST - Test data allocation time, so we can subtract it from the db write
        // tests
        hdbpp_internal::LogConfigurator::initLogging("test");
        hdbpp_internal::AttributeTraits traits {Tango::READ_WRITE, Format, Type};
    
        for (auto _ : state)
        {
            for (int i = 0; i < 1000; i++)
            {
                if (Format == Tango::SPECTRUM)
                {
                    auto value_r = hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size);
                    auto value_w = hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size);
                }
                else
                {
                    auto value_r = hdbpp_test::data_gen::generateData<Type>(traits);
                    auto value_w = hdbpp_test::data_gen::generateData<Type>(traits);
                }
            }
        }
    }
    
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_BOOLEAN, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_SHORT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_LONG, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_LONG64, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_FLOAT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_DOUBLE, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_UCHAR, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_USHORT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_ULONG, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_ULONG64, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_STRING, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_STATE, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_BOOLEAN, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_SHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_LONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_LONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_FLOAT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_DOUBLE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_UCHAR, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_USHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_ULONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_ULONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_STRING, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmAllocateData, Tango::DEV_STATE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    
    //=============================================================================
    //=============================================================================
    template<Tango::CmdArgType Type, Tango::AttrDataFormat Format, int Size = 0>
    void bmDbMultipleSQLInsert(benchmark::State &state)
    {
        // TEST - Test the write speed when pushing a single event at a time
        // to the database. This version inserts via strings
        hdbpp_internal::LogConfigurator::initLogging("test");
        clearTables();
    
        hdbpp_internal::AttributeTraits traits {Tango::READ, Format, Type};
    
        hdbpp_internal::pqxx_conn::DbConnection conn(hdbpp_internal::pqxx_conn::DbConnection::DbStoreMethod::InsertString);
    
        conn.connect(hdbpp_test::psql_connection::postgres_db::HdbppConnectionString);
    
        conn.storeAttribute(hdbpp_test::attr_name::TestAttrFinalName,
            hdbpp_test::attr_name::TestAttrCs,
            hdbpp_test::attr_name::TestAttrDomain,
            hdbpp_test::attr_name::TestAttrFamily,
            hdbpp_test::attr_name::TestAttrMember,
            hdbpp_test::attr_name::TestAttrName,
            0,
            traits);
    
        struct timeval tv
        {};
    
        for (auto _ : state)
        {
            for (int i = 0; i < 1000; i++)
            {
                gettimeofday(&tv, nullptr);
                double event_time = tv.tv_sec + tv.tv_usec / 1.0e6;
    
                if (Format == Tango::SPECTRUM)
                {
                    conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                        event_time,
                        1,
                        move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                        move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                        traits);
                }
                else
                {
                    conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                        event_time,
                        1,
                        move(hdbpp_test::data_gen::generateData<Type>(traits)),
                        move(hdbpp_test::data_gen::generateData<Type>(traits)),
                        traits);
                }
            }
        }
    
        conn.disconnect();
    }
    
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_BOOLEAN, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_SHORT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_LONG, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_LONG64, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_FLOAT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_DOUBLE, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_UCHAR, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_USHORT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_ULONG, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_ULONG64, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_STRING, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_STATE, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_BOOLEAN, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_SHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_LONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_LONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_FLOAT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_DOUBLE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_UCHAR, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_USHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_ULONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_ULONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_STRING, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultipleSQLInsert, Tango::DEV_STATE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    
    //=============================================================================
    //=============================================================================
    template<Tango::CmdArgType Type, Tango::AttrDataFormat Format, int Size = 0>
    void bmDbMultiplePreparedStatementInsert(benchmark::State &state)
    {
        // TEST - Test the write speed when pushing a single event at a time
        // to the database. This version inserts via prepared statements
        hdbpp_internal::LogConfigurator::initLogging("test");
        clearTables();
    
        hdbpp_internal::AttributeTraits traits {Tango::READ, Format, Type};
    
        hdbpp_internal::pqxx_conn::DbConnection conn(
            hdbpp_internal::pqxx_conn::DbConnection::DbStoreMethod::PreparedStatement);
    
        conn.connect(hdbpp_test::psql_connection::postgres_db::HdbppConnectionString);
    
        conn.storeAttribute(hdbpp_test::attr_name::TestAttrFinalName,
            hdbpp_test::attr_name::TestAttrCs,
            hdbpp_test::attr_name::TestAttrDomain,
            hdbpp_test::attr_name::TestAttrFamily,
            hdbpp_test::attr_name::TestAttrMember,
            hdbpp_test::attr_name::TestAttrName,
            0,
            traits);
    
        struct timeval tv
        {};
    
        for (auto _ : state)
        {
            for (int i = 0; i < 1000; i++)
            {
                gettimeofday(&tv, nullptr);
                double event_time = tv.tv_sec + tv.tv_usec / 1.0e6;
    
                if (Format == Tango::SPECTRUM)
                {
                    conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                        event_time,
                        1,
                        move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                        move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                        traits);
                }
                else
                {
                    conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                        event_time,
                        1,
                        move(hdbpp_test::data_gen::generateData<Type>(traits)),
                        move(hdbpp_test::data_gen::generateData<Type>(traits)),
                        traits);
                }
            }
        }
    
        conn.disconnect();
    }
    
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_BOOLEAN, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_SHORT, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_LONG, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_LONG64, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_FLOAT, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_DOUBLE, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_UCHAR, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_USHORT, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_ULONG, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_ULONG64, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_STRING, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_STATE, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_BOOLEAN, Tango::SCALAR)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_SHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_LONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_LONG64, Tango::SCALAR)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_FLOAT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_DOUBLE, Tango::SCALAR)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_UCHAR, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_USHORT, Tango::SCALAR)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_ULONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_ULONG64, Tango::SCALAR)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_STRING, Tango::SCALAR)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbMultiplePreparedStatementInsert, Tango::DEV_STATE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    
    //=============================================================================
    //=============================================================================
    template<Tango::CmdArgType Type, Tango::AttrDataFormat Format, int Size = 0>
    void bmDbBatchedInsert(benchmark::State &state)
    {
        // TEST - Test the write speed when pushing a multiple events at once to
        // the db
        hdbpp_internal::LogConfigurator::initLogging("test");
        clearTables();
    
        hdbpp_internal::AttributeTraits traits {Tango::READ, Format, Type};
    
        hdbpp_internal::pqxx_conn::DbConnection conn(
            hdbpp_internal::pqxx_conn::DbConnection::DbStoreMethod::PreparedStatement);
    
        conn.connect(hdbpp_test::psql_connection::postgres_db::HdbppConnectionString);
        conn.buffer(true);
    
        conn.storeAttribute(hdbpp_test::attr_name::TestAttrFinalName,
            hdbpp_test::attr_name::TestAttrCs,
            hdbpp_test::attr_name::TestAttrDomain,
            hdbpp_test::attr_name::TestAttrFamily,
            hdbpp_test::attr_name::TestAttrMember,
            hdbpp_test::attr_name::TestAttrName,
            0,
            traits);
    
        struct timeval tv
        {};
    
        for (auto _ : state)
        {
            for (int i = 0; i < 1000; i++)
            {
                gettimeofday(&tv, nullptr);
                double event_time = tv.tv_sec + tv.tv_usec / 1.0e6;
    
                if (Format == Tango::SPECTRUM)
                {
                    conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                        event_time,
                        1,
                        move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                        move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                        traits);
                }
                else
                {
                    conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                        event_time,
                        1,
                        move(hdbpp_test::data_gen::generateData<Type>(traits)),
                        move(hdbpp_test::data_gen::generateData<Type>(traits)),
                        traits);
                }
            }
    
            conn.flush();
        }
    
        conn.buffer(false);
        conn.disconnect();
    }
    
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_BOOLEAN, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_SHORT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_LONG, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_LONG64, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_FLOAT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_DOUBLE, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_UCHAR, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_USHORT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_ULONG, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_ULONG64, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_STRING, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_STATE, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_BOOLEAN, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_SHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_LONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_LONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_FLOAT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_DOUBLE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_UCHAR, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_USHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_ULONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_ULONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_STRING, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbBatchedInsert, Tango::DEV_STATE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    
    //=============================================================================
    //=============================================================================
    template<Tango::CmdArgType Type, Tango::AttrDataFormat Format, int Size = 0>
    void bmDbSingleSQLInsert(benchmark::State &state)
    {
        // TEST - Test the write speed when pushing a single event via sql
        hdbpp_internal::LogConfigurator::initLogging("test");
        clearTables();
    
        hdbpp_internal::AttributeTraits traits {Tango::READ, Format, Type};
    
        hdbpp_internal::pqxx_conn::DbConnection conn(hdbpp_internal::pqxx_conn::DbConnection::DbStoreMethod::InsertString);
    
        conn.connect(hdbpp_test::psql_connection::postgres_db::HdbppConnectionString);
    
        conn.storeAttribute(hdbpp_test::attr_name::TestAttrFinalName,
            hdbpp_test::attr_name::TestAttrCs,
            hdbpp_test::attr_name::TestAttrDomain,
            hdbpp_test::attr_name::TestAttrFamily,
            hdbpp_test::attr_name::TestAttrMember,
            hdbpp_test::attr_name::TestAttrName,
            0,
            traits);
    
        struct timeval tv
        {};
    
        for (auto _ : state)
        {
            gettimeofday(&tv, nullptr);
            double event_time = tv.tv_sec + tv.tv_usec / 1.0e6;
    
            if (Format == Tango::SPECTRUM)
            {
                conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                    event_time,
                    1,
                    move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                    move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                    traits);
            }
            else
            {
                conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                    event_time,
                    1,
                    move(hdbpp_test::data_gen::generateData<Type>(traits)),
                    move(hdbpp_test::data_gen::generateData<Type>(traits)),
                    traits);
            }
        }
    
        conn.buffer(false);
        conn.disconnect();
    }
    
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_BOOLEAN, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_SHORT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_LONG, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_LONG64, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_FLOAT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_DOUBLE, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_UCHAR, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_USHORT, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_ULONG, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_ULONG64, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_STRING, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_STATE, Tango::SPECTRUM, 512)->Unit(benchmark::kMillisecond);
    
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_BOOLEAN, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_SHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_LONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_LONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_FLOAT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_DOUBLE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_UCHAR, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_USHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_ULONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_ULONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_STRING, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSingleSQLInsert, Tango::DEV_STATE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    
    //=============================================================================
    //=============================================================================
    template<Tango::CmdArgType Type, Tango::AttrDataFormat Format, int Size = 0>
    void bmDbSinglePreparedStatementInsert(benchmark::State &state)
    {
        // TEST - Test the write speed when pushing a single event via sql
        hdbpp_internal::LogConfigurator::initLogging("test");
        clearTables();
    
        hdbpp_internal::AttributeTraits traits {Tango::READ, Format, Type};
    
        hdbpp_internal::pqxx_conn::DbConnection conn(
            hdbpp_internal::pqxx_conn::DbConnection::DbStoreMethod::PreparedStatement);
    
        conn.connect(hdbpp_test::psql_connection::postgres_db::HdbppConnectionString);
    
        conn.storeAttribute(hdbpp_test::attr_name::TestAttrFinalName,
            hdbpp_test::attr_name::TestAttrCs,
            hdbpp_test::attr_name::TestAttrDomain,
            hdbpp_test::attr_name::TestAttrFamily,
            hdbpp_test::attr_name::TestAttrMember,
            hdbpp_test::attr_name::TestAttrName,
            0,
            traits);
    
        struct timeval tv
        {};
    
        for (auto _ : state)
        {
            gettimeofday(&tv, nullptr);
            double event_time = tv.tv_sec + tv.tv_usec / 1.0e6;
    
            if (Format == Tango::SPECTRUM)
            {
                conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                    event_time,
                    1,
                    move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                    move(hdbpp_test::data_gen::generateSpectrumData<Type>(false, Size)),
                    traits);
            }
            else
            {
                conn.storeDataEvent(hdbpp_test::attr_name::TestAttrFinalName,
                    event_time,
                    1,
                    move(hdbpp_test::data_gen::generateData<Type>(traits)),
                    move(hdbpp_test::data_gen::generateData<Type>(traits)),
                    traits);
            }
        }
    
        conn.buffer(false);
        conn.disconnect();
    }
    
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_BOOLEAN, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_SHORT, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_LONG, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_LONG64, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_FLOAT, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_DOUBLE, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_UCHAR, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_USHORT, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_ULONG, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_ULONG64, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_STRING, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_STATE, Tango::SPECTRUM, 512)
        ->Unit(benchmark::kMillisecond);
    
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_BOOLEAN, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_SHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_LONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_LONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_FLOAT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_DOUBLE, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_UCHAR, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_USHORT, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_ULONG, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_ULONG64, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_STRING, Tango::SCALAR)->Unit(benchmark::kMillisecond);
    BENCHMARK_TEMPLATE(bmDbSinglePreparedStatementInsert, Tango::DEV_STATE, Tango::SCALAR)->Unit(benchmark::kMillisecond);