File indexing completed on 2024-12-01 04:18:57
0001 /* This file is part of the KDE project 0002 Copyright (C) 2004-2016 Jarosław Staniek <staniek@kde.org> 0003 0004 This library is free software; you can redistribute it and/or 0005 modify it under the terms of the GNU Library General Public 0006 License as published by the Free Software Foundation; either 0007 version 2 of the License, or (at your option) any later version. 0008 0009 This library is distributed in the hope that it will be useful, 0010 but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0012 Library General Public License for more details. 0013 0014 You should have received a copy of the GNU Library General Public License 0015 along with this library; see the file COPYING.LIB. If not, write to 0016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0017 * Boston, MA 02110-1301, USA. 0018 */ 0019 0020 #ifndef KDB_PARSER_P_H 0021 #define KDB_PARSER_P_H 0022 0023 #include "KDbParser.h" 0024 #include "KDbSqlTypes.h" 0025 0026 #include <QList> 0027 #include <QHash> 0028 #include <QCache> 0029 #include <QString> 0030 0031 class KDbQuerySchema; 0032 class KDbTableSchema; 0033 class KDbConnection; 0034 class KDbExpression; 0035 0036 //! @internal 0037 class KDbParserPrivate 0038 { 0039 public: 0040 KDbParserPrivate(); 0041 ~KDbParserPrivate(); 0042 0043 void reset(); 0044 0045 //! For use by parser's low level C functions 0046 inline static KDbParserPrivate* get(KDbParser *parser) { 0047 return parser->d; 0048 } 0049 0050 /** 0051 * Sets the type of statement. 0052 */ 0053 void setStatementType(KDbParser::StatementType type); 0054 0055 /** 0056 * Sets @a table schema object. 0057 */ 0058 void setTableSchema(KDbTableSchema *table); 0059 0060 /** 0061 * Sets @a query schema object. 0062 */ 0063 //! @todo Add other query types 0064 void setQuerySchema(KDbQuerySchema *query); 0065 0066 /** 0067 * Sets a error. 0068 */ 0069 void setError(const KDbParserError &err); 0070 0071 /** 0072 * Creates a new query or provides the one provided by KDbParser::parse(). 0073 */ 0074 Q_REQUIRED_RESULT KDbQuerySchema *createQuery(); 0075 0076 friend class KDbParser; 0077 0078 private: 0079 KDbParser::StatementType statementType; 0080 KDbTableSchema *table; 0081 0082 //! Query created as a result of parse() (createQuery()); can be also predefined - passed as 0083 //! argument of parse() 0084 KDbQuerySchema *query; 0085 0086 KDbConnection *connection; 0087 KDbEscapedString sql; 0088 KDbParserError error; 0089 bool initialized; 0090 Q_DISABLE_COPY(KDbParserPrivate) 0091 }; 0092 0093 /*! Info used on parsing. */ 0094 class KDB_TESTING_EXPORT KDbParseInfo 0095 { 0096 public: 0097 ~KDbParseInfo(); 0098 0099 //! @return positions of tables/aliases having the same name @a tableOrAliasName. 0100 //! First tries to use information provided by appendPositionForTableOrAliasName(), 0101 //! then information from the query schema. 0102 QList<int> tablesAndAliasesForName(const QString &tableOrAliasName) const; 0103 0104 //! @return query schema for this parsing 0105 KDbQuerySchema* querySchema() const; 0106 0107 //! @return error message for the parsing process 0108 QString errorMessage() const; 0109 0110 //! Sets error message for the parsing process to @a message 0111 void setErrorMessage(const QString &message); 0112 0113 //! @return detailed error description for the parsing process 0114 QString errorDescription() const; 0115 0116 //! Sets detailed error description for the parsing process to @a description 0117 void setErrorDescription(const QString &description); 0118 0119 protected: 0120 //! Constructs parse info structure for query @a query. 0121 explicit KDbParseInfo(KDbQuerySchema *query); 0122 0123 class Private; 0124 Private * const d; 0125 private: 0126 Q_DISABLE_COPY(KDbParseInfo) 0127 }; 0128 0129 class Q_DECL_HIDDEN KDbParseInfo::Private 0130 { 0131 public: 0132 Private() {} 0133 ~Private() { 0134 qDeleteAll(repeatedTablesAndAliases); 0135 } 0136 0137 //! collects positions of tables/aliases with the same names 0138 QHash< QString, QList<int>* > repeatedTablesAndAliases; 0139 0140 QString errorMessage, errorDescription; // helpers 0141 0142 KDbQuerySchema *querySchema; 0143 private: 0144 Q_DISABLE_COPY(Private) 0145 }; 0146 0147 /*! Internal info used on parsing (writable). */ 0148 class KDB_TESTING_EXPORT KDbParseInfoInternal : public KDbParseInfo 0149 { 0150 public: 0151 //! Constructs parse info structure for query @a query. 0152 explicit KDbParseInfoInternal(KDbQuerySchema *query); 0153 0154 ~KDbParseInfoInternal(); 0155 0156 //! Appends position @a pos for table or alias @a tableOrAliasName. 0157 void appendPositionForTableOrAliasName(const QString &tableOrAliasName, int pos); 0158 0159 private: 0160 Q_DISABLE_COPY(KDbParseInfoInternal) 0161 }; 0162 0163 KDB_TESTING_EXPORT const char* g_tokenName(unsigned int offset); 0164 0165 void yyerror(const char *str); 0166 0167 void setError(const QString& errName, const QString& errDesc); 0168 0169 void setError(const QString& errDesc); 0170 0171 bool addColumn(KDbParseInfo* parseInfo, KDbExpression* columnExpr); 0172 0173 KDbQuerySchema* buildSelectQuery( 0174 KDbQuerySchema* querySchema, KDbNArgExpression* colViews, 0175 KDbNArgExpression* tablesList = nullptr, SelectOptionsInternal * options = nullptr); 0176 0177 extern KDbParser *globalParser; 0178 extern KDbField *globalField; 0179 0180 #endif