summaryrefslogtreecommitdiffstats
path: root/src/sql/qsqlindex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sql/qsqlindex.cpp')
-rw-r--r--src/sql/qsqlindex.cpp301
1 files changed, 301 insertions, 0 deletions
diff --git a/src/sql/qsqlindex.cpp b/src/sql/qsqlindex.cpp
new file mode 100644
index 0000000..f5bdace
--- /dev/null
+++ b/src/sql/qsqlindex.cpp
@@ -0,0 +1,301 @@
+/****************************************************************************
+**
+** Implementation of QSqlIndex class
+**
+** Created : 2000-11-03
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the sql module of the Qt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.QPL
+** included in the packaging of this file. Licensees holding valid Qt
+** Commercial licenses may use this file in accordance with the Qt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "qsqlindex.h"
+
+#ifndef QT_NO_SQL
+
+#include "qsqlcursor.h"
+
+/*!
+ \class QSqlIndex qsqlindex.h
+ \brief The QSqlIndex class provides functions to manipulate and
+ describe QSqlCursor and QSqlDatabase indexes.
+
+ \ingroup database
+ \module sql
+
+ This class is used to describe and manipulate QSqlCursor and
+ QSqlDatabase indexes. An index refers to a single table or view
+ in a database. Information about the fields that comprise the
+ index can be used to generate SQL statements, or to affect the
+ behavior of a \l QSqlCursor object.
+
+ Normally, QSqlIndex objects are created by \l QSqlDatabase or
+ QSqlCursor.
+*/
+
+/*!
+ Constructs an empty index using the cursor name \a cursorname and
+ index name \a name.
+*/
+
+QSqlIndex::QSqlIndex( const QString& cursorname, const QString& name )
+ : QSqlRecord(), cursor(cursorname), nm(name)
+{
+
+}
+
+/*!
+ Constructs a copy of \a other.
+*/
+
+QSqlIndex::QSqlIndex( const QSqlIndex& other )
+ : QSqlRecord(other), cursor(other.cursor), nm(other.nm), sorts(other.sorts)
+{
+}
+
+/*!
+ Sets the index equal to \a other.
+*/
+
+QSqlIndex& QSqlIndex::operator=( const QSqlIndex& other )
+{
+ cursor = other.cursor;
+ nm = other.nm;
+ sorts = other.sorts;
+ QSqlRecord::operator=( other );
+ return *this;
+}
+
+/*!
+ Destroys the object and frees any allocated resources.
+*/
+
+QSqlIndex::~QSqlIndex()
+{
+
+}
+
+/*!
+ Sets the name of the index to \a name.
+*/
+
+void QSqlIndex::setName( const QString& name )
+{
+ nm = name;
+}
+
+/*!
+ \fn QString QSqlIndex::name() const
+
+ Returns the name of the index.
+*/
+
+/*!
+ Appends the field \a field to the list of indexed fields. The
+ field is appended with an ascending sort order.
+*/
+
+void QSqlIndex::append( const QSqlField& field )
+{
+ append( field, FALSE );
+}
+
+/*!
+ \overload
+
+ Appends the field \a field to the list of indexed fields. The
+ field is appended with an ascending sort order, unless \a desc is
+ TRUE.
+*/
+
+void QSqlIndex::append( const QSqlField& field, bool desc )
+{
+ sorts.append( desc );
+ QSqlRecord::append( field );
+}
+
+
+/*!
+ Returns TRUE if field \a i in the index is sorted in descending
+ order; otherwise returns FALSE.
+*/
+
+bool QSqlIndex::isDescending( int i ) const
+{
+ if ( sorts.at( i ) != sorts.end() )
+ return sorts[i];
+ return FALSE;
+}
+
+/*!
+ If \a desc is TRUE, field \a i is sorted in descending order.
+ Otherwise, field \a i is sorted in ascending order (the default).
+ If the field does not exist, nothing happens.
+*/
+
+void QSqlIndex::setDescending( int i, bool desc )
+{
+ if ( sorts.at( i ) != sorts.end() )
+ sorts[i] = desc;
+}
+
+/*!
+ \reimp
+
+ Returns a comma-separated list of all the index's field names as a
+ string. This string is suitable, for example, for generating a
+ SQL SELECT statement. Only generated fields are included in the
+ list (see \l{isGenerated()}). If a \a prefix is specified, e.g. a
+ table name, it is prepended before all field names in the form:
+
+ "\a{prefix}.<fieldname>"
+
+ If \a sep is specified, each field is separated by \a sep. If \a
+ verbose is TRUE (the default), each field contains a suffix
+ indicating an ASCending or DESCending sort order.
+*/
+
+QString QSqlIndex::toString( const QString& prefix, const QString& sep, bool verbose ) const
+{
+ QString s;
+ bool comma = FALSE;
+ for ( uint i = 0; i < count(); ++i ) {
+ if( comma )
+ s += sep + " ";
+ s += createField( i, prefix, verbose );
+ comma = TRUE;
+ }
+ return s;
+}
+
+/*!
+ \reimp
+
+ Returns a list of all the index's field names. Only generated
+ fields are included in the list (see \l{isGenerated()}). If a \a
+ prefix is specified, e.g. a table name, all fields are prefixed in
+ the form:
+
+ "\a{prefix}.<fieldname>"
+
+ If \a verbose is TRUE (the default), each field contains a suffix
+ indicating an ASCending or DESCending sort order.
+
+ Note that if you want to iterate over the list, you should iterate
+ over a copy, e.g.
+ \code
+ QStringList list = myIndex.toStringList();
+ QStringList::Iterator it = list.begin();
+ while( it != list.end() ) {
+ myProcessing( *it );
+ ++it;
+ }
+ \endcode
+
+*/
+QStringList QSqlIndex::toStringList( const QString& prefix, bool verbose ) const
+{
+ QStringList s;
+ for ( uint i = 0; i < count(); ++i )
+ s += createField( i, prefix, verbose );
+ return s;
+}
+
+/*! \internal
+
+ Creates a string representing the field number \a i using prefix \a
+ prefix. If \a verbose is TRUE, ASC or DESC is included in the field
+ description if the field is sorted in ASCending or DESCending order.
+*/
+
+QString QSqlIndex::createField( int i, const QString& prefix, bool verbose ) const
+{
+ QString f;
+ if ( !prefix.isEmpty() )
+ f += prefix + ".";
+ f += field( i )->name();
+ if ( verbose )
+ f += " " + QString( ( isDescending( i ) ? "DESC" : "ASC" ) );
+ return f;
+}
+
+/*!
+ Returns an index based on the field descriptions in \a l and the
+ cursor \a cursor. The field descriptions should be in the same
+ format that toStringList() produces, for example, a surname field
+ in the people table might be in one of these forms: "surname",
+ "surname DESC" or "people.surname ASC".
+
+ \sa toStringList()
+*/
+
+QSqlIndex QSqlIndex::fromStringList( const QStringList& l, const QSqlCursor* cursor )
+{
+ QSqlIndex newSort;
+ for ( uint i = 0; i < l.count(); ++i ) {
+ QString f = l[ i ];
+ bool desc = FALSE;
+ if ( f.mid( f.length()-3 ) == "ASC" )
+ f = f.mid( 0, f.length()-3 );
+ if ( f.mid( f.length()-4 ) == "DESC" ) {
+ desc = TRUE;
+ f = f.mid( 0, f.length()-4 );
+ }
+ int dot = f.findRev( '.' );
+ if ( dot != -1 )
+ f = f.mid( dot+1 );
+ const QSqlField* field = cursor->field( f.simplifyWhiteSpace() );
+ if ( field )
+ newSort.append( *field, desc );
+ else
+ qWarning( "QSqlIndex::fromStringList: unknown field: '%s'", f.latin1());
+ }
+ return newSort;
+}
+
+/*!
+ \fn QString QSqlIndex::cursorName() const
+
+ Returns the name of the cursor which the index is associated with.
+*/
+
+
+/*!
+ Sets the name of the cursor that the index is associated with to
+ \a cursorName.
+*/
+void QSqlIndex::setCursorName( const QString& cursorName )
+{
+ cursor = cursorName;
+}
+
+#endif