DSQL_prepare @brief Prepare a statement for execution. @param user_status @param trans_handle @param req_handle @param length @param string @param dialect @param item_length @param items @param buffer_length @param buffer **/
| 248 | |
| 249 | **/ |
| 250 | DsqlRequest* DSQL_prepare(thread_db* tdbb, |
| 251 | Attachment* attachment, jrd_tra* transaction, |
| 252 | ULONG length, const TEXT* string, USHORT dialect, unsigned prepareFlags, |
| 253 | Array<UCHAR>* items, Array<UCHAR>* buffer, |
| 254 | bool isInternalRequest) |
| 255 | { |
| 256 | SET_TDBB(tdbb); |
| 257 | |
| 258 | dsql_dbb* database = init(tdbb, attachment); |
| 259 | DsqlRequest* dsqlRequest = NULL; |
| 260 | |
| 261 | try |
| 262 | { |
| 263 | // Allocate a new request block and then prepare the request. |
| 264 | |
| 265 | dsqlRequest = safePrepareRequest(tdbb, database, transaction, length, string, dialect, |
| 266 | isInternalRequest); |
| 267 | |
| 268 | // Can not prepare a CREATE DATABASE/SCHEMA statement |
| 269 | |
| 270 | const auto statement = dsqlRequest->getDsqlStatement(); |
| 271 | if (statement->getType() == DsqlStatement::TYPE_CREATE_DB) |
| 272 | { |
| 273 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-530) << |
| 274 | Arg::Gds(isc_dsql_crdb_prepare_err)); |
| 275 | } |
| 276 | |
| 277 | if (items && buffer) |
| 278 | { |
| 279 | Jrd::ContextPoolHolder context(tdbb, &dsqlRequest->getPool()); |
| 280 | sql_info(tdbb, dsqlRequest, items->getCount(), items->begin(), |
| 281 | buffer->getCount(), buffer->begin()); |
| 282 | } |
| 283 | |
| 284 | return dsqlRequest; |
| 285 | } |
| 286 | catch (const Exception&) |
| 287 | { |
| 288 | if (dsqlRequest) |
| 289 | { |
| 290 | Jrd::ContextPoolHolder context(tdbb, &dsqlRequest->getPool()); |
| 291 | DsqlRequest::destroy(tdbb, dsqlRequest); |
| 292 | } |
| 293 | throw; |
| 294 | } |
| 295 | } |
| 296 | |
| 297 | |
| 298 | /** |
no test coverage detected