Bug Summary

File:home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx
Warning:line 307, column 48
Result of 'malloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type 'ISC_TIMESTAMP'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name Util.cxx -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib64/clang/11.0.0 -D BOOST_ERROR_CODE_HEADER_ONLY -D BOOST_SYSTEM_NO_DEPRECATED -D CPPU_ENV=gcc3 -D LINUX -D OSL_DEBUG_LEVEL=1 -D SAL_LOG_INFO -D SAL_LOG_WARN -D UNIX -D UNX -D X86_64 -D _PTHREADS -D _REENTRANT -D EXCEPTIONS_ON -D LIBO_INTERNAL_ONLY -I /home/maarten/src/libreoffice/core/connectivity/inc -I /home/maarten/src/libreoffice/core/connectivity/source/inc -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/firebird/gen/Debug/firebird/include -I /home/maarten/src/libreoffice/core/external/boost/include -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/boost -I /home/maarten/src/libreoffice/core/include -I /usr/lib/jvm/java-11-openjdk-11.0.9.10-0.0.ea.fc33.x86_64/include -I /usr/lib/jvm/java-11-openjdk-11.0.9.10-0.0.ea.fc33.x86_64/include/linux -I /home/maarten/src/libreoffice/core/config_host -I /home/maarten/src/libreoffice/core/workdir/UnoApiHeadersTarget/udkapi/normal -I /home/maarten/src/libreoffice/core/workdir/UnoApiHeadersTarget/offapi/normal -I /home/maarten/src/libreoffice/core/workdir/YaccTarget/connectivity/source/parse -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10 -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/x86_64-redhat-linux -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib64/clang/11.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O0 -Wno-missing-braces -std=c++17 -fdeprecated-macro -fdebug-compilation-dir /home/maarten/src/libreoffice/core -ferror-limit 19 -fvisibility hidden -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -debug-info-kind=constructor -analyzer-output=html -faddrsig -o /home/maarten/tmp/wis/scan-build-libreoffice/output/report/2020-10-07-141433-9725-1 -x c++ /home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#include "Util.hxx"
11#include <rtl/ustrbuf.hxx>
12#include <sal/log.hxx>
13
14#include <com/sun/star/sdbc/DataType.hpp>
15#include <com/sun/star/sdbc/SQLException.hpp>
16
17using namespace ::connectivity;
18
19using namespace ::com::sun::star;
20using namespace ::com::sun::star::sdbc;
21using namespace ::com::sun::star::uno;
22
23using namespace firebird;
24
25OUString firebird::sanitizeIdentifier(const OUString& rIdentifier)
26{
27 OUString sRet = rIdentifier.trim();
28 assert(sRet.getLength() <= 31)(static_cast <bool> (sRet.getLength() <= 31) ? void (
0) : __assert_fail ("sRet.getLength() <= 31", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 28, __extension__ __PRETTY_FUNCTION__))
; // Firebird identifiers cannot be longer than this.
29
30 return sRet;
31}
32
33OUString firebird::StatusVectorToString(const ISC_STATUS_ARRAY& rStatusVector,
34 const OUString& rCause)
35{
36 OUStringBuffer buf;
37 const ISC_STATUS* pStatus = reinterpret_cast<const ISC_STATUS*>(&rStatusVector);
38
39 buf.append("firebird_sdbc error:");
40 try
41 {
42 char msg[512]; // Size is based on suggestion in docs.
43 while(fb_interpret(msg, sizeof(msg), &pStatus))
44 {
45 // TODO: verify encoding
46 buf.append("\n*");
47 buf.append(OUString(msg, strlen(msg), RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
48 }
49 }
50 catch (...)
51 {
52 SAL_WARN("connectivity.firebird", "ignore fb_interpret exception")do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "connectivity.firebird")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "ignore fb_interpret exception"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"
), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "52" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "ignore fb_interpret exception"), 0); }
else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "ignore fb_interpret exception"; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "52" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "ignore fb_interpret exception") == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "52" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "ignore fb_interpret exception"), 0); }
else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "ignore fb_interpret exception"; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "52" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
53 }
54 buf.append("\ncaused by\n'").append(rCause).append("'\n");
55
56 OUString error = buf.makeStringAndClear();
57 SAL_WARN("connectivity.firebird", error)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "connectivity.firebird")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << error) == 1
) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"
), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "57" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << error), 0); } else { ::std::ostringstream
sal_detail_stream; sal_detail_stream << error; ::sal::
detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"
), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "57" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << error) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("connectivity.firebird"), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "57" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << error), 0); } else { ::std::ostringstream
sal_detail_stream; sal_detail_stream << error; ::sal::
detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"
), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "57" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
58 return error;
59}
60
61void firebird::evaluateStatusVector(const ISC_STATUS_ARRAY& rStatusVector,
62 const OUString& rCause,
63 const uno::Reference< XInterface >& _rxContext)
64{
65 if (IndicatesError(rStatusVector))
66 {
67 OUString error = StatusVectorToString(rStatusVector, rCause);
68 throw SQLException(error, _rxContext, OUString(), 1, Any());
69 }
70}
71
72static sal_Int32 lcl_getNumberType( short aType, NumberSubType aSubType )
73{
74 switch(aSubType)
75 {
76 case NumberSubType::Numeric:
77 return DataType::NUMERIC;
78 case NumberSubType::Decimal:
79 return DataType::DECIMAL;
80 default:
81 switch(aType)
82 {
83 case SQL_SHORT500:
84 return DataType::SMALLINT;
85 case SQL_LONG496:
86 return DataType::INTEGER;
87 case SQL_DOUBLE480:
88 return DataType::DOUBLE;
89 case SQL_INT64580:
90 return DataType::BIGINT;
91 default:
92 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 92, __extension__ __PRETTY_FUNCTION__))
; // not a number
93 return 0;
94 }
95 }
96}
97static sal_Int32 lcl_getCharColumnType( short aType, const OUString& sCharset )
98{
99 switch(aType)
100 {
101 case SQL_TEXT452:
102 if( sCharset == "OCTETS")
103 return DataType::BINARY;
104 else
105 return DataType::CHAR;
106 case SQL_VARYING448:
107 if( sCharset == "OCTETS")
108 return DataType::VARBINARY;
109 else
110 return DataType::VARCHAR;
111 default:
112 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 112, __extension__ __PRETTY_FUNCTION__))
;
113 return 0;
114 }
115}
116
117sal_Int32 firebird::ColumnTypeInfo::getSdbcType() const
118{
119 short aType = m_aType & ~1; // Remove last bit -- it is used to denote whether column
120 // can store Null, not needed for type determination
121 short aSubType = m_aSubType;
122 if( m_nScale > 0 )
123 {
124 // numeric / decimal
125 if(aType == SQL_SHORT500 || aType == SQL_LONG496 || aType == SQL_DOUBLE480
126 || aType == SQL_INT64580)
127 {
128 // if scale is set without subtype then imply numeric
129 if( static_cast<NumberSubType>(aSubType) == NumberSubType::Other )
130 aSubType = static_cast<short>(NumberSubType::Numeric);
131 }
132 }
133
134 switch (aType)
135 {
136 case SQL_TEXT452:
137 case SQL_VARYING448:
138 return lcl_getCharColumnType(aType, m_sCharsetName);
139 case SQL_SHORT500:
140 case SQL_LONG496:
141 case SQL_DOUBLE480:
142 case SQL_INT64580:
143 return lcl_getNumberType(aType, static_cast<NumberSubType>(aSubType) );
144 case SQL_FLOAT482:
145 return DataType::FLOAT;
146 case SQL_D_FLOAT530:
147 return DataType::DOUBLE;
148 case SQL_TIMESTAMP510:
149 return DataType::TIMESTAMP;
150 case SQL_BLOB520:
151 switch (static_cast<BlobSubtype>(aSubType))
152 {
153 case BlobSubtype::Blob:
154 return DataType::BLOB;
155 case BlobSubtype::Clob:
156 return DataType::CLOB;
157 case BlobSubtype::Image:
158 return DataType::LONGVARBINARY;
159 default:
160 SAL_WARN("connectivity.firebird", "Unknown subtype for Blob type: " << aSubType)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "connectivity.firebird")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "Unknown subtype for Blob type: "
<< aSubType) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("connectivity.firebird"), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "160" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Unknown subtype for Blob type: " <<
aSubType), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "Unknown subtype for Blob type: "
<< aSubType; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("connectivity.firebird"), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "160" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "Unknown subtype for Blob type: " << aSubType
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"
), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "160" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Unknown subtype for Blob type: " <<
aSubType), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "Unknown subtype for Blob type: "
<< aSubType; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("connectivity.firebird"), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "160" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
161 assert(!"Unknown subtype for Blob type")(static_cast <bool> (!"Unknown subtype for Blob type") ?
void (0) : __assert_fail ("!\"Unknown subtype for Blob type\""
, "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 161, __extension__ __PRETTY_FUNCTION__))
; // Should never happen
162 return 0;
163 }
164 case SQL_ARRAY540:
165 return DataType::ARRAY;
166 case SQL_TYPE_TIME560:
167 return DataType::TIME;
168 case SQL_TYPE_DATE570:
169 return DataType::DATE;
170 case SQL_NULL32766:
171 return DataType::SQLNULL;
172 case SQL_QUAD550: // Is a "Blob ID" according to the docs
173 return 0; // TODO: verify
174 case SQL_BOOLEAN32764:
175 return DataType::BOOLEAN;
176 default:
177 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 177, __extension__ __PRETTY_FUNCTION__))
; // Should never happen
178 return 0;
179 }
180}
181
182OUString firebird::ColumnTypeInfo::getColumnTypeName() const
183{
184 short aType = m_aType & ~1; // Remove last bit -- it is used to denote whether column
185 // can store Null, not needed for type determination
186
187 switch (aType)
188 {
189 case SQL_TEXT452:
190 return "SQL_TEXT";
191 case SQL_VARYING448:
192 return "SQL_VARYING";
193 case SQL_SHORT500:
194 return "SQL_SHORT";
195 case SQL_LONG496:
196 return "SQL_LONG";
197 case SQL_FLOAT482:
198 return "SQL_FLOAT";
199 case SQL_DOUBLE480:
200 return "SQL_DOUBLE";
201 case SQL_D_FLOAT530:
202 return "SQL_D_FLOAT";
203 case SQL_TIMESTAMP510:
204 return "SQL_TIMESTAMP";
205 case SQL_BLOB520:
206 return "SQL_BLOB";
207 case SQL_ARRAY540:
208 return "SQL_ARRAY";
209 case SQL_TYPE_TIME560:
210 return "SQL_TYPE_TIME";
211 case SQL_TYPE_DATE570:
212 return "SQL_TYPE_DATE";
213 case SQL_INT64580:
214 return "SQL_INT64";
215 case SQL_NULL32766:
216 return "SQL_NULL";
217 case SQL_QUAD550:
218 return "SQL_QUAD";
219 case SQL_BOOLEAN32764:
220 return "SQL_BOOLEAN";
221 default:
222 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 222, __extension__ __PRETTY_FUNCTION__))
; // Should never happen
223 return OUString();
224 }
225}
226
227short firebird::getFBTypeFromBlrType(short blrType)
228{
229 switch (blrType)
230 {
231 case blr_text(unsigned char)14:
232 return SQL_TEXT452;
233 case blr_text2(unsigned char)15:
234 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 234, __extension__ __PRETTY_FUNCTION__))
;
235 return 0; // No idea if this should be supported
236 case blr_varying(unsigned char)37:
237 return SQL_VARYING448;
238 case blr_varying2(unsigned char)38:
239 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 239, __extension__ __PRETTY_FUNCTION__))
;
240 return 0; // No idea if this should be supported
241 case blr_short(unsigned char)7:
242 return SQL_SHORT500;
243 case blr_long(unsigned char)8:
244 return SQL_LONG496;
245 case blr_float(unsigned char)10:
246 return SQL_FLOAT482;
247 case blr_double(unsigned char)27:
248 return SQL_DOUBLE480;
249 case blr_d_float(unsigned char)11:
250 return SQL_D_FLOAT530;
251 case blr_timestamp(unsigned char)35:
252 return SQL_TIMESTAMP510;
253 case blr_blob(unsigned short)261:
254 return SQL_BLOB520;
255// case blr_SQL_ARRAY:
256// return OUString("SQL_ARRAY");
257 case blr_sql_time(unsigned char)13:
258 return SQL_TYPE_TIME560;
259 case blr_sql_date(unsigned char)12:
260 return SQL_TYPE_DATE570;
261 case blr_int64(unsigned char)16:
262 return SQL_INT64580;
263// case SQL_NULL:
264// return OUString("SQL_NULL");
265 case blr_quad(unsigned char)9:
266 return SQL_QUAD550;
267 case blr_bool(unsigned char)23:
268 return SQL_BOOLEAN32764;
269 default:
270 // If this happens we have hit one of the extra types in ibase.h
271 // look up blr_* for a list, e.g. blr_domain_name, blr_not_nullable etc.
272 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 272, __extension__ __PRETTY_FUNCTION__))
;
273 return 0;
274 }
275}
276
277void firebird::mallocSQLVAR(XSQLDA* pSqlda)
278{
279 // TODO: confirm the sizings below.
280 XSQLVAR* pVar = pSqlda->sqlvar;
281 for (int i=0; i < pSqlda->sqld; i++, pVar++)
282 {
283 int dtype = (pVar->sqltype & ~1); /* drop flag bit for now */
284 switch(dtype) {
285 case SQL_TEXT452:
286 pVar->sqldata = static_cast<char *>(malloc(sizeof(char)*pVar->sqllen));
287 break;
288 case SQL_VARYING448:
289 pVar->sqldata = static_cast<char *>(malloc(sizeof(char)*pVar->sqllen + 2));
290 break;
291 case SQL_SHORT500:
292 pVar->sqldata = static_cast<char*>(malloc(sizeof(sal_Int16)));
293 break;
294 case SQL_LONG496:
295 pVar->sqldata = static_cast<char*>(malloc(sizeof(sal_Int32)));
296 break;
297 case SQL_FLOAT482:
298 pVar->sqldata = static_cast<char *>(malloc(sizeof(float)));
299 break;
300 case SQL_DOUBLE480:
301 pVar->sqldata = static_cast<char *>(malloc(sizeof(double)));
302 break;
303 case SQL_D_FLOAT530:
304 pVar->sqldata = static_cast<char *>(malloc(sizeof(double)));
305 break;
306 case SQL_TIMESTAMP510:
307 pVar->sqldata = static_cast<char*>(malloc(sizeof(ISC_TIMESTAMP)));
Result of 'malloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type 'ISC_TIMESTAMP'
308 break;
309 // an ARRAY is in fact a BLOB of a specialized type
310 // See https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-datatypes-bnrytypes.html#fblangref25-datatypes-array
311 case SQL_ARRAY540:
312 case SQL_BLOB520:
313 pVar->sqldata = static_cast<char*>(malloc(sizeof(ISC_QUAD)));
314 break;
315 case SQL_TYPE_TIME560:
316 pVar->sqldata = static_cast<char*>(malloc(sizeof(ISC_TIME)));
317 break;
318 case SQL_TYPE_DATE570:
319 pVar->sqldata = static_cast<char*>(malloc(sizeof(ISC_DATE)));
320 break;
321 case SQL_INT64580:
322 pVar->sqldata = static_cast<char *>(malloc(sizeof(sal_Int64)));
323 break;
324 case SQL_BOOLEAN32764:
325 pVar->sqldata = static_cast<char *>(malloc(sizeof(sal_Bool)));
326 break;
327 case SQL_NULL32766:
328 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 328, __extension__ __PRETTY_FUNCTION__))
; // TODO: implement
329 break;
330 case SQL_QUAD550:
331 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 331, __extension__ __PRETTY_FUNCTION__))
; // TODO: implement
332 break;
333 default:
334 SAL_WARN("connectivity.firebird", "Unknown type: " << dtype)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "connectivity.firebird")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "Unknown type: "
<< dtype) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("connectivity.firebird"), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "334" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Unknown type: " << dtype), 0); }
else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "Unknown type: " << dtype; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "334" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "Unknown type: " << dtype) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "334" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Unknown type: " << dtype), 0); }
else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "Unknown type: " << dtype; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "334" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
335 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 335, __extension__ __PRETTY_FUNCTION__))
;
336 break;
337 }
338 /* allocate variable to hold NULL status */
339 pVar->sqlind = static_cast<short *>(malloc(sizeof(short)));
340 }
341}
342
343void firebird::freeSQLVAR(XSQLDA* pSqlda)
344{
345 XSQLVAR* pVar = pSqlda->sqlvar;
346 for (int i=0; i < pSqlda->sqld; i++, pVar++)
347 {
348 int dtype = (pVar->sqltype & ~1); /* drop flag bit for now */
349 switch(dtype) {
350 case SQL_TEXT452:
351 case SQL_VARYING448:
352 case SQL_SHORT500:
353 case SQL_LONG496:
354 case SQL_FLOAT482:
355 case SQL_DOUBLE480:
356 case SQL_D_FLOAT530:
357 case SQL_TIMESTAMP510:
358 // an ARRAY is in fact a BLOB of a specialized type
359 // See https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-datatypes-bnrytypes.html#fblangref25-datatypes-array
360 case SQL_ARRAY540:
361 case SQL_BLOB520:
362 case SQL_INT64580:
363 case SQL_TYPE_TIME560:
364 case SQL_TYPE_DATE570:
365 case SQL_BOOLEAN32764:
366 if(pVar->sqldata)
367 {
368 free(pVar->sqldata);
369 pVar->sqldata = nullptr;
370 }
371 break;
372 case SQL_NULL32766:
373 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 373, __extension__ __PRETTY_FUNCTION__))
; // TODO: implement
374 break;
375 case SQL_QUAD550:
376 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
, 376, __extension__ __PRETTY_FUNCTION__))
; // TODO: implement
377 break;
378 default:
379 SAL_WARN("connectivity.firebird", "Unknown type: " << dtype)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "connectivity.firebird")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "Unknown type: "
<< dtype) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("connectivity.firebird"), ("/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "379" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Unknown type: " << dtype), 0); }
else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "Unknown type: " << dtype; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "379" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "Unknown type: " << dtype) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "379" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Unknown type: " << dtype), 0); }
else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "Unknown type: " << dtype; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("connectivity.firebird"), (
"/home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx"
":" "379" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
380// assert(false);
381 break;
382 }
383
384 if(pVar->sqlind)
385 {
386 free(pVar->sqlind);
387 pVar->sqlind = nullptr;
388 }
389 }
390}
391
392
393OUString firebird::escapeWith( const OUString& sText, const char aKey, const char aEscapeChar)
394{
395 OUString sRet(sText);
396 sal_Int32 aIndex = 0;
397 for (;;)
398 {
399 aIndex = sRet.indexOf(aKey, aIndex);
400 if ( aIndex <= 0 || aIndex >= sRet.getLength())
401 break;
402 sRet = sRet.replaceAt(aIndex, 1, OUStringChar(aEscapeChar) + OUStringChar(aKey) );
403 aIndex += 2;
404 }
405
406 return sRet;
407}
408
409sal_Int64 firebird::pow10Integer(int nDecimalCount)
410{
411 sal_Int64 nRet = 1;
412 for(int i=0; i< nDecimalCount; i++)
413 {
414 nRet *= 10;
415 }
416 return nRet;
417}
418/* vim:set shiftwidth=4 softtabstop=4 expandtab: */