| 189 | } |
| 190 | |
| 191 | DsqlBatch* DsqlBatch::open(thread_db* tdbb, DsqlDmlRequest* req, IMessageMetadata* inMetadata, |
| 192 | unsigned parLength, const UCHAR* par) |
| 193 | { |
| 194 | SET_TDBB(tdbb); |
| 195 | Jrd::ContextPoolHolder context(tdbb, &req->getPool()); |
| 196 | |
| 197 | // Validate cursor or batch being not already open |
| 198 | |
| 199 | if (req->req_cursor) |
| 200 | { |
| 201 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-502) << |
| 202 | Arg::Gds(isc_dsql_cursor_open_err)); |
| 203 | } |
| 204 | |
| 205 | if (req->req_batch) |
| 206 | { |
| 207 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-502) << |
| 208 | Arg::Gds(isc_batch_open)); |
| 209 | } |
| 210 | |
| 211 | // Sanity checks before creating batch |
| 212 | |
| 213 | if (!req->getRequest()) |
| 214 | { |
| 215 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-504) << |
| 216 | Arg::Gds(isc_unprepared_stmt)); |
| 217 | } |
| 218 | |
| 219 | const auto statement = req->getDsqlStatement(); |
| 220 | |
| 221 | if (statement->getFlags() & DsqlStatement::FLAG_ORPHAN) |
| 222 | { |
| 223 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-901) << |
| 224 | Arg::Gds(isc_bad_req_handle)); |
| 225 | } |
| 226 | |
| 227 | switch (statement->getType()) |
| 228 | { |
| 229 | case DsqlStatement::TYPE_INSERT: |
| 230 | case DsqlStatement::TYPE_DELETE: |
| 231 | case DsqlStatement::TYPE_UPDATE: |
| 232 | case DsqlStatement::TYPE_EXEC_PROCEDURE: |
| 233 | case DsqlStatement::TYPE_EXEC_BLOCK: |
| 234 | break; |
| 235 | |
| 236 | default: |
| 237 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-901) << |
| 238 | Arg::Gds(isc_batch_type)); |
| 239 | } |
| 240 | |
| 241 | const dsql_msg* message = statement->getSendMsg(); |
| 242 | if (! (inMetadata && message && req->parseMetadata(inMetadata, message->msg_parameters))) |
| 243 | { |
| 244 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-901) << |
| 245 | Arg::Gds(isc_batch_param)); |
| 246 | } |
| 247 | |
| 248 | // Open reader for parameters block |
no test coverage detected