MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / destroy

Method destroy

src/dsql/DsqlRequests.cpp:164–227  ·  view source on GitHub ↗

Release a dynamic request.

Source from the content-addressed store, hash-verified

162
163// Release a dynamic request.
164void DsqlRequest::destroy(thread_db* tdbb, DsqlRequest* dsqlRequest)
165{
166 SET_TDBB(tdbb);
167
168 if (dsqlRequest->req_timer)
169 {
170 dsqlRequest->req_timer->stop();
171 dsqlRequest->req_timer = nullptr;
172 }
173
174 // If request is parent, orphan the children and release a portion of their requests
175
176 for (auto childStatement : dsqlRequest->cursors)
177 {
178 childStatement->addFlags(DsqlStatement::FLAG_ORPHAN);
179 childStatement->setParentRequest(nullptr);
180 childStatement->setParentDbKey(nullptr);
181 childStatement->setParentRecVersion(nullptr);
182 dsqlRequest->req_dbb->dbb_statement_cache->removeStatement(tdbb, childStatement);
183
184 // hvlad: lines below is commented out as
185 // - child is already unlinked from its parent request
186 // - we should not free child's sql text until its owner request is alive
187 // It seems to me we should destroy owner request here, not a child
188 // statement - as it always was before
189
190 //Jrd::ContextPoolHolder context(tdbb, &childStatement->getPool());
191 //releaseStatement(childStatement);
192 }
193
194 // If the request had an open cursor, close it
195
196 if (dsqlRequest->req_cursor)
197 DsqlCursor::close(tdbb, dsqlRequest->req_cursor);
198
199 if (dsqlRequest->req_batch)
200 {
201 delete dsqlRequest->req_batch;
202 dsqlRequest->req_batch = nullptr;
203 }
204
205 Jrd::Attachment* att = dsqlRequest->req_dbb->dbb_attachment;
206 const bool need_trace_free = dsqlRequest->req_traced && TraceManager::need_dsql_free(att);
207 if (need_trace_free)
208 {
209 TraceSQLStatementImpl stmt(dsqlRequest, NULL);
210 TraceManager::event_dsql_free(att, &stmt, DSQL_drop);
211 }
212
213 if (dsqlRequest->req_cursor_name.hasData())
214 dsqlRequest->req_dbb->dbb_cursors.remove(dsqlRequest->req_cursor_name);
215
216 // If a request has been compiled, release it now
217 if (dsqlRequest->getRequest())
218 EXE_release(tdbb, dsqlRequest->getRequest());
219
220 // Increase the statement refCount so its pool is not destroyed before the request is gone.
221 auto dsqlStatement = dsqlRequest->getDsqlStatement();

Callers

nothing calls this directly

Calls 12

SET_TDBBFunction · 0.85
EXE_releaseFunction · 0.85
addFlagsMethod · 0.80
setParentRequestMethod · 0.80
setParentDbKeyMethod · 0.80
setParentRecVersionMethod · 0.80
removeStatementMethod · 0.80
stopMethod · 0.45
hasDataMethod · 0.45
removeMethod · 0.45
getRequestMethod · 0.45
getDsqlStatementMethod · 0.45

Tested by

no test coverage detected