KDb

PostgresqlDriver.h
1 /* This file is part of the KDE project
2  Copyright (C) 2003 Adam Pigg <[email protected]>
3  Copyright (C) 2010-2016 JarosÅ‚aw Staniek <[email protected]>
4 
5  This program is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License as published by the Free Software Foundation; either
8  version 2 of the License, or (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Library General Public License for more details.
14 
15  You should have received a copy of the GNU Library General Public License
16  along with this program; see the file COPYING. If not, write to
17  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19 */
20 
21 #ifndef KDB_POSTGRESQLDRIVER_H
22 #define KDB_POSTGRESQLDRIVER_H
23 
24 #include "KDbDriver.h"
25 
26 class KDbConnection;
27 
28 //! PostgreSQL database driver.
30 {
31  Q_OBJECT
32 
33 public:
34  PostgresqlDriver(QObject *parent, const QVariantList &args);
35 
36  ~PostgresqlDriver() override;
37 
38  //! @todo implement
39  bool isSystemObjectName(const QString& name) const override;
40 
41  bool isSystemDatabaseName(const QString& name) const override;
42 
43  //! Escape a string for use as a value
44  KDbEscapedString escapeString(const QString& str) const override;
45  KDbEscapedString escapeString(const QByteArray& str) const override;
46  //! Overrides the default implementation to allow for NUMERIC type natively
47  QString sqlTypeName(KDbField::Type type, const KDbField &field) const override;
48 
49  //! Escape BLOB value @a array
50  KDbEscapedString escapeBLOB(const QByteArray& array) const override;
51 
52  //! Converts information converted from PQfmod() to length. -1 if missing.
53  inline static int pqfmodToLength(int pqfmod) {
54  int len;
55  if (pqfmod > 0) {
56  const int PGSQL_VAR_HDRSZ = 4;
57  len = pqfmod - PGSQL_VAR_HDRSZ; //!< See e.g. postgis_get_char_length()
58  } else {
59  len = -1;
60  }
61  return len;
62  }
63 
64  //! Uses information obtained from PQfmod() and adjust type @a t if possible.
65  //! Also sets @a maxTextLength.
66  //! @todo using pqfmod not tested
67  //! @todo more types such as decimal
68  inline static KDbField::Type typeForSize(KDbField::Type t, int pqfmod, int *maxTextLength) {
69  KDbField::Type newType = t;
70  if (maxTextLength) {
71  *maxTextLength = -1;
72  }
73  if (t == KDbField::Integer) {
74  if (pqfmod == 1) {
75  newType = KDbField::Byte;
76  } else if (pqfmod == 2) {
77  newType = KDbField::ShortInteger;
78  } else if (pqfmod == 8) {
79  newType = KDbField::BigInteger;
80  }
81  } else if (t == KDbField::LongText) {
82  const int len = pqfmodToLength(pqfmod);
83  if (len > 0 && len <= 255) {
84  newType = KDbField::Text;
85  if (maxTextLength) {
86  *maxTextLength = len;
87  }
88  }
89  }
90  return newType;
91  }
92 
93  //! @return KDb field type for PostgreSQL type @a pqtype and modifier @a pqfmod.
94  //! If type cannot be found KDbField::InvalidType is returned.
95  //! Used in cursors to speed up data conversion.
96  inline KDbField::Type pgsqlToKDbType(int pqtype, int pqfmod, int *maxTextLength) const {
97  KDbField::Type t = m_pgsqlToKDbTypes.value(pqtype, KDbField::InvalidType);
98  return typeForSize(t, pqfmod, maxTextLength);
99  }
100 
101  //! Generates native (driver-specific) HEX() function call.
102  //! Uses UPPER(ENCODE(val, 'hex')).
103  //! See https://www.postgresql.org/docs/9.3/static/functions-string.html#FUNCTIONS-STRING-OTHER */
106  KDb::ExpressionCallStack* callStack) const override;
107 
108  //! Generates native (driver-specific) IFNULL() function call.
109  //! Uses COALESCE().
112  KDb::ExpressionCallStack* callStack) const override;
113 
114  //! Generates native (driver-specific) LENGTH() function call.
115  //! For text types default LENGTH(val) is used, for BLOBs OCTET_LENGTH(val) is used because
116  //! LENGTH(val) for BLOB returns number of bits.
119  KDb::ExpressionCallStack* callStack) const override;
120 
121  //! Generates native (driver-specific) GREATEST() and LEAST() function calls.
122  //! Since PostgreSQL's LEAST()/GREATEST() function ignores NULL values, it only returns NULL
123  //! if all the expressions evaluate to NULL. So this is used for F(v0,..,vN):
124  //! (CASE WHEN (v0) IS NULL OR .. OR (vN) IS NULL THEN NULL ELSE F(v0,..,vN) END)
125  //! where F == GREATEST or LEAST.
127  const KDbNArgExpression &args,
129  KDb::ExpressionCallStack* callStack) const override;
130 
131  //! Generates native (driver-specific) UNICODE() function call.
132  //! Uses ASCII(X).
135  KDb::ExpressionCallStack* callStack) const override;
136 
137 protected:
138  QString drv_escapeIdentifier(const QString& str) const override;
139  QByteArray drv_escapeIdentifier(const QByteArray& str) const override;
141  const KDbConnectionOptions &options) override;
142  bool drv_isSystemFieldName(const QString& name)const override;
143 
144 private:
145  void initPgsqlToKDbMap();
146 
147  static const char *m_keywords[];
148  QMap<int, KDbField::Type> m_pgsqlToKDbTypes;
150 };
151 
152 #endif // KDB_DRIVER_POSTGRESQLDRIVER_H
KDbEscapedString hexFunctionToString(const KDbNArgExpression &args, KDbQuerySchemaParameterValueListIterator *params, KDb::ExpressionCallStack *callStack) const override
Generates native (driver-specific) HEX() function call.
Q_OBJECTQ_OBJECT
static int pqfmodToLength(int pqfmod)
Converts information converted from PQfmod() to length. -1 if missing.
QString drv_escapeIdentifier(const QString &str) const override
An iterator for a list of values of query schema parameters Allows to iterate over parameters and ret...
@ InvalidType
Definition: KDbField.h:86
const T value(const Key &key, const T &defaultValue) const const
@ Text
Definition: KDbField.h:98
KDbEscapedString escapeBLOB(const QByteArray &array) const override
Escape BLOB value array.
Specialized string for escaping.
Database driver's abstraction.
Definition: KDbDriver.h:49
bool isSystemDatabaseName(const QString &name) const override
KDbEscapedString lengthFunctionToString(const KDbNArgExpression &args, KDbQuerySchemaParameterValueListIterator *params, KDb::ExpressionCallStack *callStack) const override
Generates native (driver-specific) LENGTH() function call.
QString sqlTypeName(KDbField::Type type, const KDbField &field) const override
Overrides the default implementation to allow for NUMERIC type natively.
static KDbField::Type typeForSize(KDbField::Type t, int pqfmod, int *maxTextLength)
Uses information obtained from PQfmod() and adjust type t if possible.
@ Integer
Definition: KDbField.h:90
KDbConnection * drv_createConnection(const KDbConnectionData &connData, const KDbConnectionOptions &options) override
@ BigInteger
Definition: KDbField.h:91
@ LongText
Definition: KDbField.h:99
@ Byte
Definition: KDbField.h:87
KDbEscapedString unicodeFunctionToString(const KDbNArgExpression &args, KDbQuerySchemaParameterValueListIterator *params, KDb::ExpressionCallStack *callStack) const override
Generates native (driver-specific) UNICODE() function call.
The KDbNArgExpression class represents a base class N-argument expression.
PostgresqlDriver(QObject *parent, const QVariantList &args)
KDbEscapedString greatestOrLeastFunctionToString(const QString &name, const KDbNArgExpression &args, KDbQuerySchemaParameterValueListIterator *params, KDb::ExpressionCallStack *callStack) const override
Generates native (driver-specific) GREATEST() and LEAST() function calls.
KDbEscapedString escapeString(const QString &str) const override
Escape a string for use as a value.
KDbField::Type pgsqlToKDbType(int pqtype, int pqfmod, int *maxTextLength) const
Database specific connection data, e.g. host, port.
Generic options for a single connection. The options are accessible using key/value pairs....
bool isSystemObjectName(const QString &name) const override
Meta-data for a field.
Definition: KDbField.h:71
KDbEscapedString ifnullFunctionToString(const KDbNArgExpression &args, KDbQuerySchemaParameterValueListIterator *params, KDb::ExpressionCallStack *callStack) const override
Generates native (driver-specific) IFNULL() function call.
Provides database connection, allowing queries and data modification.
Definition: KDbConnection.h:51
PostgreSQL database driver.
Q_DISABLE_COPY(Class)
bool drv_isSystemFieldName(const QString &name) const override
@ ShortInteger
Definition: KDbField.h:89
QObject * parent() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sat Dec 2 2023 04:11:42 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.