33e3c1ce34a17e33ae074e2b6afcbafdbce11591
[profile/ivi/qtbase.git] / src / sql / kernel / qsqlindex.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the QtSql module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 **
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 **
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
29 **
30 ** Other Usage
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qsqlindex.h"
43
44 #include "qsqlfield.h"
45 #include "qstringlist.h"
46
47 QT_BEGIN_NAMESPACE
48
49 /*!
50     \class QSqlIndex
51     \brief The QSqlIndex class provides functions to manipulate and
52     describe database indexes.
53
54     \ingroup database
55     \inmodule QtSql
56
57     An \e index refers to a single table or view in a database.
58     Information about the fields that comprise the index can be used
59     to generate SQL statements.
60 */
61
62 /*!
63     Constructs an empty index using the cursor name \a cursorname and
64     index name \a name.
65 */
66
67 QSqlIndex::QSqlIndex(const QString& cursorname, const QString& name)
68     : cursor(cursorname), nm(name)
69 {
70 }
71
72 /*!
73     Constructs a copy of \a other.
74 */
75
76 QSqlIndex::QSqlIndex(const QSqlIndex& other)
77     : QSqlRecord(other), cursor(other.cursor), nm(other.nm), sorts(other.sorts)
78 {
79 }
80
81 /*!
82     Sets the index equal to \a other.
83 */
84
85 QSqlIndex& QSqlIndex::operator=(const QSqlIndex& other)
86 {
87     cursor = other.cursor;
88     nm = other.nm;
89     sorts = other.sorts;
90     QSqlRecord::operator=(other);
91     return *this;
92 }
93
94 /*!
95     Destroys the object and frees any allocated resources.
96 */
97
98 QSqlIndex::~QSqlIndex()
99 {
100
101 }
102
103 /*!
104     Sets the name of the index to \a name.
105 */
106
107 void QSqlIndex::setName(const QString& name)
108 {
109     nm = name;
110 }
111
112 /*!
113     \fn QString QSqlIndex::name() const
114
115     Returns the name of the index.
116 */
117
118 /*!
119     Appends the field \a field to the list of indexed fields. The
120     field is appended with an ascending sort order.
121 */
122
123 void QSqlIndex::append(const QSqlField& field)
124 {
125     append(field, false);
126 }
127
128 /*!
129     \overload
130
131     Appends the field \a field to the list of indexed fields. The
132     field is appended with an ascending sort order, unless \a desc is
133     true.
134 */
135
136 void QSqlIndex::append(const QSqlField& field, bool desc)
137 {
138     sorts.append(desc);
139     QSqlRecord::append(field);
140 }
141
142
143 /*!
144     Returns true if field \a i in the index is sorted in descending
145     order; otherwise returns false.
146 */
147
148 bool QSqlIndex::isDescending(int i) const
149 {
150     if (i >= 0 && i < sorts.size())
151         return sorts[i];
152     return false;
153 }
154
155 /*!
156     If \a desc is true, field \a i is sorted in descending order.
157     Otherwise, field \a i is sorted in ascending order (the default).
158     If the field does not exist, nothing happens.
159 */
160
161 void QSqlIndex::setDescending(int i, bool desc)
162 {
163     if (i >= 0 && i < sorts.size())
164         sorts[i] = desc;
165 }
166
167 #ifdef QT3_SUPPORT
168
169 /*!
170     Returns a comma-separated list of all the index's field names as a
171     string. This string is suitable, for example, for generating a
172     SQL SELECT statement. Only generated fields are included in the
173     list (see \l{isGenerated()}). If a \a prefix is specified, e.g. a
174     table name, it is prepended before all field names in the form:
175
176     "\a{prefix}.<fieldname>"
177
178     If \a sep is specified, each field is separated by \a sep. If \a
179     verbose is true (the default), each field contains a suffix
180     indicating an ASCending or DESCending sort order.
181 */
182
183 QString QSqlIndex::toString(const QString& prefix, const QString& sep, bool verbose) const
184 {
185     QString s;
186     bool comma = false;
187     for (int i = 0; i < count(); ++i) {
188         if(comma)
189             s += sep + QLatin1Char(' ');
190         s += createField(i, prefix, verbose);
191         comma = true;
192     }
193     return s;
194 }
195
196 /*!
197     Returns a list of all the index's field names. Only generated
198     fields are included in the list (see \l{isGenerated()}). If a \a
199     prefix is specified, e.g. a table name, all fields are prefixed in
200     the form:
201
202     "\a{prefix}.<fieldname>"
203
204     If \a verbose is true (the default), each field contains a suffix
205     indicating an ASCending or DESCending sort order.
206
207     Note that if you want to iterate over the list, you should iterate
208     over a copy, e.g.
209     \snippet doc/src/snippets/code/src_sql_kernel_qsqlindex.cpp 0
210
211 */
212 QStringList QSqlIndex::toStringList(const QString& prefix, bool verbose) const
213 {
214     QStringList s;
215     for (int i = 0; i < count(); ++i)
216         s += createField(i, prefix, verbose);
217     return s;
218 }
219 #endif
220
221 /*! \internal
222
223   Creates a string representing the field number \a i using prefix \a
224   prefix. If \a verbose is true, ASC or DESC is included in the field
225   description if the field is sorted in ASCending or DESCending order.
226 */
227
228 QString QSqlIndex::createField(int i, const QString& prefix, bool verbose) const
229 {
230     QString f;
231     if (!prefix.isEmpty())
232         f += prefix + QLatin1Char('.');
233     f += field(i).name();
234     if (verbose)
235         f += QLatin1Char(' ') + QString((isDescending(i)
236                     ? QLatin1String("DESC") : QLatin1String("ASC")));
237     return f;
238 }
239
240 /*!
241     \fn QString QSqlIndex::cursorName() const
242
243     Returns the name of the cursor which the index is associated with.
244 */
245
246
247 /*!
248     Sets the name of the cursor that the index is associated with to
249     \a cursorName.
250 */
251 void QSqlIndex::setCursorName(const QString& cursorName)
252 {
253     cursor = cursorName;
254 }
255
256 QT_END_NAMESPACE