kexi

queryschema.h
1/* This file is part of the KDE project
2 Copyright (C) 2003-2007 Jaroslaw Staniek <js@iidea.pl>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#ifndef KEXIDB_QUERY_H
21#define KEXIDB_QUERY_H
22
23#include <tqvaluevector.h>
24#include <tqstring.h>
25#include <tqmap.h>
26#include <tqptrlist.h>
27
28#include "fieldlist.h"
29#include "schemadata.h"
30#include "tableschema.h"
31#include "relationship.h"
32
33namespace KexiDB {
34
35class Connection;
36class QueryAsterisk;
37class QuerySchemaPrivate;
38class QuerySchemaParameter;
39typedef TQValueList<QuerySchemaParameter> QuerySchemaParameterList;
40
42
48class KEXI_DB_EXPORT QueryColumnInfo
49{
50 public:
51 typedef TQPtrVector<QueryColumnInfo> Vector;
52 typedef TQPtrList<QueryColumnInfo> List;
53 typedef TQPtrListIterator<QueryColumnInfo> ListIterator;
54
55 QueryColumnInfo(Field *f, const TQCString& _alias, bool _visible, QueryColumnInfo *foreignColumn = 0);
57
59 inline TQCString aliasOrName() const {
60 return alias.isEmpty() ? field->name().latin1() : (const char*)alias;
61 }
62
65 inline TQString captionOrAliasOrName() const {
66 return field->caption().isEmpty() ? TQString(aliasOrName()) : field->caption(); }
67
68 Field *field;
69 TQCString alias;
70
75 inline int indexForVisibleLookupValue() const { return m_indexForVisibleLookupValue; }
76
78 inline void setIndexForVisibleLookupValue(int index) { m_indexForVisibleLookupValue = index; }
79
81 QueryColumnInfo *foreignColumn() const { return m_foreignColumn; }
82
84 TQString debugString() const;
85
87 bool visible : 1;
88
89 private:
92 int m_indexForVisibleLookupValue;
93
95 QueryColumnInfo *m_foreignColumn;
96};
97
99
100class KEXI_DB_EXPORT OrderByColumn
101{
102 public:
103 typedef TQValueListConstIterator<OrderByColumn> ListConstIterator;
105 OrderByColumn(QueryColumnInfo& column, bool ascending = true, int pos = -1);
106
109 OrderByColumn(Field& field, bool ascending = true);
110
112
114 inline QueryColumnInfo* column() const { return m_column; }
115
119 inline int position() const { return m_pos; }
120
122 inline Field *field() const { return m_field; }
123
125 inline bool ascending() const { return m_ascending; }
126
128 bool operator== ( const OrderByColumn& col ) const
129 { return m_column==col.m_column && m_field==col.m_field
130 && m_ascending==col.m_ascending; }
131
133 TQString debugString() const;
134
139 TQString toSQLString(bool includeTableName = true,
140 Driver *drv = 0, int identifierEscaping = Driver::EscapeDriver|Driver::EscapeAsNecessary) const;
141
142 protected:
145 int m_pos;
149
151 bool m_ascending : 1;
152};
153
155typedef TQValueList<OrderByColumn> OrderByColumnListBase;
156
158class KEXI_DB_EXPORT OrderByColumnList : protected OrderByColumnListBase
159{
160 public:
163
165
170 bool appendFields(QuerySchema& querySchema,
171 const TQString& field1, bool ascending1 = true,
172 const TQString& field2 = TQString(), bool ascending2 = true,
173 const TQString& field3 = TQString(), bool ascending3 = true,
174 const TQString& field4 = TQString(), bool ascending4 = true,
175 const TQString& field5 = TQString(), bool ascending5 = true);
176
178 void appendColumn(QueryColumnInfo& columnInfo, bool ascending = true);
179
183 void appendField(Field& field, bool ascending = true);
184
188 bool appendField(QuerySchema& querySchema, const TQString& fieldName,
189 bool ascending = true);
190
193 bool appendColumn(QuerySchema& querySchema, bool ascending = true, int pos = -1);
194
196 void appendColumn(const OrderByColumn& column);
197
199 bool isEmpty() const { return OrderByColumnListBase::isEmpty(); }
200
202 uint count() const { return OrderByColumnListBase::count(); }
203
205 void clear() { OrderByColumnListBase::clear(); }
206
207 const_iterator constBegin () const { return OrderByColumnListBase::constBegin(); }
208 const_iterator constEnd () const { return OrderByColumnListBase::constEnd(); }
209
211 TQString debugString() const;
212
217 TQString toSQLString(bool includeTableNames = true,
218 Driver *drv = 0, int identifierEscaping = Driver::EscapeDriver|Driver::EscapeAsNecessary) const;
219};
220
222
225class KEXI_DB_EXPORT QuerySchema : public FieldList, public SchemaData
226{
227 public:
229 QuerySchema();
230
245 QuerySchema(TableSchema& tableSchema);
246
249 QuerySchema(const QuerySchema& querySchema);
250
251 virtual ~QuerySchema();
252
267 virtual FieldList& insertField(uint position, Field *field);
268
269 /* Like above method, but you can also set column's visibility.
270 New column is not bound explicitly to any table.
271 */
272 FieldList& insertField(uint position, Field *field, bool visible);
273
274 /* Like above method, but you can also explicitly bound the new column
275 to specific position on tables list.
276 If \a visible is true (the default), the field will be visible.
277 If bindToTable==-1, no particular table should be bound.
278 @see tableBoundToColumn(uint columnPosition) */
279 FieldList& insertField(uint position, Field *field,
280 int bindToTable, bool visible = true);
281
285 FieldList& addField(Field* field, bool visible = true);
286
293 FieldList& addField(Field* field, int bindToTable,
294 bool visible = true);
295
297 virtual void removeField(Field *field);
298
301 FieldList& addExpression(BaseExpr* expr, bool visible = true);
302
305 bool isColumnVisible(uint position) const;
306
308 void setColumnVisible(uint position, bool v);
309
311 FieldList& addAsterisk(QueryAsterisk *asterisk, bool visible = true);
312
318 virtual void clear();
319
321 virtual TQString debugString();
322
325 Connection* connection() const;
326
338 TableSchema* masterTable() const;
339
344 void setMasterTable(TableSchema *table);
345
349 TableSchema::List* tables() const;
350
355 void addTable(TableSchema *table, const TQCString& alias = TQCString());
356
361 void removeTable(TableSchema *table);
362
364 TableSchema* table(const TQString& tableName) const;
365
367 bool contains(TableSchema *table) const;
368
387 Field* findTableField(const TQString &tableOrTableAndFieldName) const;
388
395 TQCString columnAlias(uint position) const;
396
402 bool hasColumnAlias(uint position) const;
403
406 void setColumnAlias(uint position, const TQCString& alias);
407
429 int tableBoundToColumn(uint columnPosition) const;
430
434 TQCString tableAlias(uint position) const;
435
447 int tablePositionForAlias(const TQCString& name) const;
448
453 int tablePosition(const TQString& tableName) const;
454
461 TQValueList<int> tablePositions(const TQString& tableName) const;
462
468 bool hasTableAlias(uint position) const;
469
472 int columnPositionForAlias(const TQCString& name) const;
473
478 void setTableAlias(uint position, const TQCString& alias);
479
481 Relationship::List* relationships() const;
482
490 Relationship* addRelationship( Field *field1, Field *field2 );
491
493 Field::List* asterisks() const;
494
519 virtual Field* field(const TQString& name, bool expanded = true);
520
522 inline Field* field(uint id) { return FieldList::field(id); }
523
536 QueryColumnInfo* columnInfo(const TQString& identifier, bool expanded = true);
537
543 WithInternalFieldsAndRowID
545 };
546
588 QueryColumnInfo::Vector fieldsExpanded(FieldsExpandedOptions options = Default);
589
591 QueryColumnInfo::Vector internalFields();
592
597 QueryColumnInfo* expandedOrInternalField(uint index);
598
605
635 TQMap<QueryColumnInfo*,int> columnsOrder(ColumnsOrderOptions options = ExpandedList);
636
659 TQValueVector<int> pkeyFieldsOrder();
660
679 uint pkeyFieldsCount();
680
685 QueryColumnInfo::List* autoIncrementFields();
686
688 TQString statement() const;
689
691 void setStatement(const TQString &s);
692
703 static TQString sqlColumnsList(QueryColumnInfo::List* infolist, Driver *driver);
704
707 TQString autoIncrementSQLFieldsList(Driver *driver);
708
712 void setWhereExpression(BaseExpr *expr);
713
715 BaseExpr *whereExpression() const;
716
720 void addToWhereExpression(KexiDB::Field *field, const TQVariant& value, int relation = '=');
721
734 void setOrderByColumnList(const OrderByColumnList& list);
735
738 OrderByColumnList& orderByColumnList() const;
739
742 QuerySchemaParameterList parameters();
743
744 protected:
745 void init();
746
747 void computeFieldsExpanded();
748
749 QuerySchemaPrivate *d;
750
751 friend class Connection;
752 friend class QuerySchemaPrivate;
753};
754
756
778class KEXI_DB_EXPORT QueryAsterisk : public Field
779{
780 public:
790 QueryAsterisk( QuerySchema *query, TableSchema *table = 0 );
791
792 virtual ~QueryAsterisk();
793
795 QuerySchema *query() const { return static_cast<QuerySchema*>(m_parent); }
796
800 virtual TableSchema* table() const { return m_table; }
801
804 virtual void setTable(TableSchema *table);
805
807 virtual bool isQueryAsterisk() const { return true; }
808
811 bool isSingleTableAsterisk() const { return m_table!=NULL; }
812
815 bool isAllTableAsterisk() const { return m_table==NULL; }
816
818 virtual TQString debugString() const;
819
820 protected:
822 virtual Field* copy() const;
823
826
827 friend class QuerySchema;
828};
829
830} //namespace KexiDB
831
832#endif
A base class for all expressions.
Definition expression.h:67
Provides database connection, allowing queries and data modification.
Definition connection.h:62
Generic database abstraction.
Definition driver.h:67
Meta-data for a field.
Definition field.h:73
TQPtrList< Field > List
list of fields
Definition field.h:75
KexiDB::OrderByColumnList provides list of sorted columns for a query schema.
KexiDB::OrderByColumn provides information about a single query column used for sorting.
QueryColumnInfo * m_column
Column to sort.
Field * field() const
A field to sort, used only in case when the second constructor was used.
Field * m_field
Used only in case when the second contructor is used.
int m_pos
A helper for m_column that allows to know that sorting column was defined by providing its position.
bool ascending() const
QueryColumnInfo * column() const
A column to sort.
bool m_ascending
true if ascending sorting should be performed (the default).
KexiDB::QueryAsterisk class encapsulates information about single asterisk in query definition.
bool isAllTableAsterisk() const
virtual bool isQueryAsterisk() const
QuerySchema * query() const
bool isSingleTableAsterisk() const
virtual TableSchema * table() const
TableSchema * m_table
Helper class that assigns additional information for the column in a query.
Definition queryschema.h:49
TQCString aliasOrName() const
Definition queryschema.h:59
bool visible
true if this column is visible to the user (and its data is fetched by the engine)
Definition queryschema.h:87
int indexForVisibleLookupValue() const
Definition queryschema.h:75
TQString captionOrAliasOrName() const
Definition queryschema.h:65
QueryColumnInfo * foreignColumn() const
Definition queryschema.h:81
void setIndexForVisibleLookupValue(int index)
Definition queryschema.h:78
KexiDB::QuerySchema provides information about database query.
@ Default
All fields are returned even if duplicated.
@ Unique
Unique list of fields is returned.
@ WithInternalFields
Like Default but internal fields (for lookup) are appended.
@ UnexpandedList
A map for unexpanded list is created.
@ UnexpandedListWithoutAsterisks
A map for unexpanded list is created, with asterisks skipped.
Field * field(uint id)
TQPtrList< TableSchema > List
Type of tables list.
Definition tableschema.h:45
High-level database connectivity library with database backend drivers.
TQValueList< OrderByColumn > OrderByColumnListBase
A base for KexiDB::OrderByColumnList.