/* This file is part of the KDE project Copyright (C) 2005 Jaroslaw Staniek This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "preparedstatement.h" #include #include #include using namespace KexiDB; PreparedStatement::PreparedStatement(StatementType type, ConnectionInternal& conn, FieldList& fields, const TQStringList& where) : TDEShared() , m_type(type) , m_fields(&fields) , m_where(where.isEmpty() ? new TQStringList(where) : 0) , m_whereFields(0) { Q_UNUSED(conn); } PreparedStatement::~PreparedStatement() { delete m_where; delete m_whereFields; } TQCString PreparedStatement::generateStatementString() { TQCString s(1024); if (m_type == SelectStatement) { //! @todo only tables and trivial queries supported for select... s = "SELECT "; bool first = true; // for (uint i=0; ifieldCount(); i++) { for (Field::ListIterator it(m_fields->fieldsIterator()); it.current(); ++it) { if (first) first = false; else s.append(", "); s.append(it.current()->name().latin1()); } first = true; s.append(" WHERE "); // for (uint i=0; ifieldCount(); i++) { m_whereFields = new Field::List(); for (TQStringList::ConstIterator it=m_where->constBegin(); it!=m_where->constEnd(); ++it) { // for (Field::ListIterator it(m_fields->fieldsIterator()); it.current(); ++it) { if (first) first = false; else s.append(" AND "); Field *f = m_fields->field(*it); if (!f) { KexiDBWarn << "PreparedStatement::generateStatementString(): no '" << *it << "' field found" << endl; continue; } m_whereFields->append(f); s.append((*it).latin1()); s.append("=?"); } } else if (m_type == InsertStatement /*&& dynamic_cast(m_fields)*/) { //! @todo only tables supported for insert; what about views? TableSchema *table = m_fields->fieldCount()>0 ? m_fields->field(0)->table() : 0; if (!table) return ""; //err TQCString namesList; bool first = true; const bool allTableFieldsUsed = dynamic_cast(m_fields); //we are using a selection of fields only Field::ListIterator it = m_fields->fieldsIterator(); for (uint i=0; ifieldCount(); i++, ++it) { if (first) { s.append( "?" ); if (!allTableFieldsUsed) namesList = it.current()->name().latin1(); first = false; } else { s.append( ",?" ); if (!allTableFieldsUsed) namesList.append(TQCString(", ")+it.current()->name().latin1()); } } s.append(")"); s.prepend(TQCString("INSERT INTO ") + table->name().latin1() + (allTableFieldsUsed ? TQCString() : (" (" + namesList + ")")) + " VALUES ("); } return s; } PreparedStatement& PreparedStatement::operator<< ( const TQVariant& value ) { m_args.append(value); return *this; } /*bool PreparedStatement::insert() { const bool res = m_conn->drv_prepareStatement(this); const bool res = m_conn->drv_insertRecord(this); clearArguments(); return res; } bool PreparedStatement::select() { const bool res = m_conn->drv_bindArgumentForPreparedStatement(this, m_args.count()-1); }*/ void PreparedStatement::clearArguments() { m_args.clear(); }