KexiDB::Cursor Class Reference
#include <cursor.h>
Inheritance diagram for KexiDB::Cursor:

Detailed Description
Provides database cursor functionality.Cursor can be defined in two ways:
- by passing QuerySchema object to Connection::executeQuery() or Connection::prepareQuery(); then query is defined for in engine-independent way -- this is recommended usage
- by passing raw query statement string to Connection::executeQuery() or Connection::prepareQuery(); then query may be defined for in engine-dependent way -- this is not recommended usage, but convenient when we can't or do not want to allocate QuerySchema object, while we know that the query statement is syntactically and logically ok in our context.
You can move cursor to next record with moveNext() and move back with movePrev(). The cursor is always positioned on record, not between records, with exception that ofter open() it is positioned before first record (if any) -- then bof() equals true, and can be positioned after the last record (if any) with moveNext() -- then eof() equals true, For example, if you have four records 1, 2, 3, 4, then after calling moveNext(), moveNext(), moveNext(), movePrev() you are going through records: 1, 2, 3, 2.
Cursor can be buffered or unbuferred. Buffering in this class is not related to any SQL engine capatibilities for server-side cursors (eg. like 'DECLARE CURSOR' statement) - buffered data is at client (application) side. Any record retrieved in buffered cursor will be stored inside an internal buffer and reused when needed. Unbuffered cursor always requires one record fetching from db connection at every step done with moveNext(), movePrev(), etc.
Notes:
- Do not use delete operator for Cursor objects - this will fail; use Connection::deleteCursor() instead.
- QuerySchema object is not owned by Cursor object that uses it.
Definition at line 66 of file cursor.h.
Public Types | |
| enum | Options { NoOptions = 0, Buffered = 1 } |
| Cursor options that describes its behaviour. More... | |
Public Member Functions | |
| virtual | ~Cursor () |
| Connection * | connection () const |
| bool | open () |
| bool | reopen () |
| virtual bool | close () |
| QuerySchema * | query () const |
| QValueList< QVariant > | queryParameters () const |
| void | setQueryParameters (const QValueList< QVariant > ¶ms) |
| Sets query parameters params for this cursor. | |
| QString | rawStatement () const |
| uint | options () const |
| bool | isOpened () const |
| bool | isBuffered () const |
| void | setBuffered (bool buffered) |
| bool | moveFirst () |
| virtual bool | moveLast () |
| virtual bool | moveNext () |
| virtual bool | movePrev () |
| bool | eof () const |
| bool | bof () const |
| Q_LLONG | at () const |
| uint | fieldCount () const |
| bool | containsROWIDInfo () const |
| virtual QVariant | value (uint i)=0 |
| virtual const char ** | rowData () const =0 |
| void | setOrderByColumnList (const QStringList &columnNames) |
| void | setOrderByColumnList (const QString &column1, const QString &column2=QString::null, const QString &column3=QString::null, const QString &column4=QString::null, const QString &column5=QString::null) |
| QueryColumnInfo::Vector | orderByColumnList () const |
| virtual void | storeCurrentRow (RowData &data) const =0 |
| bool | updateRow (RowData &data, RowEditBuffer &buf, bool useROWID=false) |
| bool | insertRow (RowData &data, RowEditBuffer &buf, bool getROWID=false) |
| bool | deleteRow (RowData &data, bool useROWID=false) |
| bool | deleteAllRows () |
| virtual int | serverResult () |
| virtual QString | serverResultName () |
| virtual QString | serverErrorMsg () |
| QString | debugString () const |
| void | debug () const |
| Outputs debug information. | |
Protected Types | |
| enum | FetchResult { FetchError = 0, FetchOK = 1, FetchEnd = 2 } |
| possible results of row fetching, used for m_result More... | |
Protected Member Functions | |
| Cursor (Connection *conn, const QString &statement, uint options=NoOptions) | |
| Cursor (Connection *conn, QuerySchema &query, uint options=NoOptions) | |
| void | init () |
| bool | getNextRecord () |
| virtual bool | drv_open ()=0 |
| virtual bool | drv_close ()=0 |
| virtual void | drv_getNextRecord ()=0 |
| virtual void | drv_appendCurrentRecordToBuffer ()=0 |
| virtual void | drv_bufferMovePointerNext ()=0 |
| virtual void | drv_bufferMovePointerPrev ()=0 |
| virtual void | drv_bufferMovePointerTo (Q_LLONG at)=0 |
| virtual void | drv_clearBuffer () |
| void | clearBuffer () |
| virtual void | drv_clearServerResult ()=0 |
Protected Attributes | |
| QGuardedPtr< Connection > | m_conn |
| QuerySchema * | m_query |
| QString | m_rawStatement |
| bool | m_opened: 1 |
| bool | m_atLast: 1 |
| bool | m_afterLast: 1 |
| bool | m_validRecord: 1 |
| true if valid record is currently retrieved @ current position | |
| bool | m_containsROWIDInfo: 1 |
| Q_LLONG | m_at |
| uint | m_fieldCount |
| cached field count information | |
| uint | m_logicalFieldCount |
| logical field count, i.e. without intrernal values like ROWID or lookup | |
| uint | m_options |
| cursor options that describes its behaviour | |
| char | m_result |
| result of a row fetching | |
| int | m_records_in_buf |
| number of records currently stored in the buffer | |
| bool | m_buffering_completed: 1 |
| true if we already have all records stored in the buffer | |
| QueryColumnInfo::Vector * | m_fieldsExpanded |
| Useful e.g. for value(int) method when we need access to schema def. | |
| QueryColumnInfo::Vector * | m_orderByColumnList |
| Used by setOrderByColumnList(). | |
| QValueList< QVariant > * | m_queryParameters |
Member Enumeration Documentation
|
|
possible results of row fetching, used for m_result
|
|
|
Cursor options that describes its behaviour.
|
Constructor & Destructor Documentation
|
|
Definition at line 107 of file cursor.cpp. References KexiDBDbg, m_conn, m_fieldsExpanded, m_query, m_queryParameters, and m_rawStatement. |
|
||||||||||||||||
|
Cursor will operate on conn, raw statement will be used to execute query. Definition at line 40 of file cursor.cpp. References init(). |
|
||||||||||||||||
|
Cursor will operate on conn, query schema will be used to execute query. Definition at line 53 of file cursor.cpp. References KexiDB::QuerySchema::debugString(), init(), and KexiDB::SchemaData::name(). |
Member Function Documentation
|
|
Definition at line 349 of file cursor.cpp. References m_at. Referenced by debugString(), KexiDB::pqxxSqlCursor::drv_getNextRecord(), KexiDB::MySqlCursor::drv_getNextRecord(), KexiDB::pqxxSqlCursor::drv_getPrevRecord(), KexiDB::pqxxSqlCursor::rowData(), and KexiDB::SQLiteCursor::storeCurrentRow(). |
|
|
Definition at line 344 of file cursor.cpp. References m_at. Referenced by KexiUserAction::fromCurrentRecord(). |
|
|
Definition at line 370 of file cursor.cpp. References drv_clearBuffer(), isBuffered(), m_fieldCount, and m_records_in_buf. Referenced by close(). |
|
|
Closes previously opened cursor. If the cursor is closed, nothing happens. Definition at line 178 of file cursor.cpp. References clearBuffer(), drv_close(), m_afterLast, m_at, m_fieldCount, m_logicalFieldCount, and m_opened. Referenced by open(), reopen(), KexiDB::MySqlCursor::~MySqlCursor(), KexiDB::pqxxSqlCursor::~pqxxSqlCursor(), and KexiDB::SQLiteCursor::~SQLiteCursor(). |
|
|
Definition at line 80 of file cursor.h. Referenced by KexiDB::pqxxSqlCursor::drv_open(), and KexiQueryView::executeQuery(). |
|
|
|
|
|
Outputs debug information.
Definition at line 524 of file cursor.cpp. References debugString(), and KexiDBDbg. Referenced by KexiDataTableView::setData(). |
|
|
Definition at line 497 of file cursor.cpp. References at(), isBuffered(), isOpened(), m_conn, and m_rawStatement. Referenced by debug(). |
|
|
Definition at line 488 of file cursor.cpp. References KexiDB::Object::clearError(), m_conn, and m_query. |
|
||||||||||||
|
Definition at line 479 of file cursor.cpp. References KexiDB::Object::clearError(), m_conn, and m_query. |
|
|
Stores currently fetched record's values in appropriate place of the buffer. Note for driver developers: This place can be computed using m_at. Do not change value of m_at or any other Cursor members, only change your internal structures like pointer to current row, etc. If your database engine's API function (for record fetching) do not allocates such a space, you want to allocate a space for current record. Otherwise, reuse existing structure, what could be more efficient. All functions like drv_appendCurrentRecordToBuffer() operates on the buffer, i.e. array of stored rows. You are not forced to have any particular fixed structure for buffer item or buffer itself - the structure is internal and only methods like storeCurrentRecord() visible to public. Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by getNextRecord(). |
|
|
Moves pointer (that points to the buffer) -- to next item in this buffer. Note for driver developers: probably just execute "your_pointer++" is enough. Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by getNextRecord(). |
|
|
Like drv_bufferMovePointerNext() but execute "your_pointer--". Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by movePrev(). |
|
|
Moves pointer (that points to the buffer) to a new place: at. Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by getNextRecord(), and movePrev(). |
|
|
Clears cursor's buffer if this was allocated (only for buffered cursor type). Otherwise do nothing. For reimplementing. Default implementation does nothing. Reimplemented in KexiDB::SQLiteCursor. Definition at line 312 of file cursor.h. Referenced by clearBuffer(). |
|
|
Clears an internal member that is used to storing last result code, the same that is returend by serverResult(). Reimplemented from KexiDB::Object. Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. |
|
|
Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by close(). |
|
|
Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by getNextRecord(). |
|
|
Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by open(). |
|
|
Definition at line 339 of file cursor.cpp. References m_afterLast. Referenced by KexiPart::Manager::checkProject(), KexiDB::SQLiteConnection::drv_getTablesList(), KexiDB::pqxxSqlConnection::drv_getTablesList(), KexiDB::MySqlConnection::drv_getTablesList(), KexiUserAction::fromCurrentRecord(), KexiProject::items(), KexiCSVExport::exportData(), KexiDB::Connection::objectIds(), KexiDB::Connection::objectNames(), KexiDB::Connection::querySingleRecordInternal(), KexiDB::Connection::querySingleString(), KexiDB::Connection::queryStringList(), KexiDB::Connection::resultExists(), and KexiDB::Connection::setupTableSchema(). |
|
|
Definition at line 164 of file cursor.h. Referenced by KexiDB::Connection::checkIfColumnExists(), KexiCSVExport::exportData(), and KexiDataTableView::setData(). |
|
|
Internal: cares about proper flag setting depending on result of drv_getNextRecord() and depending on wherher a cursor is buffered. Definition at line 381 of file cursor.cpp. References Buffered, drv_appendCurrentRecordToBuffer(), drv_bufferMovePointerNext(), drv_bufferMovePointerTo(), drv_getNextRecord(), ERR_CURSOR_RECORD_FETCHING, FetchEnd, FetchOK, m_afterLast, m_at, m_buffering_completed, m_options, m_records_in_buf, m_result, m_validRecord, and KexiDB::Object::setError(). Referenced by moveFirst(), moveLast(), moveNext(), and open(). |
|
|
Definition at line 65 of file cursor.cpp. References m_afterLast, m_at, m_atLast, m_buffering_completed, m_conn, m_containsROWIDInfo, m_fieldCount, m_fieldsExpanded, m_logicalFieldCount, m_opened, m_orderByColumnList, m_query, m_queryParameters, m_records_in_buf, m_result, KexiDB::QuerySchema::masterTable(), KexiDB::QuerySchema::WithInternalFields, and KexiDB::QuerySchema::WithInternalFieldsAndRowID. Referenced by Cursor(). |
|
||||||||||||||||
|
Definition at line 470 of file cursor.cpp. References KexiDB::Object::clearError(), m_conn, and m_query. |
|
|
Definition at line 356 of file cursor.cpp. References Buffered, and m_options. Referenced by clearBuffer(), debugString(), KexiDB::SQLiteCursor::drv_open(), and setBuffered(). |
|
|
Definition at line 120 of file cursor.h. Referenced by debugString(), and KexiDataTableView::setData(). |
|
|
Moves current position to the first record and retrieves it.
Definition at line 205 of file cursor.cpp. References Buffered, getNextRecord(), m_afterLast, m_at, m_buffering_completed, m_opened, m_options, m_records_in_buf, m_validRecord, and reopen(). Referenced by KexiPart::Manager::checkProject(), KexiDB::SQLiteConnection::drv_getTablesList(), KexiDB::pqxxSqlConnection::drv_getTablesList(), KexiDB::MySqlConnection::drv_getTablesList(), KexiProject::items(), KexiCSVExport::exportData(), KexiDB::Connection::objectIds(), KexiDB::Connection::objectNames(), KexiDB::Connection::querySingleRecordInternal(), KexiDB::Connection::querySingleString(), KexiDB::Connection::queryStringList(), KexiDB::Connection::resultExists(), and KexiDB::Connection::setupTableSchema(). |
|
|
Moves current position to the last record and retrieves it.
Definition at line 254 of file cursor.cpp. References getNextRecord(), m_afterLast, m_atLast, m_opened, and m_validRecord. |
|
|
Moves current position to the next record and retrieves it. Definition at line 292 of file cursor.cpp. References getNextRecord(), m_afterLast, and m_opened. Referenced by KexiPart::Manager::checkProject(), KexiDB::SQLiteConnection::drv_getTablesList(), KexiDB::pqxxSqlConnection::drv_getTablesList(), KexiDB::MySqlConnection::drv_getTablesList(), KexiMainWindowImpl::initUserActions(), KexiMainWindowImpl::initUserMode(), KexiProject::items(), KexiCSVExport::exportData(), KexiDB::Connection::objectIds(), KexiDB::Connection::objectNames(), KexiDB::Connection::queryStringList(), and KexiDB::Connection::setupTableSchema(). |
|
|
Moves current position to the next record and retrieves it. Currently it's only supported for buffered cursors. Definition at line 303 of file cursor.cpp. References Buffered, drv_bufferMovePointerPrev(), drv_bufferMovePointerTo(), m_afterLast, m_at, m_opened, m_options, m_records_in_buf, and m_validRecord. |
|
|
Opens the cursor using data provided on creation. The data might be either QuerySchema or raw sql statement. Definition at line 131 of file cursor.cpp. References KexiDB::Connection::SelectStatementOptions::alsoRetrieveROWID, close(), drv_open(), ERR_SQL_EXECUTION_ERROR, KexiDB::Object::error(), getNextRecord(), KexiDBDbg, m_afterLast, m_at, m_conn, m_containsROWIDInfo, m_opened, m_query, m_queryParameters, m_rawStatement, KexiDB::Object::m_sql, m_validRecord, options(), and KexiDB::Object::setError(). Referenced by KexiDB::Connection::executeQuery(), reopen(), and KexiDataTableView::setData(). |
|
|
Definition at line 117 of file cursor.h. Referenced by open(). |
|
|
Definition at line 553 of file cursor.cpp. References m_orderByColumnList. |
|
|
Definition at line 103 of file cursor.h. Referenced by KexiDataTableView::setData(). |
|
|
Definition at line 558 of file cursor.cpp. References m_queryParameters. |
|
|
|
|
|
Closes and then opens again the same cursor. If the cursor is not opened it is just opened and result of this open is returned. Otherwise, true is returned if cursor is successfully closed and then opened. Definition at line 198 of file cursor.cpp. References close(), m_opened, and open(). Referenced by moveFirst(). |
|
|
[PROTOTYPE]
Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. |
|
|
Reimplemented from KexiDB::Object. Reimplemented in KexiDB::MySqlCursor, and KexiDB::SQLiteCursor. Definition at line 246 of file cursor.h. Referenced by KexiDataTableView::setData(). |
|
|
Reimplemented from KexiDB::Object. Reimplemented in KexiDB::MySqlCursor, and KexiDB::SQLiteCursor. |
|
|
Reimplemented from KexiDB::Object. Reimplemented in KexiDB::MySqlCursor, and KexiDB::SQLiteCursor. |
|
|
Sets this cursor to buffered type or not. See description of buffered and nonbuffered cursors in class description. This method only works if cursor is not opened (isOpened()==false). You can close already opened cursor and then switch this option on/off. Definition at line 361 of file cursor.cpp. References Buffered, isBuffered(), m_opened, and m_options. |
|
||||||||||||||||||||||||
|
Convenience method, similar to setOrderByColumnList(const QStringList&). Definition at line 541 of file cursor.cpp. |
|
|
Sets a list of columns for ORDER BY section of the query. Only works when the cursor has been created using QuerySchema object (i.e. when query()!=0; does not work with raw statements). Each name on the list must be a field or alias present within the query and must not be covered by aliases. If one or more names cannot be found within the query, the method will have no effect. Any previous ORDER BY settings will be removed. The order list provided here has priority over a list defined in the QuerySchema object itseld (using QuerySchema::setOrderByColumnList()). The QuerySchema object itself is not modifed by this method: only order of records retrieved by this cursor is affected. Use this method before calling open(). You can also call reopen() after calling this method to see effects of applying records order. Definition at line 529 of file cursor.cpp. |
|
|
Sets query parameters params for this cursor.
Definition at line 563 of file cursor.cpp. References m_queryParameters. Referenced by KexiDB::Connection::prepareQuery(). |
|
|
Puts current record's data into data (makes a deep copy). This have unspecified behaviour if the cursor is not at valid record. Note: For reimplementation in driver's code. Shortly, this method translates a row data from internal representation (probably also used in buffer) to simple public RecordData representation. Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by KexiDB::Connection::querySingleRecordInternal(), and KexiDB::Connection::setupTableSchema(). |
|
||||||||||||||||
|
Definition at line 461 of file cursor.cpp. References KexiDB::Object::clearError(), m_conn, and m_query. |
|
|
Implemented in KexiDB::MySqlCursor, KexiDB::pqxxSqlCursor, and KexiDB::SQLiteCursor. Referenced by KexiPart::Manager::checkProject(), KexiDB::SQLiteConnection::drv_getTablesList(), KexiDB::pqxxSqlConnection::drv_getTablesList(), KexiDB::MySqlConnection::drv_getTablesList(), KexiUserAction::fromCurrentRecord(), KexiMainWindowImpl::initUserMode(), KexiProject::items(), KexiCSVExport::exportData(), KexiDB::Connection::objectIds(), KexiDB::Connection::objectNames(), KexiDB::Connection::querySingleString(), and KexiDB::Connection::queryStringList(). |
Member Data Documentation
|
|
Definition at line 328 of file cursor.h. Referenced by close(), KexiDB::pqxxSqlCursor::drv_open(), KexiDB::MySqlCursor::drv_open(), eof(), getNextRecord(), init(), moveFirst(), moveLast(), moveNext(), movePrev(), and open(). |
|
|
Definition at line 332 of file cursor.h. Referenced by at(), bof(), close(), KexiDB::MySqlCursor::drv_bufferMovePointerPrev(), KexiDB::MySqlCursor::drv_open(), getNextRecord(), init(), moveFirst(), movePrev(), and open(). |
|
|
Definition at line 327 of file cursor.h. Referenced by init(), and moveLast(). |
|
|
true if we already have all records stored in the buffer
Definition at line 340 of file cursor.h. Referenced by KexiDB::pqxxSqlCursor::drv_open(), KexiDB::MySqlCursor::drv_open(), getNextRecord(), init(), and moveFirst(). |
|
|
Definition at line 321 of file cursor.h. Referenced by debugString(), deleteAllRows(), deleteRow(), init(), insertRow(), open(), updateRow(), and ~Cursor(). |
|
|
Definition at line 331 of file cursor.h. Referenced by KexiDB::pqxxSqlCursor::drv_open(), init(), open(), and KexiDB::pqxxSqlCursor::storeCurrentRow(). |
|
|
|
Useful e.g. for value(int) method when we need access to schema def.
Definition at line 344 of file cursor.h. Referenced by init(), KexiDB::SQLiteCursor::storeCurrentRow(), KexiDB::MySqlCursor::storeCurrentRow(), KexiDB::SQLiteCursor::value(), KexiDB::MySqlCursor::value(), and ~Cursor(). |
|
|
logical field count, i.e. without intrernal values like ROWID or lookup
|
|
|
Definition at line 325 of file cursor.h. Referenced by close(), KexiDB::MySqlCursor::drv_close(), KexiDB::MySqlCursor::drv_open(), init(), moveFirst(), moveLast(), moveNext(), movePrev(), open(), reopen(), and setBuffered(). |
|
|
cursor options that describes its behaviour
Definition at line 335 of file cursor.h. Referenced by getNextRecord(), isBuffered(), moveFirst(), movePrev(), KexiDB::MySqlCursor::MySqlCursor(), KexiDB::pqxxSqlCursor::pqxxSqlCursor(), and setBuffered(). |
|
|
Used by setOrderByColumnList().
Definition at line 347 of file cursor.h. Referenced by init(), and orderByColumnList(). |
|
|
Definition at line 322 of file cursor.h. Referenced by deleteAllRows(), deleteRow(), init(), insertRow(), open(), updateRow(), and ~Cursor(). |
|
|
Definition at line 349 of file cursor.h. Referenced by init(), open(), queryParameters(), setQueryParameters(), and ~Cursor(). |
|
|
|
