/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #include "apache/das/rdb/Statement.h" namespace apache { namespace das { namespace rdb { Statement::Statement(Connection& connection, SQLHSTMT statementHandle) : resultSet(0, false) { this->statementHandle = statementHandle; this->connection = &connection; } Statement::~Statement(void) { if (!resultSet) { delete resultSet; } SQLFreeHandle(SQL_HANDLE_STMT, statementHandle); StatementObject::free(); } std::string Statement::getError(void) const { SQLCHAR state[5]; SQLCHAR message[1000]; SQLINTEGER nativeError = 0; SQLSMALLINT messageLength = 0; SQLRETURN result = SQLGetDiagRec(SQL_HANDLE_STMT, statementHandle, 1, state, &nativeError, message, 1000, &messageLength); if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { return ""; } if (messageLength < 1000) { message[messageLength + 1] = 0; } std::string ret = (std::string) (char*) state; ret += ": "; ret += StringWrapper::toString((long) nativeError); ret += " - "; ret += (char*) message; return ret; } Connection& Statement::getConnection(void) const { return *connection; } ResultSetPtr Statement::executeQuery(std::string sql) { queryString = sql; SQLCloseCursor(statementHandle); SQLRETURN result = SQLExecDirect(statementHandle, (SQLCHAR*) (char*) sql.c_str(), SQL_NTS); if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { throw SQLException(result, getError()); } return createResultSet(); } ResultSetPtr Statement::createResultSet(void) { if (resultSet) { delete resultSet; } ResultSetPtr ret = new ResultSet((StatementPtr) *this); resultSet = ret; return ret; } void Statement::close(void) { delete this; } HSTMT Statement::getODBCStatement(void) const { return statementHandle; } }; }; };