diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 12:15:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 12:15:43 +0000 |
commit | f5f56e1a1c4d9e9496fcb9d81131066a964ccd23 (patch) | |
tree | 49e44c6f87febed37efb953ab5485aa49f6481a7 /src/lib/pgsql/testutils/pgsql_schema.cc | |
parent | Initial commit. (diff) | |
download | isc-kea-f5f56e1a1c4d9e9496fcb9d81131066a964ccd23.tar.xz isc-kea-f5f56e1a1c4d9e9496fcb9d81131066a964ccd23.zip |
Adding upstream version 2.4.1.upstream/2.4.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/lib/pgsql/testutils/pgsql_schema.cc')
-rw-r--r-- | src/lib/pgsql/testutils/pgsql_schema.cc | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/lib/pgsql/testutils/pgsql_schema.cc b/src/lib/pgsql/testutils/pgsql_schema.cc new file mode 100644 index 0000000..1cf79a5 --- /dev/null +++ b/src/lib/pgsql/testutils/pgsql_schema.cc @@ -0,0 +1,103 @@ +// Copyright (C) 2016-2022 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> +#include <string> +#include <pgsql//pgsql_connection.h> +#include <pgsql/testutils/pgsql_schema.h> +#include <exceptions/exceptions.h> + +#include <libpq-fe.h> + +#include <fstream> +#include <iostream> +#include <sstream> +#include <stdlib.h> + +using namespace std; + +namespace isc { +namespace db { +namespace test { + +const char* PGSQL_VALID_TYPE = "type=postgresql"; + +string +validPgSQLConnectionString() { + return (connectionString(PGSQL_VALID_TYPE, VALID_NAME, VALID_HOST, + VALID_USER, VALID_PASSWORD)); +} + +void destroyPgSQLSchema(bool show_err, bool force) { + // If force is true or wipePgSQLData() fails, destroy the schema. + if (force || (!softWipeEnabled()) || wipePgSQLData(show_err)) { + runPgSQLScript(DATABASE_SCRIPTS_DIR, "pgsql/dhcpdb_drop.pgsql", show_err); + } +} + +void createPgSQLSchema(bool show_err, bool force) { + // If force is true or wipePgSQLData() fails, recreate the schema. + if (force || (!softWipeEnabled()) || wipePgSQLData(show_err)) { + destroyPgSQLSchema(show_err, true); + runPgSQLScript(DATABASE_SCRIPTS_DIR, "pgsql/dhcpdb_create.pgsql", show_err); + } +} + +bool wipePgSQLData(bool show_err) { + std::ostringstream cmd; + + // Pass psql the password via environment variable. + cmd << "export PGPASSWORD=keatest;"; + + // Add in the wipe shell script invocation. + cmd << " sh " << DATABASE_WIPE_DIR << "/pgsql/wipe_data.sh"; + + // Add expected schema version as the wipe script's first argument. + cmd << " " << PGSQL_SCHEMA_VERSION_MAJOR << "." << PGSQL_SCHEMA_VERSION_MINOR; + + // Now add command line arguments for psql. + cmd << " --set ON_ERROR_STOP=1 -A -t -h localhost -q -U keatest -d keatest"; + + // Suppress error output. + if (!show_err) { + cmd << " 2>/dev/null "; + } + + // Execute the command string. + int retval = ::system(cmd.str().c_str()); + if (retval) { + std::cerr << "wipePgSQLData failed:[" << cmd.str() << "]" << std::endl; + } + + return(retval); +} + +void runPgSQLScript(const std::string& path, const std::string& script_name, + bool show_err) { + std::ostringstream cmd; + + cmd << "export PGPASSWORD=keatest; cat "; + if (!path.empty()) { + cmd << " < " << path << "/"; + } + + cmd << script_name + << " | psql --set ON_ERROR_STOP=1 -A -t -h localhost -q -U keatest -d keatest"; + + if (!show_err) { + cmd << " 2>/dev/null "; + } + + int retval = ::system(cmd.str().c_str()); + if (retval) { + std::cerr << "runPgSQLSchema failed: " << cmd.str() << std::endl; + isc_throw(Unexpected, "runPgSQLSchema failed: " << cmd.str()); + } +} + +} // namespace test +} // namespace dhcp +} // namespace isc |