120 lines
2.8 KiB
C
120 lines
2.8 KiB
C
/*
|
|
* Initializes contrib_regression database.
|
|
*
|
|
* DROPs and CREATEs the database, then executes all statements passed in
|
|
* stdin. Use "reset-db < sampletables.sql" to run.
|
|
*
|
|
* This uses the same psqlodbc_test_dsn datasource to connect that the
|
|
* actual regression tests use.
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#ifdef WIN32
|
|
#include <windows.h>
|
|
#define snprintf _snprintf
|
|
#endif
|
|
|
|
#include <sql.h>
|
|
#include <sqlext.h>
|
|
|
|
#include "src/common.h"
|
|
|
|
SQLHENV env;
|
|
SQLHDBC conn;
|
|
static HSTMT hstmt = SQL_NULL_HSTMT;
|
|
|
|
static void
|
|
connect_to_db(char *dsn)
|
|
{
|
|
SQLRETURN ret;
|
|
char errmsg[500];
|
|
SQLSMALLINT textlen;
|
|
char sqlstate[20];
|
|
|
|
SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
|
|
|
|
ret = SQLDriverConnect(conn, NULL, (SQLCHAR *) dsn, SQL_NTS, NULL, 0, NULL,
|
|
SQL_DRIVER_NOPROMPT);
|
|
if (!SQL_SUCCEEDED(ret))
|
|
{
|
|
printf("connection to %s failed\n", dsn);
|
|
|
|
ret = SQLGetDiagRec(SQL_HANDLE_DBC, conn, 1, sqlstate, NULL,
|
|
errmsg, sizeof(errmsg), &textlen);
|
|
if (ret == SQL_INVALID_HANDLE)
|
|
printf("Invalid handle\n");
|
|
else if (SQL_SUCCEEDED(ret))
|
|
printf("%s=%s\n", sqlstate, errmsg);
|
|
exit(1);
|
|
}
|
|
|
|
printf("connected to %s\n", dsn);
|
|
|
|
ret = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
|
|
if (!SQL_SUCCEEDED(ret))
|
|
{
|
|
printf("SQLAllocHandle failed\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
static void
|
|
run_statement(char *statement)
|
|
{
|
|
SQLRETURN ret;
|
|
char errmsg[500];
|
|
SQLSMALLINT textlen;
|
|
char sqlstate[20];
|
|
|
|
/*
|
|
* Skip empty lines. The server would just ignore them too, but might as
|
|
* well avoid the round-trip.
|
|
*/
|
|
if (statement[0] == '\0' || statement[0] == '\n')
|
|
return;
|
|
|
|
/* Skip comment lines too. */
|
|
if (statement[0] == '-' && statement[1] == '-')
|
|
return;
|
|
|
|
ret = SQLExecDirect(hstmt, (SQLCHAR *) statement, SQL_NTS);
|
|
if (!SQL_SUCCEEDED(ret))
|
|
{
|
|
printf("Statement failed: %s\n", statement);
|
|
ret = SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, sqlstate, NULL,
|
|
errmsg, sizeof(errmsg), &textlen);
|
|
if (ret == SQL_INVALID_HANDLE)
|
|
printf("Invalid handle\n");
|
|
else if (SQL_SUCCEEDED(ret))
|
|
printf("%s=%s\n", sqlstate, errmsg);
|
|
exit(1);
|
|
}
|
|
(void) SQLFreeStmt(hstmt, SQL_CLOSE);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
char line[500], dsn[100];
|
|
|
|
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
|
|
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
|
|
|
|
snprintf(dsn, sizeof(dsn), "DSN=%s;Database=postgres", get_test_dsn());
|
|
connect_to_db(dsn);
|
|
printf("Dropping and creating database contrib_regression...\n");
|
|
run_statement("DROP DATABASE IF EXISTS contrib_regression");
|
|
run_statement("CREATE DATABASE contrib_regression");
|
|
|
|
snprintf(dsn, sizeof(dsn), "DSN=%s;Database=contrib_regression", get_test_dsn());
|
|
connect_to_db(dsn);
|
|
|
|
printf("Running initialization script...\n");
|
|
while (fgets(line, sizeof(line), stdin) != NULL)
|
|
run_statement(line);
|
|
|
|
printf("Done!\n");
|
|
|
|
return 0;
|
|
}
|