[196] | 1 | /****************************************************************************
|
---|
| 2 | **
|
---|
| 3 | ** Implementation of QSqlCursor class
|
---|
| 4 | **
|
---|
| 5 | ** Created : 2000-11-03
|
---|
| 6 | **
|
---|
| 7 | ** Copyright (C) 2005-2007 Trolltech ASA. All rights reserved.
|
---|
| 8 | **
|
---|
| 9 | ** This file is part of the sql module of the Qt GUI Toolkit.
|
---|
| 10 | **
|
---|
| 11 | ** This file may be distributed under the terms of the Q Public License
|
---|
| 12 | ** as defined by Trolltech ASA of Norway and appearing in the file
|
---|
| 13 | ** LICENSE.QPL included in the packaging of this file.
|
---|
| 14 | **
|
---|
| 15 | ** This file may be distributed and/or modified under the terms of the
|
---|
| 16 | ** GNU General Public License version 2 as published by the Free Software
|
---|
| 17 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
---|
| 18 | ** packaging of this file.
|
---|
| 19 | **
|
---|
| 20 | ** Licensees holding valid Qt Enterprise Edition licenses may use this
|
---|
| 21 | ** file in accordance with the Qt Commercial License Agreement provided
|
---|
| 22 | ** with the Software.
|
---|
| 23 | **
|
---|
| 24 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
---|
| 25 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
---|
| 26 | **
|
---|
| 27 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
|
---|
| 28 | ** information about Qt Commercial License Agreements.
|
---|
| 29 | ** See http://www.trolltech.com/qpl/ for QPL licensing information.
|
---|
| 30 | ** See http://www.trolltech.com/gpl/ for GPL licensing information.
|
---|
| 31 | **
|
---|
| 32 | ** Contact info@trolltech.com if any conditions of this licensing are
|
---|
| 33 | ** not clear to you.
|
---|
| 34 | **
|
---|
| 35 | **********************************************************************/
|
---|
| 36 |
|
---|
| 37 | #include "qsqlcursor.h"
|
---|
| 38 |
|
---|
| 39 | #ifndef QT_NO_SQL
|
---|
| 40 |
|
---|
| 41 | #include "qsqldriver.h"
|
---|
| 42 | #include "qsqlresult.h"
|
---|
| 43 | #include "qdatetime.h"
|
---|
| 44 | #include "qsqldatabase.h"
|
---|
| 45 | #include "qsql.h"
|
---|
| 46 |
|
---|
| 47 | class QSqlCursorPrivate
|
---|
| 48 | {
|
---|
| 49 | public:
|
---|
| 50 |
|
---|
| 51 | QSqlCursorPrivate( const QString& name, QSqlDatabase* sdb )
|
---|
| 52 | : lastAt( QSql::BeforeFirst ), nm( name ), srt( name ), md( 0 ), db( sdb ), q( 0 )
|
---|
| 53 | {}
|
---|
| 54 | ~QSqlCursorPrivate()
|
---|
| 55 | {
|
---|
| 56 | delete q;
|
---|
| 57 | }
|
---|
| 58 |
|
---|
| 59 | QSqlQuery* query()
|
---|
| 60 | {
|
---|
| 61 | if ( !q )
|
---|
| 62 | q = new QSqlQuery( 0, db );
|
---|
| 63 | return q;
|
---|
| 64 | }
|
---|
| 65 |
|
---|
| 66 | int lastAt;
|
---|
| 67 | QString nm; //name
|
---|
| 68 | QSqlIndex srt; //sort
|
---|
| 69 | QString ftr; //filter
|
---|
| 70 | int md; //mode
|
---|
| 71 | QSqlIndex priIndx; //primary index
|
---|
| 72 | QSqlRecord editBuffer;
|
---|
| 73 | // the primary index as it was before the user changed the values in editBuffer
|
---|
| 74 | QString editIndex;
|
---|
| 75 | QSqlRecordInfo infoBuffer;
|
---|
| 76 | QSqlDatabase* db;
|
---|
| 77 | QSqlQuery* q;
|
---|
| 78 | };
|
---|
| 79 |
|
---|
| 80 | QString qOrderByClause( const QSqlIndex & i, const QString& prefix = QString::null )
|
---|
| 81 | {
|
---|
| 82 | QString str;
|
---|
| 83 | int k = i.count();
|
---|
| 84 | if( k == 0 ) return QString::null;
|
---|
| 85 | str = " order by " + i.toString( prefix );
|
---|
| 86 | return str;
|
---|
| 87 | }
|
---|
| 88 |
|
---|
| 89 | QString qWhereClause( const QString& prefix, QSqlField* field, const QSqlDriver* driver )
|
---|
| 90 | {
|
---|
| 91 | QString f;
|
---|
| 92 | if ( field && driver ) {
|
---|
| 93 | f = ( prefix.length() > 0 ? prefix + QString(".") : QString::null ) + field->name();
|
---|
| 94 | if ( field->isNull() ) {
|
---|
| 95 | f += " IS NULL";
|
---|
| 96 | } else {
|
---|
| 97 | f += " = " + driver->formatValue( field );
|
---|
| 98 | }
|
---|
| 99 | }
|
---|
| 100 | return f;
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | QString qWhereClause( QSqlRecord* rec, const QString& prefix, const QString& sep,
|
---|
| 104 | const QSqlDriver* driver )
|
---|
| 105 | {
|
---|
| 106 | static QString blank( " " );
|
---|
| 107 | QString filter;
|
---|
| 108 | bool separator = FALSE;
|
---|
| 109 | for ( uint j = 0; j < rec->count(); ++j ) {
|
---|
| 110 | QSqlField* f = rec->field( j );
|
---|
| 111 | if ( rec->isGenerated( j ) ) {
|
---|
| 112 | if ( separator )
|
---|
| 113 | filter += sep + blank;
|
---|
| 114 | filter += qWhereClause( prefix, f, driver );
|
---|
| 115 | filter += blank;
|
---|
| 116 | separator = TRUE;
|
---|
| 117 | }
|
---|
| 118 | }
|
---|
| 119 | return filter;
|
---|
| 120 | }
|
---|
| 121 |
|
---|
| 122 | /*!
|
---|
| 123 | \class QSqlCursor qsqlcursor.h
|
---|
| 124 | \brief The QSqlCursor class provides browsing and editing of SQL
|
---|
| 125 | tables and views.
|
---|
| 126 |
|
---|
| 127 | \ingroup database
|
---|
| 128 | \module sql
|
---|
| 129 |
|
---|
| 130 | A QSqlCursor is a database record (see \l QSqlRecord) that
|
---|
| 131 | corresponds to a table or view within an SQL database (see \l
|
---|
| 132 | QSqlDatabase). There are two buffers in a cursor, one used for
|
---|
| 133 | browsing and one used for editing records. Each buffer contains a
|
---|
| 134 | list of fields which correspond to the fields in the table or
|
---|
| 135 | view.
|
---|
| 136 |
|
---|
| 137 | When positioned on a valid record, the browse buffer contains the
|
---|
| 138 | values of the current record's fields from the database. The edit
|
---|
| 139 | buffer is separate, and is used for editing existing records and
|
---|
| 140 | inserting new records.
|
---|
| 141 |
|
---|
| 142 | For browsing data, a cursor must first select() data from the
|
---|
| 143 | database. After a successful select() the cursor is active
|
---|
| 144 | (isActive() returns TRUE), but is initially not positioned on a
|
---|
| 145 | valid record (isValid() returns FALSE). To position the cursor on
|
---|
| 146 | a valid record, use one of the navigation functions, next(),
|
---|
| 147 | prev(), first(), last(), or seek(). Once positioned on a valid
|
---|
| 148 | record, data can be retrieved from the browse buffer using
|
---|
| 149 | value(). If a navigation function is not successful, it returns
|
---|
| 150 | FALSE, the cursor will no longer be positioned on a valid record
|
---|
| 151 | and the values returned by value() are undefined.
|
---|
| 152 |
|
---|
| 153 | For example:
|
---|
| 154 |
|
---|
| 155 | \quotefile sql/overview/retrieve2/main.cpp
|
---|
| 156 | \skipto QSqlCursor
|
---|
| 157 | \printline QSqlCursor
|
---|
| 158 | \printuntil }
|
---|
| 159 |
|
---|
| 160 | In the above example, a cursor is created specifying a table or
|
---|
| 161 | view name in the database. Then, select() is called, which can be
|
---|
| 162 | optionally parameterised to filter and order the records
|
---|
| 163 | retrieved. Each record in the cursor is retrieved using next().
|
---|
| 164 | When next() returns FALSE, there are no more records to process,
|
---|
| 165 | and the loop terminates.
|
---|
| 166 |
|
---|
| 167 | For editing records (rows of data), a cursor contains a separate
|
---|
| 168 | edit buffer which is independent of the fields used when browsing.
|
---|
| 169 | The functions insert(), update() and del() operate on the edit
|
---|
| 170 | buffer. This allows the cursor to be repositioned to other
|
---|
| 171 | records while simultaneously maintaining a separate buffer for
|
---|
| 172 | edits. You can get a pointer to the edit buffer using
|
---|
| 173 | editBuffer(). The primeInsert(), primeUpdate() and primeDelete()
|
---|
| 174 | functions also return a pointer to the edit buffer and prepare it
|
---|
| 175 | for insert, update and delete respectively. Edit operations only
|
---|
| 176 | affect a single row at a time. Note that update() and del()
|
---|
| 177 | require that the table or view contain a primaryIndex() to ensure
|
---|
| 178 | that edit operations affect a unique record within the database.
|
---|
| 179 |
|
---|
| 180 | For example:
|
---|
| 181 |
|
---|
| 182 | \quotefile sql/overview/update/main.cpp
|
---|
| 183 | \skipto prices
|
---|
| 184 | \printline prices
|
---|
| 185 | \printuntil update
|
---|
| 186 | \printline
|
---|
| 187 |
|
---|
| 188 | To edit an existing database record, first move to the record you
|
---|
| 189 | wish to update. Call primeUpdate() to get the pointer to the
|
---|
| 190 | cursor's edit buffer. Then use this pointer to modify the values
|
---|
| 191 | in the edit buffer. Finally, call update() to save the changes to
|
---|
| 192 | the database. The values in the edit buffer will be used to
|
---|
| 193 | locate the appropriate record when updating the database (see
|
---|
| 194 | primaryIndex()).
|
---|
| 195 |
|
---|
| 196 | Similarly, when deleting an existing database record, first move
|
---|
| 197 | to the record you wish to delete. Then, call primeDelete() to get
|
---|
| 198 | the pointer to the edit buffer. Finally, call del() to delete the
|
---|
| 199 | record from the database. Again, the values in the edit buffer
|
---|
| 200 | will be used to locate and delete the appropriate record.
|
---|
| 201 |
|
---|
| 202 | To insert a new record, call primeInsert() to get the pointer to
|
---|
| 203 | the edit buffer. Use this pointer to populate the edit buffer
|
---|
| 204 | with new values and then insert() the record into the database.
|
---|
| 205 |
|
---|
| 206 | After calling insert(), update() or del(), the cursor is no longer
|
---|
| 207 | positioned on a valid record and can no longer be navigated
|
---|
| 208 | (isValid() return FALSE). The reason for this is that any changes
|
---|
| 209 | made to the database will not be visible until select() is called
|
---|
| 210 | to refresh the cursor. You can change this behavior by passing
|
---|
| 211 | FALSE to insert(), update() or del() which will prevent the cursor
|
---|
| 212 | from becoming invalid. The edits will still not be visible when
|
---|
| 213 | navigating the cursor until select() is called.
|
---|
| 214 |
|
---|
| 215 | QSqlCursor contains virtual methods which allow editing behavior
|
---|
| 216 | to be customized by subclasses. This allows custom cursors to be
|
---|
| 217 | created that encapsulate the editing behavior of a database table
|
---|
| 218 | for an entire application. For example, a cursor can be customized
|
---|
| 219 | to always auto-number primary index fields, or provide fields with
|
---|
| 220 | suitable default values, when inserting new records. QSqlCursor
|
---|
| 221 | generates SQL statements which are sent to the database engine;
|
---|
| 222 | you can control which fields are included in these statements
|
---|
| 223 | using setGenerated().
|
---|
| 224 |
|
---|
| 225 | Note that QSqlCursor does not inherit from QObject. This means
|
---|
| 226 | that you are responsible for destroying instances of this class
|
---|
| 227 | yourself. However if you create a QSqlCursor and use it in a
|
---|
| 228 | \l QDataTable, \l QDataBrowser or a \l QDataView these classes will
|
---|
| 229 | usually take ownership of the cursor and destroy it when they
|
---|
| 230 | don't need it anymore. The documentation for QDataTable,
|
---|
| 231 | QDataBrowser and QDataView explicitly states which calls take
|
---|
| 232 | ownership of the cursor.
|
---|
| 233 | */
|
---|
| 234 |
|
---|
| 235 | /*!
|
---|
| 236 | \enum QSqlCursor::Mode
|
---|
| 237 |
|
---|
| 238 | This enum type describes how QSqlCursor operates on records in the
|
---|
| 239 | database.
|
---|
| 240 |
|
---|
| 241 | \value ReadOnly the cursor can only SELECT records from the
|
---|
| 242 | database.
|
---|
| 243 |
|
---|
| 244 | \value Insert the cursor can INSERT records into the database.
|
---|
| 245 |
|
---|
| 246 | \value Update the cursor can UPDATE records in the database.
|
---|
| 247 |
|
---|
| 248 | \value Delete the cursor can DELETE records from the database.
|
---|
| 249 |
|
---|
| 250 | \value Writable the cursor can INSERT, UPDATE and DELETE records
|
---|
| 251 | in the database.
|
---|
| 252 | */
|
---|
| 253 |
|
---|
| 254 | /*!
|
---|
| 255 | Constructs a cursor on database \a db using table or view \a name.
|
---|
| 256 |
|
---|
| 257 | If \a autopopulate is TRUE (the default), the \a name of the
|
---|
| 258 | cursor must correspond to an existing table or view name in the
|
---|
| 259 | database so that field information can be automatically created.
|
---|
| 260 | If the table or view does not exist, the cursor will not be
|
---|
| 261 | functional.
|
---|
| 262 |
|
---|
| 263 | The cursor is created with an initial mode of QSqlCursor::Writable
|
---|
| 264 | (meaning that records can be inserted, updated or deleted using
|
---|
| 265 | the cursor). If the cursor does not have a unique primary index,
|
---|
| 266 | update and deletes cannot be performed.
|
---|
| 267 |
|
---|
| 268 | Note that \a autopopulate refers to populating the cursor with
|
---|
| 269 | meta-data, e.g. the names of the table's fields, not with
|
---|
| 270 | retrieving data. The select() function is used to populate the
|
---|
| 271 | cursor with data.
|
---|
| 272 |
|
---|
| 273 | \sa setName() setMode()
|
---|
| 274 | */
|
---|
| 275 |
|
---|
| 276 | QSqlCursor::QSqlCursor( const QString & name, bool autopopulate, QSqlDatabase* db )
|
---|
| 277 | : QSqlRecord(), QSqlQuery( QString::null, db )
|
---|
| 278 | {
|
---|
| 279 | d = new QSqlCursorPrivate( name, db );
|
---|
| 280 | setMode( Writable );
|
---|
| 281 | if ( !d->nm.isNull() )
|
---|
| 282 | setName( d->nm, autopopulate );
|
---|
| 283 | }
|
---|
| 284 |
|
---|
| 285 | /*!
|
---|
| 286 | Constructs a copy of \a other.
|
---|
| 287 | */
|
---|
| 288 |
|
---|
| 289 | QSqlCursor::QSqlCursor( const QSqlCursor & other )
|
---|
| 290 | : QSqlRecord( other ), QSqlQuery( other )
|
---|
| 291 | {
|
---|
| 292 | d = new QSqlCursorPrivate( other.d->nm, other.d->db );
|
---|
| 293 | d->lastAt = other.d->lastAt;
|
---|
| 294 | d->nm = other.d->nm;
|
---|
| 295 | d->srt = other.d->srt;
|
---|
| 296 | d->ftr = other.d->ftr;
|
---|
| 297 | d->priIndx = other.d->priIndx;
|
---|
| 298 | d->editBuffer = other.d->editBuffer;
|
---|
| 299 | d->infoBuffer = other.d->infoBuffer;
|
---|
| 300 | d->q = 0; // do not share queries
|
---|
| 301 | setMode( other.mode() );
|
---|
| 302 | }
|
---|
| 303 |
|
---|
| 304 | /*!
|
---|
| 305 | Destroys the object and frees any allocated resources.
|
---|
| 306 | */
|
---|
| 307 |
|
---|
| 308 | QSqlCursor::~QSqlCursor()
|
---|
| 309 | {
|
---|
| 310 | delete d;
|
---|
| 311 | }
|
---|
| 312 |
|
---|
| 313 | /*!
|
---|
| 314 | Sets the cursor equal to \a other.
|
---|
| 315 | */
|
---|
| 316 |
|
---|
| 317 | QSqlCursor& QSqlCursor::operator=( const QSqlCursor& other )
|
---|
| 318 | {
|
---|
| 319 | QSqlRecord::operator=( other );
|
---|
| 320 | QSqlQuery::operator=( other );
|
---|
| 321 | delete d;
|
---|
| 322 | d = new QSqlCursorPrivate( other.d->nm, other.d->db );
|
---|
| 323 | d->lastAt = other.d->lastAt;
|
---|
| 324 | d->nm = other.d->nm;
|
---|
| 325 | d->srt = other.d->srt;
|
---|
| 326 | d->ftr = other.d->ftr;
|
---|
| 327 | d->priIndx = other.d->priIndx;
|
---|
| 328 | d->editBuffer = other.d->editBuffer;
|
---|
| 329 | d->infoBuffer = other.d->infoBuffer;
|
---|
| 330 | d->q = 0; // do not share queries
|
---|
| 331 | setMode( other.mode() );
|
---|
| 332 | return *this;
|
---|
| 333 | }
|
---|
| 334 |
|
---|
| 335 | /*!
|
---|
| 336 | Sets the current sort to \a sort. Note that no new records are
|
---|
| 337 | selected. To select new records, use select(). The \a sort will
|
---|
| 338 | apply to any subsequent select() calls that do not explicitly
|
---|
| 339 | specify a sort.
|
---|
| 340 | */
|
---|
| 341 |
|
---|
| 342 | void QSqlCursor::setSort( const QSqlIndex& sort )
|
---|
| 343 | {
|
---|
| 344 | d->srt = sort;
|
---|
| 345 | }
|
---|
| 346 |
|
---|
| 347 | /*!
|
---|
| 348 | Returns the current sort, or an empty index if there is no current
|
---|
| 349 | sort.
|
---|
| 350 | */
|
---|
| 351 | QSqlIndex QSqlCursor::sort() const
|
---|
| 352 | {
|
---|
| 353 | return d->srt;
|
---|
| 354 | }
|
---|
| 355 |
|
---|
| 356 | /*!
|
---|
| 357 | Sets the current filter to \a filter. Note that no new records are
|
---|
| 358 | selected. To select new records, use select(). The \a filter will
|
---|
| 359 | apply to any subsequent select() calls that do not explicitly
|
---|
| 360 | specify a filter.
|
---|
| 361 |
|
---|
| 362 | The filter is a SQL \c WHERE clause without the keyword 'WHERE',
|
---|
| 363 | e.g. \c{name='Dave'} which will be processed by the DBMS.
|
---|
| 364 | */
|
---|
| 365 | void QSqlCursor::setFilter( const QString& filter )
|
---|
| 366 | {
|
---|
| 367 | d->ftr = filter;
|
---|
| 368 | }
|
---|
| 369 |
|
---|
| 370 | /*!
|
---|
| 371 | Returns the current filter, or an empty string if there is no
|
---|
| 372 | current filter.
|
---|
| 373 | */
|
---|
| 374 | QString QSqlCursor::filter() const
|
---|
| 375 | {
|
---|
| 376 | return d->ftr;
|
---|
| 377 | }
|
---|
| 378 |
|
---|
| 379 | /*!
|
---|
| 380 | Sets the name of the cursor to \a name. If \a autopopulate is TRUE
|
---|
| 381 | (the default), the \a name must correspond to a valid table or
|
---|
| 382 | view name in the database. Also, note that all references to the
|
---|
| 383 | cursor edit buffer become invalidated when fields are
|
---|
| 384 | auto-populated. See the QSqlCursor constructor documentation for
|
---|
| 385 | more information.
|
---|
| 386 | */
|
---|
| 387 | void QSqlCursor::setName( const QString& name, bool autopopulate )
|
---|
| 388 | {
|
---|
| 389 | d->nm = name;
|
---|
| 390 | if ( autopopulate ) {
|
---|
| 391 | if ( driver() ) {
|
---|
| 392 | d->infoBuffer = driver()->recordInfo( name );
|
---|
| 393 | *this = d->infoBuffer.toRecord();
|
---|
| 394 | d->editBuffer = *this;
|
---|
| 395 | d->priIndx = driver()->primaryIndex( name );
|
---|
| 396 | }
|
---|
| 397 | #ifdef QT_CHECK_RANGE
|
---|
| 398 | if ( isEmpty() )
|
---|
| 399 | qWarning("QSqlCursor::setName: unable to build record, does '%s' exist?", name.latin1() );
|
---|
| 400 | #endif
|
---|
| 401 | }
|
---|
| 402 | }
|
---|
| 403 |
|
---|
| 404 | /*!
|
---|
| 405 | Returns the name of the cursor.
|
---|
| 406 | */
|
---|
| 407 |
|
---|
| 408 | QString QSqlCursor::name() const
|
---|
| 409 | {
|
---|
| 410 | return d->nm;
|
---|
| 411 | }
|
---|
| 412 |
|
---|
| 413 | /*! \reimp
|
---|
| 414 | */
|
---|
| 415 |
|
---|
| 416 | QString QSqlCursor::toString( const QString& prefix, const QString& sep ) const
|
---|
| 417 | {
|
---|
| 418 | QString pflist;
|
---|
| 419 | QString pfix = prefix.isEmpty() ? QString::null : prefix + ".";
|
---|
| 420 | bool comma = FALSE;
|
---|
| 421 |
|
---|
| 422 | for ( uint i = 0; i < count(); ++i ) {
|
---|
| 423 | const QString fname = fieldName( i );
|
---|
| 424 | if ( isGenerated( i ) ) {
|
---|
| 425 | if( comma )
|
---|
| 426 | pflist += sep + " ";
|
---|
| 427 | pflist += pfix + fname;
|
---|
| 428 | comma = TRUE;
|
---|
| 429 | }
|
---|
| 430 | }
|
---|
| 431 | return pflist;
|
---|
| 432 | }
|
---|
| 433 |
|
---|
| 434 | /*!
|
---|
| 435 | \internal
|
---|
| 436 |
|
---|
| 437 | Assigns the record \a list.
|
---|
| 438 |
|
---|
| 439 | */
|
---|
| 440 | QSqlRecord & QSqlCursor::operator=( const QSqlRecord & list )
|
---|
| 441 | {
|
---|
| 442 | return QSqlRecord::operator=( list );
|
---|
| 443 | }
|
---|
| 444 |
|
---|
| 445 | /*!
|
---|
| 446 | Append a copy of field \a fieldInfo to the end of the cursor. Note
|
---|
| 447 | that all references to the cursor edit buffer become invalidated.
|
---|
| 448 | */
|
---|
| 449 |
|
---|
| 450 | void QSqlCursor::append( const QSqlFieldInfo& fieldInfo )
|
---|
| 451 | {
|
---|
| 452 | d->editBuffer.append( fieldInfo.toField() );
|
---|
| 453 | d->editBuffer.setGenerated( d->editBuffer.count() - 1, fieldInfo.isGenerated() );
|
---|
| 454 | d->infoBuffer.append( fieldInfo );
|
---|
| 455 | QSqlRecord::append( fieldInfo.toField() );
|
---|
| 456 | QSqlRecord::setGenerated( QSqlRecord::count() - 1, fieldInfo.isGenerated() );
|
---|
| 457 | }
|
---|
| 458 |
|
---|
| 459 | /*!
|
---|
| 460 | Removes all fields from the cursor. Note that all references to
|
---|
| 461 | the cursor edit buffer become invalidated.
|
---|
| 462 | */
|
---|
| 463 | void QSqlCursor::clear()
|
---|
| 464 | {
|
---|
| 465 | d->editBuffer.clear();
|
---|
| 466 | d->infoBuffer.clear();
|
---|
| 467 | QSqlRecord::clear();
|
---|
| 468 | }
|
---|
| 469 |
|
---|
| 470 |
|
---|
| 471 | /*!
|
---|
| 472 | Insert a copy of \a fieldInfo at position \a pos. If a field
|
---|
| 473 | already exists at \a pos, it is removed. Note that all references
|
---|
| 474 | to the cursor edit buffer become invalidated.
|
---|
| 475 | */
|
---|
| 476 |
|
---|
| 477 | void QSqlCursor::insert( int pos, const QSqlFieldInfo& fieldInfo )
|
---|
| 478 | {
|
---|
| 479 | d->editBuffer.insert( pos, fieldInfo.toField() );
|
---|
| 480 | d->editBuffer.setGenerated( pos, fieldInfo.isGenerated() );
|
---|
| 481 | d->infoBuffer[ pos ] = fieldInfo;
|
---|
| 482 | QSqlRecord::insert( pos, fieldInfo.toField() );
|
---|
| 483 | QSqlRecord::setGenerated( pos, fieldInfo.isGenerated() );
|
---|
| 484 | }
|
---|
| 485 |
|
---|
| 486 | /*!
|
---|
| 487 | Removes the field at \a pos. If \a pos does not exist, nothing
|
---|
| 488 | happens. Note that all references to the cursor edit buffer become
|
---|
| 489 | invalidated.
|
---|
| 490 | */
|
---|
| 491 |
|
---|
| 492 | void QSqlCursor::remove( int pos )
|
---|
| 493 | {
|
---|
| 494 | d->editBuffer.remove( pos );
|
---|
| 495 | d->infoBuffer[ pos ] = QSqlFieldInfo();
|
---|
| 496 | QSqlRecord::remove( pos );
|
---|
| 497 | }
|
---|
| 498 |
|
---|
| 499 | /*!
|
---|
| 500 | Sets the generated flag for the field \a name to \a generated. If
|
---|
| 501 | the field does not exist, nothing happens. Only fields that have
|
---|
| 502 | \a generated set to TRUE are included in the SQL that is
|
---|
| 503 | generated by insert(), update() or del().
|
---|
| 504 |
|
---|
| 505 | \sa isGenerated()
|
---|
| 506 | */
|
---|
| 507 |
|
---|
| 508 | void QSqlCursor::setGenerated( const QString& name, bool generated )
|
---|
| 509 | {
|
---|
| 510 | int pos = position( name );
|
---|
| 511 | if ( pos == -1 )
|
---|
| 512 | return;
|
---|
| 513 | QSqlRecord::setGenerated( name, generated );
|
---|
| 514 | d->editBuffer.setGenerated( name, generated );
|
---|
| 515 | d->infoBuffer[ pos ].setGenerated( generated );
|
---|
| 516 | }
|
---|
| 517 |
|
---|
| 518 | /*!
|
---|
| 519 | \overload
|
---|
| 520 |
|
---|
| 521 | Sets the generated flag for the field \a i to \a generated.
|
---|
| 522 |
|
---|
| 523 | \sa isGenerated()
|
---|
| 524 | */
|
---|
| 525 | void QSqlCursor::setGenerated( int i, bool generated )
|
---|
| 526 | {
|
---|
| 527 | if ( i < 0 || i >= (int)d->infoBuffer.count() )
|
---|
| 528 | return;
|
---|
| 529 | QSqlRecord::setGenerated( i, generated );
|
---|
| 530 | d->editBuffer.setGenerated( i, generated );
|
---|
| 531 | d->infoBuffer[i].setGenerated( generated );
|
---|
| 532 | }
|
---|
| 533 |
|
---|
| 534 | /*!
|
---|
| 535 | Returns the primary index associated with the cursor as defined in
|
---|
| 536 | the database, or an empty index if there is no primary index. If
|
---|
| 537 | \a setFromCursor is TRUE (the default), the index fields are
|
---|
| 538 | populated with the corresponding values in the cursor's current
|
---|
| 539 | record.
|
---|
| 540 | */
|
---|
| 541 |
|
---|
| 542 | QSqlIndex QSqlCursor::primaryIndex( bool setFromCursor ) const
|
---|
| 543 | {
|
---|
| 544 | if ( setFromCursor ) {
|
---|
| 545 | for ( uint i = 0; i < d->priIndx.count(); ++i ) {
|
---|
| 546 | const QString fn = d->priIndx.fieldName( i );
|
---|
| 547 | if ( contains( fn ) )
|
---|
| 548 | d->priIndx.setValue( i, value( fn ) );
|
---|
| 549 | }
|
---|
| 550 | }
|
---|
| 551 | return d->priIndx;
|
---|
| 552 | }
|
---|
| 553 |
|
---|
| 554 | /*!
|
---|
| 555 | Sets the primary index associated with the cursor to the index \a
|
---|
| 556 | idx. Note that this index must contain a field or set of fields
|
---|
| 557 | which identify a unique record within the underlying database
|
---|
| 558 | table or view so that update() and del() will execute as expected.
|
---|
| 559 |
|
---|
| 560 | \sa update() del()
|
---|
| 561 | */
|
---|
| 562 |
|
---|
| 563 | void QSqlCursor::setPrimaryIndex( const QSqlIndex& idx )
|
---|
| 564 | {
|
---|
| 565 | d->priIndx = idx;
|
---|
| 566 | }
|
---|
| 567 |
|
---|
| 568 |
|
---|
| 569 | /*!
|
---|
| 570 | Returns an index composed of \a fieldNames, all in ASCending
|
---|
| 571 | order. Note that all field names must exist in the cursor,
|
---|
| 572 | otherwise an empty index is returned.
|
---|
| 573 |
|
---|
| 574 | \sa QSqlIndex
|
---|
| 575 | */
|
---|
| 576 |
|
---|
| 577 | QSqlIndex QSqlCursor::index( const QStringList& fieldNames ) const
|
---|
| 578 | {
|
---|
| 579 | QSqlIndex idx;
|
---|
| 580 | for ( QStringList::ConstIterator it = fieldNames.begin(); it != fieldNames.end(); ++it ) {
|
---|
| 581 | const QSqlField* f = field( (*it) );
|
---|
| 582 | if ( !f ) { /* all fields must exist */
|
---|
| 583 | idx.clear();
|
---|
| 584 | break;
|
---|
| 585 | }
|
---|
| 586 | idx.append( *f );
|
---|
| 587 | }
|
---|
| 588 | return idx;
|
---|
| 589 | }
|
---|
| 590 |
|
---|
| 591 | /*!
|
---|
| 592 | \overload
|
---|
| 593 |
|
---|
| 594 | Returns an index based on \a fieldName.
|
---|
| 595 | */
|
---|
| 596 |
|
---|
| 597 | QSqlIndex QSqlCursor::index( const QString& fieldName ) const
|
---|
| 598 | {
|
---|
| 599 | QStringList fl( fieldName );
|
---|
| 600 | return index( fl );
|
---|
| 601 | }
|
---|
| 602 |
|
---|
| 603 | /*!
|
---|
| 604 | \overload
|
---|
| 605 |
|
---|
| 606 | Returns an index based on \a fieldName.
|
---|
| 607 | */
|
---|
| 608 |
|
---|
| 609 | QSqlIndex QSqlCursor::index( const char* fieldName ) const
|
---|
| 610 | {
|
---|
| 611 | return index( QStringList( QString( fieldName ) ) );
|
---|
| 612 | }
|
---|
| 613 |
|
---|
| 614 | /*!
|
---|
| 615 | Selects all fields in the cursor from the database matching the
|
---|
| 616 | filter criteria \a filter. The data is returned in the order
|
---|
| 617 | specified by the index \a sort. Returns TRUE if the data was
|
---|
| 618 | successfully selected; otherwise returns FALSE.
|
---|
| 619 |
|
---|
| 620 | The \a filter is a string containing a SQL \c WHERE clause but
|
---|
| 621 | without the 'WHERE' keyword. The cursor is initially positioned at
|
---|
| 622 | an invalid row after this function is called. To move to a valid
|
---|
| 623 | row, use seek(), first(), last(), prev() or next().
|
---|
| 624 |
|
---|
| 625 | Example:
|
---|
| 626 | \code
|
---|
| 627 | QSqlCursor cur( "Employee" ); // Use the Employee table or view
|
---|
| 628 | cur.select( "deptno=10" ); // select all records in department 10
|
---|
| 629 | while( cur.next() ) {
|
---|
| 630 | ... // process data
|
---|
| 631 | }
|
---|
| 632 | ...
|
---|
| 633 | // select records in other departments, ordered by department number
|
---|
| 634 | cur.select( "deptno>10", cur.index( "deptno" ) );
|
---|
| 635 | ...
|
---|
| 636 | \endcode
|
---|
| 637 |
|
---|
| 638 | The filter will apply to any subsequent select() calls that do not
|
---|
| 639 | explicitly specify another filter. Similarly the sort will apply
|
---|
| 640 | to any subsequent select() calls that do not explicitly specify
|
---|
| 641 | another sort.
|
---|
| 642 |
|
---|
| 643 | \code
|
---|
| 644 | QSqlCursor cur( "Employee" );
|
---|
| 645 | cur.select( "deptno=10" ); // select all records in department 10
|
---|
| 646 | while( cur.next() ) {
|
---|
| 647 | ... // process data
|
---|
| 648 | }
|
---|
| 649 | ...
|
---|
| 650 | cur.select(); // re-selects all records in department 10
|
---|
| 651 | ...
|
---|
| 652 | \endcode
|
---|
| 653 |
|
---|
| 654 | */
|
---|
| 655 |
|
---|
| 656 | bool QSqlCursor::select( const QString & filter, const QSqlIndex & sort )
|
---|
| 657 | {
|
---|
| 658 | QString fieldList = toString( d->nm );
|
---|
| 659 | if ( fieldList.isEmpty() )
|
---|
| 660 | return FALSE;
|
---|
| 661 | QString str= "select " + fieldList;
|
---|
| 662 | str += " from " + d->nm;
|
---|
| 663 | if ( !filter.isEmpty() ) {
|
---|
| 664 | d->ftr = filter;
|
---|
| 665 | str += " where " + filter;
|
---|
| 666 | } else
|
---|
| 667 | d->ftr = QString::null;
|
---|
| 668 | if ( sort.count() > 0 )
|
---|
| 669 | str += " order by " + sort.toString( d->nm );
|
---|
| 670 | d->srt = sort;
|
---|
| 671 | return exec( str );
|
---|
| 672 | }
|
---|
| 673 |
|
---|
| 674 | /*!
|
---|
| 675 | \overload
|
---|
| 676 |
|
---|
| 677 | Selects all fields in the cursor from the database. The rows are
|
---|
| 678 | returned in the order specified by the last call to setSort() or
|
---|
| 679 | the last call to select() that specified a sort, whichever is the
|
---|
| 680 | most recent. If there is no current sort, the order in which the
|
---|
| 681 | rows are returned is undefined. The records are filtered according
|
---|
| 682 | to the filter specified by the last call to setFilter() or the
|
---|
| 683 | last call to select() that specified a filter, whichever is the
|
---|
| 684 | most recent. If there is no current filter, all records are
|
---|
| 685 | returned. The cursor is initially positioned at an invalid row. To
|
---|
| 686 | move to a valid row, use seek(), first(), last(), prev() or
|
---|
| 687 | next().
|
---|
| 688 |
|
---|
| 689 | \sa setSort() setFilter()
|
---|
| 690 | */
|
---|
| 691 |
|
---|
| 692 | bool QSqlCursor::select()
|
---|
| 693 | {
|
---|
| 694 | return select( filter(), sort() );
|
---|
| 695 | }
|
---|
| 696 |
|
---|
| 697 | /*!
|
---|
| 698 | \overload
|
---|
| 699 |
|
---|
| 700 | Selects all fields in the cursor from the database. The data is
|
---|
| 701 | returned in the order specified by the index \a sort. The records
|
---|
| 702 | are filtered according to the filter specified by the last call to
|
---|
| 703 | setFilter() or the last call to select() that specified a filter,
|
---|
| 704 | whichever is the most recent. The cursor is initially positioned
|
---|
| 705 | at an invalid row. To move to a valid row, use seek(), first(),
|
---|
| 706 | last(), prev() or next().
|
---|
| 707 | */
|
---|
| 708 |
|
---|
| 709 | bool QSqlCursor::select( const QSqlIndex& sort )
|
---|
| 710 | {
|
---|
| 711 | return select( filter(), sort );
|
---|
| 712 | }
|
---|
| 713 |
|
---|
| 714 | /*!
|
---|
| 715 | \overload
|
---|
| 716 |
|
---|
| 717 | Selects all fields in the cursor matching the filter index \a
|
---|
| 718 | filter. The data is returned in the order specified by the index
|
---|
| 719 | \a sort. The \a filter index works by constructing a WHERE clause
|
---|
| 720 | using the names of the fields from the \a filter and their values
|
---|
| 721 | from the current cursor record. The cursor is initially positioned
|
---|
| 722 | at an invalid row. To move to a valid row, use seek(), first(),
|
---|
| 723 | last(), prev() or next(). This function is useful, for example,
|
---|
| 724 | for retrieving data based upon a table's primary index:
|
---|
| 725 |
|
---|
| 726 | \code
|
---|
| 727 | QSqlCursor cur( "Employee" );
|
---|
| 728 | QSqlIndex pk = cur.primaryIndex();
|
---|
| 729 | cur.setValue( "id", 10 );
|
---|
| 730 | cur.select( pk, pk ); // generates "SELECT ... FROM Employee WHERE id=10 ORDER BY id"
|
---|
| 731 | ...
|
---|
| 732 | \endcode
|
---|
| 733 |
|
---|
| 734 | In this example the QSqlIndex, pk, is used for two different
|
---|
| 735 | purposes. When used as the filter (first) argument, the field
|
---|
| 736 | names it contains are used to construct the WHERE clause, each set
|
---|
| 737 | to the current cursor value, \c{WHERE id=10}, in this case. When
|
---|
| 738 | used as the sort (second) argument the field names it contains are
|
---|
| 739 | used for the ORDER BY clause, \c{ORDER BY id} in this example.
|
---|
| 740 | */
|
---|
| 741 |
|
---|
| 742 | bool QSqlCursor::select( const QSqlIndex & filter, const QSqlIndex & sort )
|
---|
| 743 | {
|
---|
| 744 | return select( toString( filter, this, d->nm, "=", "and" ), sort );
|
---|
| 745 | }
|
---|
| 746 |
|
---|
| 747 | /*!
|
---|
| 748 | Sets the cursor mode to \a mode. This value can be an OR'ed
|
---|
| 749 | combination of \l QSqlCursor::Mode values. The default mode for a
|
---|
| 750 | cursor is \c QSqlCursor::Writable.
|
---|
| 751 |
|
---|
| 752 | \code
|
---|
| 753 | QSqlCursor cur( "Employee" );
|
---|
| 754 | cur.setMode( QSqlCursor::Writable ); // allow insert/update/delete
|
---|
| 755 | ...
|
---|
| 756 | cur.setMode( QSqlCursor::Insert | QSqlCursor::Update ); // allow inserts and updates only
|
---|
| 757 | ...
|
---|
| 758 | cur.setMode( QSqlCursor::ReadOnly ); // no inserts/updates/deletes allowed
|
---|
| 759 |
|
---|
| 760 | \endcode
|
---|
| 761 | */
|
---|
| 762 |
|
---|
| 763 | void QSqlCursor::setMode( int mode )
|
---|
| 764 | {
|
---|
| 765 | d->md = mode;
|
---|
| 766 | }
|
---|
| 767 |
|
---|
| 768 | /*!
|
---|
| 769 | Returns the current cursor mode.
|
---|
| 770 |
|
---|
| 771 | \sa setMode()
|
---|
| 772 | */
|
---|
| 773 |
|
---|
| 774 | int QSqlCursor::mode() const
|
---|
| 775 | {
|
---|
| 776 | return d->md;
|
---|
| 777 | }
|
---|
| 778 |
|
---|
| 779 | /*!
|
---|
| 780 | Sets field \a name to \a calculated. If the field \a name does not
|
---|
| 781 | exist, nothing happens. The value of a calculated field is set by
|
---|
| 782 | the calculateField() virtual function which you must reimplement
|
---|
| 783 | (or the field value will be an invalid QVariant). Calculated
|
---|
| 784 | fields do not appear in generated SQL statements sent to the
|
---|
| 785 | database.
|
---|
| 786 |
|
---|
| 787 | \sa calculateField() QSqlRecord::setGenerated()
|
---|
| 788 | */
|
---|
| 789 |
|
---|
| 790 | void QSqlCursor::setCalculated( const QString& name, bool calculated )
|
---|
| 791 | {
|
---|
| 792 | int pos = position( name );
|
---|
| 793 | if ( pos < 0 )
|
---|
| 794 | return;
|
---|
| 795 | d->infoBuffer[ pos ].setCalculated( calculated );
|
---|
| 796 | if ( calculated )
|
---|
| 797 | setGenerated( pos, FALSE );
|
---|
| 798 | }
|
---|
| 799 |
|
---|
| 800 | /*!
|
---|
| 801 | Returns TRUE if the field \a name exists and is calculated;
|
---|
| 802 | otherwise returns FALSE.
|
---|
| 803 |
|
---|
| 804 | \sa setCalculated()
|
---|
| 805 | */
|
---|
| 806 |
|
---|
| 807 | bool QSqlCursor::isCalculated( const QString& name ) const
|
---|
| 808 | {
|
---|
| 809 | int pos = position( name );
|
---|
| 810 | if ( pos < 0 )
|
---|
| 811 | return FALSE;
|
---|
| 812 | return d->infoBuffer[ pos ].isCalculated();
|
---|
| 813 | }
|
---|
| 814 |
|
---|
| 815 | /*!
|
---|
| 816 | Sets field \a{name}'s trimmed status to \a trim. If the field \a
|
---|
| 817 | name does not exist, nothing happens.
|
---|
| 818 |
|
---|
| 819 | When a trimmed field of type string or cstring is read from the
|
---|
| 820 | database any trailing (right-most) spaces are removed.
|
---|
| 821 |
|
---|
| 822 | \sa isTrimmed() QVariant
|
---|
| 823 | */
|
---|
| 824 |
|
---|
| 825 | void QSqlCursor::setTrimmed( const QString& name, bool trim )
|
---|
| 826 | {
|
---|
| 827 | int pos = position( name );
|
---|
| 828 | if ( pos < 0 )
|
---|
| 829 | return;
|
---|
| 830 | d->infoBuffer[ pos ].setTrim( trim );
|
---|
| 831 | }
|
---|
| 832 |
|
---|
| 833 | /*!
|
---|
| 834 | Returns TRUE if the field \a name exists and is trimmed; otherwise
|
---|
| 835 | returns FALSE.
|
---|
| 836 |
|
---|
| 837 | When a trimmed field of type string or cstring is read from the
|
---|
| 838 | database any trailing (right-most) spaces are removed.
|
---|
| 839 |
|
---|
| 840 | \sa setTrimmed()
|
---|
| 841 | */
|
---|
| 842 |
|
---|
| 843 | bool QSqlCursor::isTrimmed( const QString& name ) const
|
---|
| 844 | {
|
---|
| 845 | int pos = position( name );
|
---|
| 846 | if ( pos < 0 )
|
---|
| 847 | return FALSE;
|
---|
| 848 | return d->infoBuffer[ pos ].isTrim();
|
---|
| 849 | }
|
---|
| 850 |
|
---|
| 851 | /*!
|
---|
| 852 | Returns TRUE if the cursor is read-only; otherwise returns FALSE.
|
---|
| 853 | The default is FALSE. Read-only cursors cannot be edited using
|
---|
| 854 | insert(), update() or del().
|
---|
| 855 |
|
---|
| 856 | \sa setMode()
|
---|
| 857 | */
|
---|
| 858 |
|
---|
| 859 | bool QSqlCursor::isReadOnly() const
|
---|
| 860 | {
|
---|
| 861 | return d->md == 0;
|
---|
| 862 | }
|
---|
| 863 |
|
---|
| 864 | /*!
|
---|
| 865 | Returns TRUE if the cursor will perform inserts; otherwise returns
|
---|
| 866 | FALSE.
|
---|
| 867 |
|
---|
| 868 | \sa setMode()
|
---|
| 869 | */
|
---|
| 870 |
|
---|
| 871 | bool QSqlCursor::canInsert() const
|
---|
| 872 | {
|
---|
| 873 | return ( ( d->md & Insert ) == Insert ) ;
|
---|
| 874 | }
|
---|
| 875 |
|
---|
| 876 |
|
---|
| 877 | /*!
|
---|
| 878 | Returns TRUE if the cursor will perform updates; otherwise returns
|
---|
| 879 | FALSE.
|
---|
| 880 |
|
---|
| 881 | \sa setMode()
|
---|
| 882 | */
|
---|
| 883 |
|
---|
| 884 | bool QSqlCursor::canUpdate() const
|
---|
| 885 | {
|
---|
| 886 | return ( ( d->md & Update ) == Update ) ;
|
---|
| 887 | }
|
---|
| 888 |
|
---|
| 889 | /*!
|
---|
| 890 | Returns TRUE if the cursor will perform deletes; otherwise returns
|
---|
| 891 | FALSE.
|
---|
| 892 |
|
---|
| 893 | \sa setMode()
|
---|
| 894 | */
|
---|
| 895 |
|
---|
| 896 | bool QSqlCursor::canDelete() const
|
---|
| 897 | {
|
---|
| 898 | return ( ( d->md & Delete ) == Delete ) ;
|
---|
| 899 | }
|
---|
| 900 |
|
---|
| 901 | /*!
|
---|
| 902 | \overload
|
---|
| 903 |
|
---|
| 904 | Returns a formatted string composed of the \a prefix (e.g. table
|
---|
| 905 | or view name), ".", the \a field name, the \a fieldSep and the
|
---|
| 906 | field value. If the \a prefix is empty then the string will begin
|
---|
| 907 | with the \a field name. This function is useful for generating SQL
|
---|
| 908 | statements.
|
---|
| 909 | */
|
---|
| 910 |
|
---|
| 911 | QString QSqlCursor::toString( const QString& prefix, QSqlField* field, const QString& fieldSep ) const
|
---|
| 912 | {
|
---|
| 913 | QString f;
|
---|
| 914 | if ( field && driver() ) {
|
---|
| 915 | f = ( prefix.length() > 0 ? prefix + QString(".") : QString::null ) + field->name();
|
---|
| 916 | f += " " + fieldSep + " ";
|
---|
| 917 | if ( field->isNull() ) {
|
---|
| 918 | f += "NULL";
|
---|
| 919 | } else {
|
---|
| 920 | f += driver()->formatValue( field );
|
---|
| 921 | }
|
---|
| 922 | }
|
---|
| 923 | return f;
|
---|
| 924 | }
|
---|
| 925 |
|
---|
| 926 | /*!
|
---|
| 927 | Returns a formatted string composed of all the fields in \a rec.
|
---|
| 928 | Each field is composed of the \a prefix (e.g. table or view name),
|
---|
| 929 | ".", the field name, the \a fieldSep and the field value. If the
|
---|
| 930 | \a prefix is empty then each field will begin with the field name.
|
---|
| 931 | The fields are then joined together separated by \a sep. Fields
|
---|
| 932 | where isGenerated() returns FALSE are not included. This function
|
---|
| 933 | is useful for generating SQL statements.
|
---|
| 934 | */
|
---|
| 935 |
|
---|
| 936 | QString QSqlCursor::toString( QSqlRecord* rec, const QString& prefix, const QString& fieldSep,
|
---|
| 937 | const QString& sep ) const
|
---|
| 938 | {
|
---|
| 939 | static QString blank( " " );
|
---|
| 940 | QString filter;
|
---|
| 941 | bool separator = FALSE;
|
---|
| 942 | for ( uint j = 0; j < count(); ++j ) {
|
---|
| 943 | QSqlField* f = rec->field( j );
|
---|
| 944 | if ( rec->isGenerated( j ) ) {
|
---|
| 945 | if ( separator )
|
---|
| 946 | filter += sep + blank;
|
---|
| 947 | filter += toString( prefix, f, fieldSep );
|
---|
| 948 | filter += blank;
|
---|
| 949 | separator = TRUE;
|
---|
| 950 | }
|
---|
| 951 | }
|
---|
| 952 | return filter;
|
---|
| 953 | }
|
---|
| 954 |
|
---|
| 955 | /*!
|
---|
| 956 | \overload
|
---|
| 957 |
|
---|
| 958 | Returns a formatted string composed of all the fields in the index
|
---|
| 959 | \a i. Each field is composed of the \a prefix (e.g. table or view
|
---|
| 960 | name), ".", the field name, the \a fieldSep and the field value.
|
---|
| 961 | If the \a prefix is empty then each field will begin with the field
|
---|
| 962 | name. The field values are taken from \a rec. The fields are then
|
---|
| 963 | joined together separated by \a sep. Fields where isGenerated()
|
---|
| 964 | returns FALSE are ignored. This function is useful for generating
|
---|
| 965 | SQL statements.
|
---|
| 966 | */
|
---|
| 967 |
|
---|
| 968 | QString QSqlCursor::toString( const QSqlIndex& i, QSqlRecord* rec, const QString& prefix,
|
---|
| 969 | const QString& fieldSep, const QString& sep ) const
|
---|
| 970 | {
|
---|
| 971 | QString filter;
|
---|
| 972 | bool separator = FALSE;
|
---|
| 973 | for( uint j = 0; j < i.count(); ++j ){
|
---|
| 974 | if ( rec->isGenerated( j ) ) {
|
---|
| 975 | if( separator ) {
|
---|
| 976 | filter += " " + sep + " " ;
|
---|
| 977 | }
|
---|
| 978 | QString fn = i.fieldName( j );
|
---|
| 979 | QSqlField* f = rec->field( fn );
|
---|
| 980 | filter += toString( prefix, f, fieldSep );
|
---|
| 981 | separator = TRUE;
|
---|
| 982 | }
|
---|
| 983 | }
|
---|
| 984 | return filter;
|
---|
| 985 | }
|
---|
| 986 |
|
---|
| 987 | /*!
|
---|
| 988 | \overload
|
---|
| 989 |
|
---|
| 990 | Inserts the current contents of the cursor's edit record buffer
|
---|
| 991 | into the database, if the cursor allows inserts. Returns the
|
---|
| 992 | number of rows affected by the insert. For error information, use
|
---|
| 993 | lastError().
|
---|
| 994 |
|
---|
| 995 | If \a invalidate is TRUE (the default), the cursor will no longer
|
---|
| 996 | be positioned on a valid record and can no longer be navigated. A
|
---|
| 997 | new select() call must be made before navigating to a valid
|
---|
| 998 | record.
|
---|
| 999 |
|
---|
| 1000 | \quotefile sql/overview/insert2/main.cpp
|
---|
| 1001 | \skipto prices
|
---|
| 1002 | \printline prices
|
---|
| 1003 | \printuntil insert
|
---|
| 1004 |
|
---|
| 1005 | In the above example, a cursor is created on the 'prices' table
|
---|
| 1006 | and a pointer to the insert buffer is aquired using primeInsert().
|
---|
| 1007 | Each field's value is set to the desired value and then insert()
|
---|
| 1008 | is called to insert the data into the database. Remember: all edit
|
---|
| 1009 | operations (insert(), update() and delete()) operate on the
|
---|
| 1010 | contents of the cursor edit buffer and not on the contents of the
|
---|
| 1011 | cursor itself.
|
---|
| 1012 |
|
---|
| 1013 | \sa setMode() lastError()
|
---|
| 1014 | */
|
---|
| 1015 |
|
---|
| 1016 | int QSqlCursor::insert( bool invalidate )
|
---|
| 1017 | {
|
---|
| 1018 | if ( ( d->md & Insert ) != Insert || !driver() )
|
---|
| 1019 | return FALSE;
|
---|
| 1020 | int k = d->editBuffer.count();
|
---|
| 1021 | if ( k == 0 )
|
---|
| 1022 | return 0;
|
---|
| 1023 |
|
---|
| 1024 | QString fList;
|
---|
| 1025 | QString vList;
|
---|
| 1026 | bool comma = FALSE;
|
---|
| 1027 | // use a prepared query if the driver supports it
|
---|
| 1028 | if ( driver()->hasFeature( QSqlDriver::PreparedQueries ) ) {
|
---|
| 1029 | int cnt = 0;
|
---|
| 1030 | bool oraStyle = driver()->hasFeature( QSqlDriver::NamedPlaceholders );
|
---|
| 1031 | for( int j = 0; j < k; ++j ) {
|
---|
| 1032 | QSqlField* f = d->editBuffer.field( j );
|
---|
| 1033 | if ( d->editBuffer.isGenerated( j ) ) {
|
---|
| 1034 | if ( comma ) {
|
---|
| 1035 | fList += ",";
|
---|
| 1036 | vList += ",";
|
---|
| 1037 | }
|
---|
| 1038 | fList += f->name();
|
---|
| 1039 | vList += (oraStyle == TRUE) ? ":f" + QString::number(cnt) : QString("?");
|
---|
| 1040 | cnt++;
|
---|
| 1041 | comma = TRUE;
|
---|
| 1042 | }
|
---|
| 1043 | }
|
---|
| 1044 | if ( !comma ) {
|
---|
| 1045 | return 0;
|
---|
| 1046 | }
|
---|
| 1047 | QString str;
|
---|
| 1048 | str.append( "insert into " ).append( name() ).append( "(" ).append( fList ).append( ") values (" ).append( vList ). append ( ")" );
|
---|
| 1049 | return applyPrepared( str, invalidate );
|
---|
| 1050 | } else {
|
---|
| 1051 | for( int j = 0; j < k; ++j ) {
|
---|
| 1052 | QSqlField* f = d->editBuffer.field( j );
|
---|
| 1053 | if ( d->editBuffer.isGenerated( j ) ) {
|
---|
| 1054 | if ( comma ) {
|
---|
| 1055 | fList += ",";
|
---|
| 1056 | vList += ",";
|
---|
| 1057 | }
|
---|
| 1058 | fList += f->name();
|
---|
| 1059 | vList += driver()->formatValue( f );
|
---|
| 1060 | comma = TRUE;
|
---|
| 1061 | }
|
---|
| 1062 | }
|
---|
| 1063 |
|
---|
| 1064 | if ( !comma ) {
|
---|
| 1065 | // no valid fields found
|
---|
| 1066 | return 0;
|
---|
| 1067 | }
|
---|
| 1068 | QString str;
|
---|
| 1069 | str.append( "insert into " ).append( name() ).append( "(" ).append( fList ).append( ") values (" ).append( vList ). append ( ")" );
|
---|
| 1070 | return apply( str, invalidate );
|
---|
| 1071 | }
|
---|
| 1072 | }
|
---|
| 1073 |
|
---|
| 1074 | /*!
|
---|
| 1075 | Returns the current internal edit buffer. If \a copy is TRUE (the
|
---|
| 1076 | default is FALSE), the current cursor field values are first
|
---|
| 1077 | copied into the edit buffer. The edit buffer is valid as long as
|
---|
| 1078 | the cursor remains valid. The cursor retains ownership of the
|
---|
| 1079 | returned pointer, so it must not be deleted or modified.
|
---|
| 1080 |
|
---|
| 1081 | \sa primeInsert(), primeUpdate() primeDelete()
|
---|
| 1082 | */
|
---|
| 1083 |
|
---|
| 1084 | QSqlRecord* QSqlCursor::editBuffer( bool copy )
|
---|
| 1085 | {
|
---|
| 1086 | if ( copy ) {
|
---|
| 1087 | for(uint i = 0; i < d->editBuffer.count(); i++) {
|
---|
| 1088 | if ( QSqlRecord::isNull( i ) ) {
|
---|
| 1089 | d->editBuffer.setNull( i );
|
---|
| 1090 | } else {
|
---|
| 1091 | d->editBuffer.setValue( i, value( i ) );
|
---|
| 1092 | }
|
---|
| 1093 | }
|
---|
| 1094 | }
|
---|
| 1095 | return &d->editBuffer;
|
---|
| 1096 | }
|
---|
| 1097 |
|
---|
| 1098 | /*!
|
---|
| 1099 | This function primes the edit buffer's field values for update and
|
---|
| 1100 | returns the edit buffer. The default implementation copies the
|
---|
| 1101 | field values from the current cursor record into the edit buffer
|
---|
| 1102 | (therefore, this function is equivalent to calling editBuffer(
|
---|
| 1103 | TRUE ) ). The cursor retains ownership of the returned pointer, so
|
---|
| 1104 | it must not be deleted or modified.
|
---|
| 1105 |
|
---|
| 1106 | \sa editBuffer() update()
|
---|
| 1107 | */
|
---|
| 1108 |
|
---|
| 1109 | QSqlRecord* QSqlCursor::primeUpdate()
|
---|
| 1110 | {
|
---|
| 1111 | // memorize the primary keys as they were before the user changed the values in editBuffer
|
---|
| 1112 | QSqlRecord* buf = editBuffer( TRUE );
|
---|
| 1113 | QSqlIndex idx = primaryIndex( FALSE );
|
---|
| 1114 | if ( !idx.isEmpty() )
|
---|
| 1115 | d->editIndex = toString( idx, buf, d->nm, "=", "and" );
|
---|
| 1116 | else
|
---|
| 1117 | d->editIndex = qWhereClause( buf, d->nm, "and", driver() );
|
---|
| 1118 | return buf;
|
---|
| 1119 | }
|
---|
| 1120 |
|
---|
| 1121 | /*!
|
---|
| 1122 | This function primes the edit buffer's field values for delete and
|
---|
| 1123 | returns the edit buffer. The default implementation copies the
|
---|
| 1124 | field values from the current cursor record into the edit buffer
|
---|
| 1125 | (therefore, this function is equivalent to calling editBuffer(
|
---|
| 1126 | TRUE ) ). The cursor retains ownership of the returned pointer, so
|
---|
| 1127 | it must not be deleted or modified.
|
---|
| 1128 |
|
---|
| 1129 | \sa editBuffer() del()
|
---|
| 1130 | */
|
---|
| 1131 |
|
---|
| 1132 | QSqlRecord* QSqlCursor::primeDelete()
|
---|
| 1133 | {
|
---|
| 1134 | return editBuffer( TRUE );
|
---|
| 1135 | }
|
---|
| 1136 |
|
---|
| 1137 | /*!
|
---|
| 1138 | This function primes the edit buffer's field values for insert and
|
---|
| 1139 | returns the edit buffer. The default implementation clears all
|
---|
| 1140 | field values in the edit buffer. The cursor retains ownership of
|
---|
| 1141 | the returned pointer, so it must not be deleted or modified.
|
---|
| 1142 |
|
---|
| 1143 | \sa editBuffer() insert()
|
---|
| 1144 | */
|
---|
| 1145 |
|
---|
| 1146 | QSqlRecord* QSqlCursor::primeInsert()
|
---|
| 1147 | {
|
---|
| 1148 | d->editBuffer.clearValues();
|
---|
| 1149 | return &d->editBuffer;
|
---|
| 1150 | }
|
---|
| 1151 |
|
---|
| 1152 |
|
---|
| 1153 | /*!
|
---|
| 1154 | Updates the database with the current contents of the edit buffer.
|
---|
| 1155 | Returns the number of records which were updated.
|
---|
| 1156 | For error information, use lastError().
|
---|
| 1157 |
|
---|
| 1158 | Only records which meet the filter criteria specified by the
|
---|
| 1159 | cursor's primary index are updated. If the cursor does not contain
|
---|
| 1160 | a primary index, no update is performed and 0 is returned.
|
---|
| 1161 |
|
---|
| 1162 | If \a invalidate is TRUE (the default), the current cursor can no
|
---|
| 1163 | longer be navigated. A new select() call must be made before you
|
---|
| 1164 | can move to a valid record. For example:
|
---|
| 1165 |
|
---|
| 1166 | \quotefile sql/overview/update/main.cpp
|
---|
| 1167 | \skipto prices
|
---|
| 1168 | \printline prices
|
---|
| 1169 | \printuntil update
|
---|
| 1170 | \printline
|
---|
| 1171 |
|
---|
| 1172 | In the above example, a cursor is created on the 'prices' table
|
---|
| 1173 | and is positioned on the record to be updated. Then a pointer to
|
---|
| 1174 | the cursor's edit buffer is acquired using primeUpdate(). A new
|
---|
| 1175 | value is calculated and placed into the edit buffer with the
|
---|
| 1176 | setValue() call. Finally, an update() call is made on the cursor
|
---|
| 1177 | which uses the tables's primary index to update the record in the
|
---|
| 1178 | database with the contents of the cursor's edit buffer. Remember:
|
---|
| 1179 | all edit operations (insert(), update() and delete()) operate on
|
---|
| 1180 | the contents of the cursor edit buffer and not on the contents of
|
---|
| 1181 | the cursor itself.
|
---|
| 1182 |
|
---|
| 1183 | Note that if the primary index does not uniquely distinguish
|
---|
| 1184 | records the database may be changed into an inconsistent state.
|
---|
| 1185 |
|
---|
| 1186 | \sa setMode() lastError()
|
---|
| 1187 | */
|
---|
| 1188 |
|
---|
| 1189 | int QSqlCursor::update( bool invalidate )
|
---|
| 1190 | {
|
---|
| 1191 | if ( d->editIndex.isEmpty() )
|
---|
| 1192 | return 0;
|
---|
| 1193 | return update( d->editIndex, invalidate );
|
---|
| 1194 | }
|
---|
| 1195 |
|
---|
| 1196 | /*!
|
---|
| 1197 | \overload
|
---|
| 1198 |
|
---|
| 1199 | Updates the database with the current contents of the cursor edit
|
---|
| 1200 | buffer using the specified \a filter. Returns the number of
|
---|
| 1201 | records which were updated.
|
---|
| 1202 | For error information, use lastError().
|
---|
| 1203 |
|
---|
| 1204 | Only records which meet the filter criteria are updated, otherwise
|
---|
| 1205 | all records in the table are updated.
|
---|
| 1206 |
|
---|
| 1207 | If \a invalidate is TRUE (the default), the cursor can no longer
|
---|
| 1208 | be navigated. A new select() call must be made before you can move
|
---|
| 1209 | to a valid record.
|
---|
| 1210 |
|
---|
| 1211 | \sa primeUpdate() setMode() lastError()
|
---|
| 1212 | */
|
---|
| 1213 |
|
---|
| 1214 | int QSqlCursor::update( const QString & filter, bool invalidate )
|
---|
| 1215 | {
|
---|
| 1216 | if ( ( d->md & Update ) != Update ) {
|
---|
| 1217 | return FALSE;
|
---|
| 1218 | }
|
---|
| 1219 | int k = count();
|
---|
| 1220 | if ( k == 0 ) {
|
---|
| 1221 | return 0;
|
---|
| 1222 | }
|
---|
| 1223 |
|
---|
| 1224 | // use a prepared query if the driver supports it
|
---|
| 1225 | if ( driver()->hasFeature( QSqlDriver::PreparedQueries ) ) {
|
---|
| 1226 | QString fList;
|
---|
| 1227 | bool comma = FALSE;
|
---|
| 1228 | int cnt = 0;
|
---|
| 1229 | bool oraStyle = driver()->hasFeature( QSqlDriver::NamedPlaceholders );
|
---|
| 1230 | for( int j = 0; j < k; ++j ) {
|
---|
| 1231 | QSqlField* f = d->editBuffer.field( j );
|
---|
| 1232 | if ( d->editBuffer.isGenerated( j ) ) {
|
---|
| 1233 | if ( comma ) {
|
---|
| 1234 | fList += ",";
|
---|
| 1235 | }
|
---|
| 1236 | fList += f->name() + " = " + (oraStyle == TRUE ? ":f" + QString::number(cnt) : QString("?"));
|
---|
| 1237 | cnt++;
|
---|
| 1238 | comma = TRUE;
|
---|
| 1239 | }
|
---|
| 1240 | }
|
---|
| 1241 | if ( !comma ) {
|
---|
| 1242 | return 0;
|
---|
| 1243 | }
|
---|
| 1244 | QString str = "update " + name() + " set " + fList;
|
---|
| 1245 | if ( filter.length() ) {
|
---|
| 1246 | str+= " where " + filter;
|
---|
| 1247 | }
|
---|
| 1248 | return applyPrepared( str, invalidate );
|
---|
| 1249 | } else {
|
---|
| 1250 | QString str = "update " + name();
|
---|
| 1251 | str += " set " + toString( &d->editBuffer, QString::null, "=", "," );
|
---|
| 1252 | if ( filter.length() ) {
|
---|
| 1253 | str+= " where " + filter;
|
---|
| 1254 | }
|
---|
| 1255 | return apply( str, invalidate );
|
---|
| 1256 | }
|
---|
| 1257 | }
|
---|
| 1258 |
|
---|
| 1259 | /*!
|
---|
| 1260 | Deletes a record from the database using the cursor's primary
|
---|
| 1261 | index and the contents of the cursor edit buffer. Returns the
|
---|
| 1262 | number of records which were deleted.
|
---|
| 1263 | For error information, use lastError().
|
---|
| 1264 |
|
---|
| 1265 | Only records which meet the filter criteria specified by the
|
---|
| 1266 | cursor's primary index are deleted. If the cursor does not contain
|
---|
| 1267 | a primary index, no delete is performed and 0 is returned. If \a
|
---|
| 1268 | invalidate is TRUE (the default), the current cursor can no longer
|
---|
| 1269 | be navigated. A new select() call must be made before you can move
|
---|
| 1270 | to a valid record. For example:
|
---|
| 1271 |
|
---|
| 1272 | \quotefile sql/overview/delete/main.cpp
|
---|
| 1273 | \skipto prices
|
---|
| 1274 | \printline prices
|
---|
| 1275 | \printuntil }
|
---|
| 1276 |
|
---|
| 1277 | In the above example, a cursor is created on the 'prices' table
|
---|
| 1278 | and positioned to the record to be deleted. First primeDelete() is
|
---|
| 1279 | called to populate the edit buffer with the current cursor values,
|
---|
| 1280 | e.g. with an id of 999, and then del() is called to actually
|
---|
| 1281 | delete the record from the database. Remember: all edit operations
|
---|
| 1282 | (insert(), update() and delete()) operate on the contents of the
|
---|
| 1283 | cursor edit buffer and not on the contents of the cursor itself.
|
---|
| 1284 |
|
---|
| 1285 | \sa primeDelete() setMode() lastError()
|
---|
| 1286 | */
|
---|
| 1287 |
|
---|
| 1288 | int QSqlCursor::del( bool invalidate )
|
---|
| 1289 | {
|
---|
| 1290 | QSqlIndex idx = primaryIndex( FALSE );
|
---|
| 1291 | if ( idx.isEmpty() )
|
---|
| 1292 | return del( qWhereClause( &d->editBuffer, d->nm, "and", driver() ), invalidate );
|
---|
| 1293 | else
|
---|
| 1294 | return del( toString( primaryIndex(), &d->editBuffer, d->nm,
|
---|
| 1295 | "=", "and" ), invalidate );
|
---|
| 1296 | }
|
---|
| 1297 |
|
---|
| 1298 | /*!
|
---|
| 1299 | \overload
|
---|
| 1300 |
|
---|
| 1301 | Deletes the current cursor record from the database using the
|
---|
| 1302 | filter \a filter. Only records which meet the filter criteria are
|
---|
| 1303 | deleted. Returns the number of records which were deleted. If \a
|
---|
| 1304 | invalidate is TRUE (the default), the current cursor can no longer
|
---|
| 1305 | be navigated. A new select() call must be made before you can move
|
---|
| 1306 | to a valid record. For error information, use lastError().
|
---|
| 1307 |
|
---|
| 1308 | The \a filter is an SQL \c WHERE clause, e.g. \c{id=500}.
|
---|
| 1309 |
|
---|
| 1310 | \sa setMode() lastError()
|
---|
| 1311 | */
|
---|
| 1312 |
|
---|
| 1313 | int QSqlCursor::del( const QString & filter, bool invalidate )
|
---|
| 1314 | {
|
---|
| 1315 | if ( ( d->md & Delete ) != Delete )
|
---|
| 1316 | return 0;
|
---|
| 1317 | int k = count();
|
---|
| 1318 | if( k == 0 ) return 0;
|
---|
| 1319 | QString str = "delete from " + name();
|
---|
| 1320 | if ( filter.length() )
|
---|
| 1321 | str+= " where " + filter;
|
---|
| 1322 | return apply( str, invalidate );
|
---|
| 1323 | }
|
---|
| 1324 |
|
---|
| 1325 | /*
|
---|
| 1326 | \internal
|
---|
| 1327 | */
|
---|
| 1328 |
|
---|
| 1329 | int QSqlCursor::apply( const QString& q, bool invalidate )
|
---|
| 1330 | {
|
---|
| 1331 | int ar = 0;
|
---|
| 1332 | if ( invalidate ) {
|
---|
| 1333 | if ( exec( q ) )
|
---|
| 1334 | ar = numRowsAffected();
|
---|
| 1335 | } else if ( driver() ) {
|
---|
| 1336 | QSqlQuery* sql = d->query();
|
---|
| 1337 | if ( sql && sql->exec( q ) )
|
---|
| 1338 | ar = sql->numRowsAffected();
|
---|
| 1339 | }
|
---|
| 1340 | return ar;
|
---|
| 1341 | }
|
---|
| 1342 |
|
---|
| 1343 | /*
|
---|
| 1344 | \internal
|
---|
| 1345 | */
|
---|
| 1346 |
|
---|
| 1347 | int QSqlCursor::applyPrepared( const QString& q, bool invalidate )
|
---|
| 1348 | {
|
---|
| 1349 | int ar = 0;
|
---|
| 1350 | QSqlQuery* sql = 0;
|
---|
| 1351 |
|
---|
| 1352 | if ( invalidate ) {
|
---|
| 1353 | sql = (QSqlQuery*)this;
|
---|
| 1354 | d->lastAt = QSql::BeforeFirst;
|
---|
| 1355 | } else {
|
---|
| 1356 | sql = d->query();
|
---|
| 1357 | }
|
---|
| 1358 | if ( !sql )
|
---|
| 1359 | return 0;
|
---|
| 1360 |
|
---|
| 1361 | if ( invalidate || sql->lastQuery() != q ) {
|
---|
| 1362 | if ( !sql->prepare( q ) )
|
---|
| 1363 | return 0;
|
---|
| 1364 | }
|
---|
| 1365 |
|
---|
| 1366 | int cnt = 0;
|
---|
| 1367 | int fieldCount = (int)count();
|
---|
| 1368 | for ( int j = 0; j < fieldCount; ++j ) {
|
---|
| 1369 | const QSqlField* f = d->editBuffer.field( j );
|
---|
| 1370 | if ( d->editBuffer.isGenerated( j ) ) {
|
---|
| 1371 | sql->bindValue( cnt, f->value() );
|
---|
| 1372 | cnt++;
|
---|
| 1373 | }
|
---|
| 1374 | }
|
---|
| 1375 | if ( sql->exec() ) {
|
---|
| 1376 | ar = sql->numRowsAffected();
|
---|
| 1377 | }
|
---|
| 1378 | return ar;
|
---|
| 1379 | }
|
---|
| 1380 |
|
---|
| 1381 | /*! \reimp
|
---|
| 1382 |
|
---|
| 1383 | Executes the SQL query \a sql. Returns TRUE of the cursor is
|
---|
| 1384 | active, otherwise returns FALSE.
|
---|
| 1385 |
|
---|
| 1386 | */
|
---|
| 1387 | bool QSqlCursor::exec( const QString & sql )
|
---|
| 1388 | {
|
---|
| 1389 | d->lastAt = QSql::BeforeFirst;
|
---|
| 1390 | QSqlQuery::exec( sql );
|
---|
| 1391 | return isActive();
|
---|
| 1392 | }
|
---|
| 1393 |
|
---|
| 1394 | /*!
|
---|
| 1395 | Protected virtual function which is called whenever a field needs
|
---|
| 1396 | to be calculated. If calculated fields are being used, derived
|
---|
| 1397 | classes must reimplement this function and return the appropriate
|
---|
| 1398 | value for field \a name. The default implementation returns an
|
---|
| 1399 | invalid QVariant.
|
---|
| 1400 |
|
---|
| 1401 | \sa setCalculated()
|
---|
| 1402 | */
|
---|
| 1403 |
|
---|
| 1404 | QVariant QSqlCursor::calculateField( const QString& )
|
---|
| 1405 | {
|
---|
| 1406 | return QVariant();
|
---|
| 1407 | }
|
---|
| 1408 |
|
---|
| 1409 | /*! \internal
|
---|
| 1410 | Ensure fieldlist is synced with query.
|
---|
| 1411 |
|
---|
| 1412 | */
|
---|
| 1413 |
|
---|
| 1414 | static QString qTrim( const QString& s )
|
---|
| 1415 | {
|
---|
| 1416 | QString result = s;
|
---|
| 1417 | int end = result.length() - 1;
|
---|
| 1418 | while ( end >= 0 && result[end].isSpace() ) // skip white space from end
|
---|
| 1419 | end--;
|
---|
| 1420 | result.truncate( end + 1 );
|
---|
| 1421 | return result;
|
---|
| 1422 | }
|
---|
| 1423 |
|
---|
| 1424 | /*! \internal
|
---|
| 1425 | */
|
---|
| 1426 |
|
---|
| 1427 | void QSqlCursor::sync()
|
---|
| 1428 | {
|
---|
| 1429 | if ( isActive() && isValid() && d->lastAt != at() ) {
|
---|
| 1430 | d->lastAt = at();
|
---|
| 1431 | uint i = 0;
|
---|
| 1432 | uint j = 0;
|
---|
| 1433 | bool haveCalculatedFields = FALSE;
|
---|
| 1434 | for ( ; i < count(); ++i ) {
|
---|
| 1435 | if ( !haveCalculatedFields && d->infoBuffer[i].isCalculated() ) {
|
---|
| 1436 | haveCalculatedFields = TRUE;
|
---|
| 1437 | }
|
---|
| 1438 | if ( QSqlRecord::isGenerated( i ) ) {
|
---|
| 1439 | QVariant v = QSqlQuery::value( j );
|
---|
| 1440 | if ( ( v.type() == QVariant::String || v.type() == QVariant::CString ) &&
|
---|
| 1441 | d->infoBuffer[ i ].isTrim() ) {
|
---|
| 1442 | v = qTrim( v.toString() );
|
---|
| 1443 | }
|
---|
| 1444 | QSqlRecord::setValue( i, v );
|
---|
| 1445 | if ( QSqlQuery::isNull( j ) )
|
---|
| 1446 | QSqlRecord::field( i )->setNull();
|
---|
| 1447 | j++;
|
---|
| 1448 | }
|
---|
| 1449 | }
|
---|
| 1450 | if ( haveCalculatedFields ) {
|
---|
| 1451 | for ( i = 0; i < count(); ++i ) {
|
---|
| 1452 | if ( d->infoBuffer[i].isCalculated() )
|
---|
| 1453 | QSqlRecord::setValue( i, calculateField( fieldName( i ) ) );
|
---|
| 1454 | }
|
---|
| 1455 | }
|
---|
| 1456 | }
|
---|
| 1457 | }
|
---|
| 1458 |
|
---|
| 1459 | /*! \reimp
|
---|
| 1460 |
|
---|
| 1461 | */
|
---|
| 1462 |
|
---|
| 1463 | void QSqlCursor::afterSeek()
|
---|
| 1464 | {
|
---|
| 1465 | sync();
|
---|
| 1466 | }
|
---|
| 1467 |
|
---|
| 1468 | /*!
|
---|
| 1469 | \reimp
|
---|
| 1470 |
|
---|
| 1471 | Returns the value of field number \a i.
|
---|
| 1472 | */
|
---|
| 1473 |
|
---|
| 1474 | QVariant QSqlCursor::value( int i ) const
|
---|
| 1475 | {
|
---|
| 1476 | return QSqlRecord::value( i );
|
---|
| 1477 | }
|
---|
| 1478 |
|
---|
| 1479 | /*!
|
---|
| 1480 | \reimp
|
---|
| 1481 |
|
---|
| 1482 | Returns the value of the field called \a name.
|
---|
| 1483 | */
|
---|
| 1484 |
|
---|
| 1485 | QVariant QSqlCursor::value( const QString& name ) const
|
---|
| 1486 | {
|
---|
| 1487 | return QSqlRecord::value( name );
|
---|
| 1488 | }
|
---|
| 1489 |
|
---|
| 1490 | /*! \internal
|
---|
| 1491 | cursors should be filled with QSqlFieldInfos...
|
---|
| 1492 | */
|
---|
| 1493 | void QSqlCursor::append( const QSqlField& field )
|
---|
| 1494 | {
|
---|
| 1495 | append( QSqlFieldInfo( field ) );
|
---|
| 1496 | }
|
---|
| 1497 | /*! \internal
|
---|
| 1498 | cursors should be filled with QSqlFieldInfos...
|
---|
| 1499 | */
|
---|
| 1500 | void QSqlCursor::insert( int pos, const QSqlField& field )
|
---|
| 1501 | {
|
---|
| 1502 | insert( pos, QSqlFieldInfo( field ) );
|
---|
| 1503 | }
|
---|
| 1504 |
|
---|
| 1505 | /*!
|
---|
| 1506 | Returns TRUE if the field \a i is NULL or if there is no field at
|
---|
| 1507 | position \a i; otherwise returns FALSE.
|
---|
| 1508 |
|
---|
| 1509 | This is the same as calling QSqlRecord::isNull( \a i )
|
---|
| 1510 | */
|
---|
| 1511 | bool QSqlCursor::isNull( int i ) const
|
---|
| 1512 | {
|
---|
| 1513 | return QSqlRecord::isNull( i );
|
---|
| 1514 | }
|
---|
| 1515 | /*!
|
---|
| 1516 | \overload
|
---|
| 1517 |
|
---|
| 1518 | Returns TRUE if the field called \a name is NULL or if there is no
|
---|
| 1519 | field called \a name; otherwise returns FALSE.
|
---|
| 1520 |
|
---|
| 1521 | This is the same as calling QSqlRecord::isNull( \a name )
|
---|
| 1522 | */
|
---|
| 1523 | bool QSqlCursor::isNull( const QString& name ) const
|
---|
| 1524 | {
|
---|
| 1525 | return QSqlRecord::isNull( name );
|
---|
| 1526 | }
|
---|
| 1527 |
|
---|
| 1528 | /*! \reimp */
|
---|
| 1529 | void QSqlCursor::setValue( int i, const QVariant& val )
|
---|
| 1530 | {
|
---|
| 1531 | #ifdef QT_DEBUG
|
---|
| 1532 | qDebug("QSqlCursor::setValue(): This will not affect actual database values. Use primeInsert(), primeUpdate() or primeDelete().");
|
---|
| 1533 | #endif
|
---|
| 1534 | QSqlRecord::setValue( i, val );
|
---|
| 1535 | }
|
---|
| 1536 |
|
---|
| 1537 | /*! \reimp */
|
---|
| 1538 | void QSqlCursor::setValue( const QString& name, const QVariant& val )
|
---|
| 1539 | {
|
---|
| 1540 | #ifdef QT_DEBUG
|
---|
| 1541 | qDebug("QSqlCursor::setValue(): This will not affect actual database values. Use primeInsert(), primeUpdate() or primeDelete().");
|
---|
| 1542 | #endif
|
---|
| 1543 | QSqlRecord::setValue( name, val );
|
---|
| 1544 | }
|
---|
| 1545 | #endif
|
---|