/*
* Copyright (C) Tildeslash Ltd. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
*
* This program 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
*
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL.
*/
#include "Config.h"
#include
#include "ResultSet.h"
#include "PreparedStatement.h"
/**
* Implementation of the PreparedStatement interface
*
* @file
*/
/* ----------------------------------------------------------- Definitions */
#define T PreparedStatement_T
struct PreparedStatement_S {
Pop_T op;
ResultSet_T resultSet;
PreparedStatementDelegate_T D;
};
/* ------------------------------------------------------- Private methods */
static void _clearResultSet(T P) {
if (P->resultSet)
ResultSet_free(&P->resultSet);
}
/* ----------------------------------------------------- Protected methods */
#ifdef PACKAGE_PROTECTED
#pragma GCC visibility push(hidden)
#endif
T PreparedStatement_new(PreparedStatementDelegate_T D, Pop_T op) {
T P;
assert(D);
assert(op);
NEW(P);
P->D = D;
P->op = op;
return P;
}
void PreparedStatement_free(T *P) {
assert(P && *P);
_clearResultSet((*P));
(*P)->op->free(&((*P)->D));
FREE(*P);
}
#ifdef PACKAGE_PROTECTED
#pragma GCC visibility pop
#endif
/* ------------------------------------------------------------ Parameters */
void PreparedStatement_setString(T P, int parameterIndex, const char *x) {
assert(P);
P->op->setString(P->D, parameterIndex, x);
}
void PreparedStatement_setInt(T P, int parameterIndex, int x) {
assert(P);
P->op->setInt(P->D, parameterIndex, x);
}
void PreparedStatement_setLLong(T P, int parameterIndex, long long x) {
assert(P);
P->op->setLLong(P->D, parameterIndex, x);
}
void PreparedStatement_setDouble(T P, int parameterIndex, double x) {
assert(P);
P->op->setDouble(P->D, parameterIndex, x);
}
void PreparedStatement_setBlob(T P, int parameterIndex, const void *x, int size) {
assert(P);
P->op->setBlob(P->D, parameterIndex, x, size);
}
void PreparedStatement_setTimestamp(T P, int parameterIndex, time_t x) {
assert(P);
P->op->setTimestamp(P->D, parameterIndex, x);
}
/* -------------------------------------------------------- Public methods */
void PreparedStatement_execute(T P) {
assert(P);
_clearResultSet(P);
P->op->execute(P->D);
}
ResultSet_T PreparedStatement_executeQuery(T P) {
assert(P);
_clearResultSet(P);
P->resultSet = P->op->executeQuery(P->D);
if (! P->resultSet)
THROW(SQLException, "PreparedStatement_executeQuery");
return P->resultSet;
}
long long PreparedStatement_rowsChanged(T P) {
assert(P);
return P->op->rowsChanged(P->D);
}
/* ------------------------------------------------------------ Properties */
int PreparedStatement_getParameterCount(T P) {
assert(P);
return P->op->parameterCount(P->D);
}