diff options
Diffstat (limited to 'kexi/plugins/scripting/kexidb/kexidbcursor.h')
-rw-r--r-- | kexi/plugins/scripting/kexidb/kexidbcursor.h | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/kexi/plugins/scripting/kexidb/kexidbcursor.h b/kexi/plugins/scripting/kexidb/kexidbcursor.h new file mode 100644 index 00000000..6e92a38e --- /dev/null +++ b/kexi/plugins/scripting/kexidb/kexidbcursor.h @@ -0,0 +1,159 @@ +/*************************************************************************** + * kexidbcursor.h + * This file is part of the KDE project + * copyright (C)2004-2005 by Sebastian Sauer (mail@dipe.org) + * + * This program 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 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 + * Library General Public License for more details. + * You should have received a copy of the GNU Library General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ***************************************************************************/ + +#ifndef KROSS_KEXIDB_KEXIDBCURSOR_H +#define KROSS_KEXIDB_KEXIDBCURSOR_H + +#include <qstring.h> + +#include <api/object.h> +#include <api/variant.h> +#include <api/list.h> +#include <api/class.h> + +#include <kexidb/cursor.h> +#include <kexidb/roweditbuffer.h> + +namespace Kross { namespace KexiDB { + + // Forward declaration. + class KexiDBConnection; + + /** + * The cursor provides a control structure for the successive traversal + * of records in a result set as returned e.g. by a query. + * + * Example (in Python) that shows how to iterate over the result of a query; + * @code + * # Once we have a KexiDBConnection object we are able to execute a query string and get a cursor as result. + * cursor = connection.executeQueryString("SELECT * from emp") + * # Let's check if the query was successfully. + * if not cursor: raise("Query failed") + * # Walk through all items in the table. + * while(not cursor.eof()): + * # Iterate over the fields the record has. + * for i in range( cursor.fieldCount() ): + * # Print some information. + * print "%s %s %s" % (cursor.at(), i, cursor.value(i)) + * # and move on to the next record. + * cursor.moveNext() + * @endcode + * + * Example (in Python) that shows how to use a cursor to strip + * all whitespaces at the beginning and the end from the values + * in a table; + * @code + * import krosskexidb + * drivermanager = krosskexidb.DriverManager() + * connectiondata = drivermanager.createConnectionDataByFile("/home/me/kexiprojectfile.kexi") + * driver = drivermanager.driver( connectiondata.driverName() ) + * connection = driver.createConnection(connectiondata) + * if not connection.connect(): raise "Failed to connect" + * if not connection.useDatabase( connectiondata.databaseName() ): + * if not connection.useDatabase( connectiondata.fileName() ): + * raise "Failed to use database" + * + * table = connection.tableSchema("emp") + * query = table.query() + * cursor = connection.executeQuerySchema(query) + * if not cursor: raise("Query failed") + * while(not cursor.eof()): + * for i in range( cursor.fieldCount() ): + * v = str( cursor.value(i) ) + * if v.startswith(' ') or v.endswith(' '): + * cursor.setValue(i, v.strip()) + * cursor.moveNext() + * if not cursor.save(): raise "Failed to save changes" + * @endcode + */ + class KexiDBCursor : public Kross::Api::Class<KexiDBCursor> + { + public: + KexiDBCursor(::KexiDB::Cursor* cursor); + virtual ~KexiDBCursor(); + virtual const QString getClassName() const; + + private: + + /** Opens the cursor. */ + bool open(); + /** Returns true if the cursor is opened else false. */ + bool isOpened(); + /** Closes and then opens again the same cursor. */ + bool reopen(); + /** Closes previously opened cursor. */ + bool close(); + + /** Moves current position to the first record and retrieves it. */ + bool moveFirst(); + /** Moves current position to the last record and retrieves it. */ + bool moveLast(); + /** Moves current position to the previous record and retrieves it. */ + bool movePrev(); + /** Moves current position to the next record and retrieves it. */ + bool moveNext(); + + /** Returns true if current position is before first record. */ + bool bof(); + /** Returns true if current position is after last record. */ + bool eof(); + + /** Returns current internal position of the cursor's query. Records + are numbered from 0; the value -1 means that the cursor does not + point to a valid record. */ + Q_LLONG at(); + /** Returns the number of fields available for this cursor. */ + uint fieldCount(); + /** Returns the value stored in the passed column number (counting from 0). */ + QVariant value(uint index); + /** Set the value for the field defined with index. The new value is buffered + and does not got written as long as save() is not called. */ + bool setValue(uint index, QVariant value); + + /** Save any changes done with setValue(). You should call this only once at + the end of all value/setValue iterations cause the cursor is closed once + the changes got saved successfully. */ + bool save(); + + private: + ::KexiDB::Cursor* m_cursor; + + class Record { + public: + ::KexiDB::RowData rowdata; + ::KexiDB::RowEditBuffer* buffer; + Record(::KexiDB::Cursor* cursor) + : buffer( new ::KexiDB::RowEditBuffer(true) ) + { + cursor->storeCurrentRow(rowdata); + } + ~Record() + { + delete buffer; + } + }; + QMap<Q_LLONG, Record*> m_modifiedrecords; + + void clearBuffers(); + }; + +}} + +#endif + |