author | František Kučera <franta-hg@frantovo.cz> |
Thu, 04 Jun 2020 13:24:17 +0200 | |
branch | v_0 |
changeset 48 | c83119110c7b |
parent 43 | 7f396cdb9628 |
child 53 | cc6ffeba0fe5 |
permissions | -rw-r--r-- |
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
1 |
/** |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
2 |
* Relational pipes |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
3 |
* Copyright © 2020 František Kučera (Frantovo.cz, GlobalCode.info) |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
4 |
* |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
5 |
* This program is free software: you can redistribute it and/or modify |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
6 |
* it under the terms of the GNU General Public License as published by |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
7 |
* the Free Software Foundation, version 3. |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
8 |
* |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
9 |
* This program is distributed in the hope that it will be useful, |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
12 |
* GNU General Public License for more details. |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
13 |
* |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
14 |
* You should have received a copy of the GNU General Public License |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
15 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
16 |
*/ |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
17 |
|
43
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
18 |
#include <sstream> |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
19 |
#include <algorithm> |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
20 |
|
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
21 |
#include <sql.h> |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
22 |
#include <sqlext.h> |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
23 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
24 |
#include "ResultSet.h" |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
25 |
#include "OdbcCommon.h" |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
26 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
27 |
namespace relpipe { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
28 |
namespace tr { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
29 |
namespace sql { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
30 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
31 |
ResultSet::ResultSet(void* statement) : statement(statement) { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
32 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
33 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
34 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
35 |
ResultSet::~ResultSet() { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
36 |
// freeHandle() is called in ~PreparedStatement() |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
37 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
38 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
39 |
bool ResultSet::next() { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
40 |
SQLRETURN result = SQLFetch(statement); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
41 |
if (OdbcCommon::isSuccessful(result)) return true; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
42 |
else if (result == SQL_NO_DATA) return false; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
43 |
else throw SqlException(L"Unable to fetch next record", result, SQL_HANDLE_STMT, statement); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
44 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
45 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
46 |
relpipe::writer::boolean_t ResultSet::getBoolean(unsigned short columnNumber, bool* isNull) { |
48
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
47 |
relpipe::writer::string_t s = getString(columnNumber, isNull); |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
48 |
if (isNull && *isNull) return false; |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
49 |
else if (s == L"1" || s == L"true" || s == L"y" || s == L"yes" || s == L"TRUE" || s == L"Y" || s == L"YES") return true; |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
50 |
else if (s == L"0" || s == L"false" || s == L"n" || s == L"no" || s == L"FALSE" || s == L"N" || s == L"NO") return false; |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
51 |
else throw SqlException(L"Unable to parse „" + s + L"“ as boolean"); |
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
52 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
53 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
54 |
relpipe::writer::integer_t ResultSet::getInteger(unsigned short columnNumber, bool* isNull) { |
48
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
55 |
// TODO: get integer directly from SQLGetData() without string conversion |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
56 |
relpipe::writer::string_t s = getString(columnNumber, isNull); |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
57 |
if (isNull && *isNull) return 0; |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
58 |
else return std::stol(s); |
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
59 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
60 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
61 |
relpipe::writer::string_t ResultSet::getString(unsigned short columnNumber, bool* isNull) { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
62 |
SQLCHAR uselessBuffer; // just to get stringLength – ODBC does not eat nullptr |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
63 |
SQLLEN stringLength = -1; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
64 |
SQLRETURN result = SQLGetData(statement, columnNumber, SQL_C_CHAR, &uselessBuffer, 0, &stringLength); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
65 |
if (isNull) *isNull = stringLength == SQL_NULL_DATA; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
66 |
if (stringLength == SQL_NULL_DATA) { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
67 |
return L""; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
68 |
} else if (stringLength >= 0) { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
69 |
std::string value; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
70 |
value.reserve(stringLength); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
71 |
result = SQLGetData(statement, columnNumber, SQL_C_CHAR, (SQLCHAR*) value.c_str(), value.capacity() + 1, &stringLength); // trailing null byte = + 1 |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
72 |
if (OdbcCommon::isSuccessful(result)) return convertor.from_bytes(value.c_str()); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
73 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
74 |
throw SqlException(L"Unable to get string value", result, SQL_HANDLE_STMT, statement); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
75 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
76 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
77 |
ResultSet::MetaData* ResultSet::getMetaData() { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
78 |
SQLRETURN result; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
79 |
SQLSMALLINT columnCount; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
80 |
std::vector<ResultSet::MetaData::ColumnDescriptor> columnDescriptors; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
81 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
82 |
result = SQLNumResultCols(statement, &columnCount); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
83 |
if (OdbcCommon::isNotSuccessful(result)) throw SqlException(L"Unable to get column count", result, SQL_HANDLE_STMT, statement); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
84 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
85 |
for (SQLSMALLINT columnNumber = 1; columnNumber <= columnCount; columnNumber++) { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
86 |
ResultSet::MetaData::ColumnDescriptor columnDescriptor; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
87 |
std::string nameBuffer; // TODO: use rather vector<char> instead of string.c_str()? |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
88 |
nameBuffer.reserve(100); // TODO: max column name length? |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
89 |
SQLSMALLINT nameLength; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
90 |
SQLSMALLINT dataType; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
91 |
SQLULEN columnSize; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
92 |
SQLSMALLINT decimalDigits; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
93 |
SQLSMALLINT nullable; |
48
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
94 |
|
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
95 |
result = SQLDescribeCol(statement, columnNumber, (SQLCHAR*) nameBuffer.c_str(), nameBuffer.capacity(), &nameLength, &dataType, &columnSize, &decimalDigits, &nullable); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
96 |
if (OdbcCommon::isNotSuccessful(result)) throw SqlException(L"Unable describe column", result, SQL_HANDLE_STMT, statement); |
48
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
97 |
|
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
98 |
columnDescriptor.name = convertor.from_bytes(nameBuffer.c_str()); |
48
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
99 |
|
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
100 |
if (dataType == SQL_INTEGER || dataType == SQL_BIGINT) columnDescriptor.type = relpipe::writer::TypeId::INTEGER; |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
101 |
else if (dataType == SQL_BIT) columnDescriptor.type = relpipe::writer::TypeId::BOOLEAN; |
c83119110c7b
support also boolean and integer data types, do not treat everything as mere strings
František Kučera <franta-hg@frantovo.cz>
parents:
43
diff
changeset
|
102 |
|
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
103 |
columnDescriptors.emplace_back(columnDescriptor); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
104 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
105 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
106 |
return new MetaData(columnCount, columnDescriptors); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
107 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
108 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
109 |
ResultSet::MetaData::MetaData(unsigned short columnCount, std::vector<ColumnDescriptor> columnDescriptors) : columnCount(columnCount), columnDescriptors(columnDescriptors) { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
110 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
111 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
112 |
ResultSet::MetaData::~MetaData() { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
113 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
114 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
115 |
unsigned short ResultSet::MetaData::getColumnCount() { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
116 |
return columnCount; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
117 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
118 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
119 |
ResultSet::MetaData::ColumnDescriptor ResultSet::MetaData::describeColumn(unsigned short columnNumber) { |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
120 |
if (columnNumber >= 1 && columnNumber <= columnCount) return columnDescriptors[columnNumber - 1]; |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
121 |
else throw SqlException(L"Unable to describe column " + std::to_wstring(columnNumber) + L", out of bounds, column count is " + std::to_wstring(columnCount)); |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
122 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
123 |
|
43
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
124 |
SQLUSMALLINT ResultSet::MetaData::getColumnNumber(relpipe::writer::string_t columnName) { |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
125 |
// TODO: also case insensitive mode |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
126 |
for (SQLUSMALLINT i = 0; i < columnDescriptors.size(); i++) { |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
127 |
if (columnDescriptors[i].name == columnName) return i + 1; |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
128 |
} |
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
129 |
|
43
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
130 |
std::wstringstream errorMessage; |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
131 |
errorMessage << L"Unable to find column with name „" << columnName.c_str() << L"“ Availalable columns are: "; |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
132 |
for (MetaData::ColumnDescriptor cd : columnDescriptors) errorMessage << L"„" << cd.name.c_str() << L"“ "; |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
133 |
throw SqlException(errorMessage.str()); |
7f396cdb9628
getTablePrivileges() finds columns by names instead of numbers
František Kučera <franta-hg@frantovo.cz>
parents:
36
diff
changeset
|
134 |
} |
36
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
135 |
|
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
136 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
137 |
} |
91cb012d779a
use ODBC, avoid direct dependency on SQLite
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
138 |
} |