File: | home/maarten/src/libreoffice/core/connectivity/source/drivers/firebird/Util.cxx |
Warning: | line 325, column 49 Result of 'malloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type 'sal_Bool' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
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 | |
17 | using namespace ::connectivity; |
18 | |
19 | using namespace ::com::sun::star; |
20 | using namespace ::com::sun::star::sdbc; |
21 | using namespace ::com::sun::star::uno; |
22 | |
23 | using namespace firebird; |
24 | |
25 | OUString 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 | |
33 | OUString 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 | |
61 | void 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 | |
72 | static 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 | } |
97 | static 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 | |
117 | sal_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 | |
182 | OUString 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 | |
227 | short 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 | |
277 | void 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))); |
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))); |
Result of 'malloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type '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 | |
343 | void 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 | |
393 | OUString 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 | |
409 | sal_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: */ |