Skip to content

Commit 24ee4c0

Browse files
committed
Work in progress (batch for single trivial message executes)
1 parent 46fce3c commit 24ee4c0

File tree

12 files changed

+93
-62
lines changed

12 files changed

+93
-62
lines changed

examples/interfaces/11.batch.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ int main()
7474

7575
// create batch
7676
const char* sqlStmt = "insert into country values(?, ?)";
77-
batch = att->createBatch(&status, 0, sqlStmt, SAMPLES_DIALECT, msg.getMetadata(), 0, NULL);
77+
batch = att->createBatch(&status, tra, 0, sqlStmt, SAMPLES_DIALECT, msg.getMetadata(), 0, NULL);
7878

7979
// fill batch with data
8080
msg->country.set("Lemonia");

src/dsql/DsqlBatch.cpp

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include "../jrd/EngineInterface.h"
2828
#include "../jrd/jrd.h"
29+
#include "../jrd/status.h"
2930
#include "../jrd/exe_proto.h"
3031
#include "../dsql/dsql.h"
3132
#include "../dsql/errd_proto.h"
@@ -34,15 +35,19 @@
3435
using namespace Firebird;
3536
using namespace Jrd;
3637

37-
DsqlBatch::DsqlBatch(dsql_req* req, const dsql_msg* /*message*/, ClumpletReader& pb)
38-
: m_request(req), m_batch(NULL),
38+
DsqlBatch::DsqlBatch(dsql_req* req, const dsql_msg* /*message*/, IMessageMetadata* inMeta, ClumpletReader& pb)
39+
: m_request(req),
40+
m_batch(NULL),
41+
m_meta(inMeta),
3942
m_messages(req->getPool()),
4043
m_blobs(req->getPool()),
4144
m_messageSize(0),
4245
m_flags(0),
4346
m_bufferSize(10 * 1024 * 1024)
4447
{
45-
m_messageSize = req->getStatement()->getSendMsg()->msg_length;
48+
FbLocalStatus st;
49+
m_messageSize = inMeta->getMessageLength(&st);
50+
check(&st);
4651

4752
for (pb.rewind(); !pb.isEof(); pb.moveNext())
4853
{
@@ -76,13 +81,10 @@ DsqlBatch::~DsqlBatch()
7681
{
7782
if (m_batch)
7883
m_batch->resetHandle();
84+
if (m_request)
85+
m_request->req_batch = NULL;
7986
}
80-
/*
81-
jrd_tra* DsqlBatch::getTransaction() const
82-
{
83-
return m_request->req_transaction;
84-
}
85-
*/
87+
8688
Attachment* DsqlBatch::getAttachment() const
8789
{
8890
return m_request->req_dbb->dbb_attachment;
@@ -159,7 +161,7 @@ DsqlBatch* DsqlBatch::open(thread_db* tdbb, dsql_req* req, IMessageMetadata* inM
159161

160162
// Create batch
161163

162-
DsqlBatch* b = FB_NEW_POOL(req->getPool()) DsqlBatch(req, message, pb);
164+
DsqlBatch* b = FB_NEW_POOL(req->getPool()) DsqlBatch(req, message, inMetadata, pb);
163165
req->req_batch = b;
164166
return b;
165167
}
@@ -208,21 +210,23 @@ Firebird::IBatchCompletionState* DsqlBatch::execute(thread_db* tdbb)
208210
EXE_start(tdbb, m_request->req_request, transaction);
209211

210212
const dsql_msg* message = m_request->getStatement()->getSendMsg();
211-
fb_assert(message->msg_length == m_messageSize);
212213
unsigned remains;
213-
UCHAR* data;
214+
const UCHAR* data;
214215
while ((remains = m_messages.get(&data)) > 0)
215216
{
216217
while (remains >= m_messageSize)
217218
{
218219
// todo - translate blob IDs here
219220

220-
EXE_send(tdbb, m_request->req_request, message->msg_number, m_messageSize, data);
221+
m_request->mapInOut(tdbb, false, message, m_meta, NULL, data);
222+
UCHAR* msgBuffer = m_request->req_msg_buffers[message->msg_buffer_number];
223+
EXE_send(tdbb, m_request->req_request, message->msg_number, message->msg_length, msgBuffer);
221224

222225
data += m_messageSize;
223226
remains -= m_messageSize;
224227
}
225-
m_messages.remained(remains);
228+
if (remains)
229+
m_messages.remained(remains);
226230
}
227231

228232
return NULL;
@@ -241,17 +245,30 @@ void DsqlBatch::DataCache::setBuf(FB_UINT64 size)
241245

242246
void DsqlBatch::DataCache::put(const void* data, unsigned dataSize)
243247
{
244-
if (m_used + dataSize + m_cache.getCount() > m_limit)
248+
if (m_used + dataSize > m_limit)
245249
ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) <<
246250
Arg::Gds(isc_random) << "Internal buffer overflow - batch too big");
247251

248252
m_cache.append(reinterpret_cast<const UCHAR*>(data), dataSize);
253+
m_used += dataSize;
249254
}
250255

251-
unsigned DsqlBatch::DataCache::get(UCHAR** buffer)
256+
unsigned DsqlBatch::DataCache::get(const UCHAR** buffer)
252257
{
253-
*buffer = m_cache.begin();
254-
return m_cache.getCount();
258+
if (!m_used)
259+
{
260+
*buffer = nullptr;
261+
return 0;
262+
}
263+
264+
if (m_used <= m_cache.getCount())
265+
{
266+
m_used = 0;
267+
*buffer = m_cache.begin();
268+
return m_cache.getCount();
269+
}
270+
271+
fb_assert(false);
255272
}
256273

257274
void DsqlBatch::DataCache::remained(unsigned size)

src/dsql/DsqlBatch.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#include "../jrd/TempSpace.h"
2727
#include "../common/classes/alloc.h"
28+
#include "../common/classes/RefCounted.h"
2829

2930

3031
namespace Firebird {
@@ -45,12 +46,14 @@ class Attachment;
4546
class DsqlBatch
4647
{
4748
public:
48-
DsqlBatch(dsql_req* req, const dsql_msg* message, Firebird::ClumpletReader& pb);
49+
DsqlBatch(dsql_req* req, const dsql_msg* message, Firebird::IMessageMetadata* inMetadata,
50+
Firebird::ClumpletReader& pb);
4951
~DsqlBatch();
5052

5153
static const unsigned RAM_BATCH = 128 * 1024;
5254

53-
static DsqlBatch* open(thread_db* tdbb, dsql_req* req, Firebird::IMessageMetadata* inMetadata, unsigned parLength, const UCHAR* par);
55+
static DsqlBatch* open(thread_db* tdbb, dsql_req* req, Firebird::IMessageMetadata* inMetadata,
56+
unsigned parLength, const UCHAR* par);
5457

5558
Attachment* getAttachment() const;
5659
void setInterfacePtr(JBatch* interfacePtr) throw();
@@ -66,6 +69,7 @@ class DsqlBatch
6669
private:
6770
dsql_req* const m_request;
6871
JBatch* m_batch;
72+
Firebird::RefPtr<Firebird::IMessageMetadata> m_meta;
6973

7074
class DataCache : public Firebird::PermanentStorage
7175
{
@@ -78,7 +82,7 @@ class DsqlBatch
7882
void setBuf(FB_UINT64 size);
7983

8084
void put(const void* data, unsigned dataSize);
81-
unsigned get(UCHAR** buffer);
85+
unsigned get(const UCHAR** buffer);
8286
void remained(unsigned size);
8387
void clear();
8488

src/dsql/dsql.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ using namespace Firebird;
8080

8181
static ULONG get_request_info(thread_db*, dsql_req*, ULONG, UCHAR*);
8282
static dsql_dbb* init(Jrd::thread_db*, Jrd::Attachment*);
83-
static void map_in_out(Jrd::thread_db*, dsql_req*, bool, const dsql_msg*, IMessageMetadata*, UCHAR*,
84-
const UCHAR* = NULL);
8583
static dsql_req* prepareRequest(thread_db*, dsql_dbb*, jrd_tra*, ULONG, const TEXT*, USHORT, bool);
8684
static dsql_req* prepareStatement(thread_db*, dsql_dbb*, jrd_tra*, ULONG, const TEXT*, USHORT, bool);
8785
static UCHAR* put_item(UCHAR, const USHORT, const UCHAR*, UCHAR*, const UCHAR* const);
@@ -302,7 +300,7 @@ bool DsqlDmlRequest::fetch(thread_db* tdbb, UCHAR* msgBuffer)
302300
return false;
303301
}
304302

305-
map_in_out(tdbb, this, true, message, delayedFormat, msgBuffer);
303+
mapInOut(tdbb, true, message, delayedFormat, msgBuffer);
306304
delayedFormat = NULL;
307305

308306
trace.fetch(false, ITracePlugin::RESULT_SUCCESS);
@@ -686,9 +684,9 @@ void DsqlDmlRequest::execute(thread_db* tdbb, jrd_tra** traHandle,
686684

687685
const dsql_msg* message = statement->getSendMsg();
688686
if (message)
689-
map_in_out(tdbb, this, false, message, inMetadata, NULL, inMsg);
687+
mapInOut(tdbb, false, message, inMetadata, NULL, inMsg);
690688

691-
// we need to map_in_out before tracing of execution start to let trace
689+
// we need to mapInOut() before tracing of execution start to let trace
692690
// manager know statement parameters values
693691
TraceDSQLExecute trace(req_dbb->dbb_attachment, this);
694692

@@ -749,7 +747,7 @@ void DsqlDmlRequest::execute(thread_db* tdbb, jrd_tra** traHandle,
749747
JRD_receive(tdbb, req_request, message->msg_number, message->msg_length, msgBuffer);
750748

751749
if (outMsg)
752-
map_in_out(tdbb, this, true, message, NULL, outMsg);
750+
mapInOut(tdbb, true, message, NULL, outMsg);
753751

754752
// if this is a singleton select, make sure there's in fact one record
755753

@@ -1019,7 +1017,7 @@ static dsql_dbb* init(thread_db* tdbb, Jrd::Attachment* attachment)
10191017

10201018
/**
10211019
1022-
map_in_out
1020+
mapInOut
10231021
10241022
@brief Map data from external world into message or
10251023
from message to external world.
@@ -1033,10 +1031,10 @@ static dsql_dbb* init(thread_db* tdbb, Jrd::Attachment* attachment)
10331031
@param in_dsql_msg_buf
10341032
10351033
**/
1036-
static void map_in_out(thread_db* tdbb, dsql_req* request, bool toExternal, const dsql_msg* message,
1034+
void dsql_req::mapInOut(thread_db* tdbb, bool toExternal, const dsql_msg* message,
10371035
IMessageMetadata* meta, UCHAR* dsql_msg_buf, const UCHAR* in_dsql_msg_buf)
10381036
{
1039-
USHORT count = request->parseMetadata(meta, message->msg_parameters);
1037+
USHORT count = parseMetadata(meta, message->msg_parameters);
10401038

10411039
// Sanity check
10421040

@@ -1071,7 +1069,7 @@ static void map_in_out(thread_db* tdbb, dsql_req* request, bool toExternal, cons
10711069
// Make sure the message given to us is long enough
10721070

10731071
dsc desc;
1074-
if (!request->req_user_descs.get(parameter, desc))
1072+
if (!req_user_descs.get(parameter, desc))
10751073
desc.clear();
10761074

10771075
/***
@@ -1089,14 +1087,14 @@ static void map_in_out(thread_db* tdbb, dsql_req* request, bool toExternal, cons
10891087
Arg::Gds(isc_dsql_sqlvar_index) << Arg::Num(parameter->par_index-1));
10901088
}
10911089

1092-
UCHAR* msgBuffer = request->req_msg_buffers[parameter->par_message->msg_buffer_number];
1090+
UCHAR* msgBuffer = req_msg_buffers[parameter->par_message->msg_buffer_number];
10931091

10941092
SSHORT* flag = NULL;
10951093
dsql_par* const null_ind = parameter->par_null;
10961094
if (null_ind != NULL)
10971095
{
10981096
dsc userNullDesc;
1099-
if (!request->req_user_descs.get(null_ind, userNullDesc))
1097+
if (!req_user_descs.get(null_ind, userNullDesc))
11001098
userNullDesc.clear();
11011099

11021100
const ULONG null_offset = (IPTR) userNullDesc.dsc_address;
@@ -1159,7 +1157,7 @@ static void map_in_out(thread_db* tdbb, dsql_req* request, bool toExternal, cons
11591157
Arg::Gds(isc_dsql_wrong_param_num) << Arg::Num(count) <<Arg::Num(count2));
11601158
}
11611159

1162-
const DsqlCompiledStatement* statement = request->getStatement();
1160+
const DsqlCompiledStatement* statement = getStatement();
11631161
const dsql_par* parameter;
11641162

11651163
const dsql_par* dbkey;
@@ -1168,7 +1166,7 @@ static void map_in_out(thread_db* tdbb, dsql_req* request, bool toExternal, cons
11681166
{
11691167
UCHAR* parentMsgBuffer = statement->getParentRequest() ?
11701168
statement->getParentRequest()->req_msg_buffers[dbkey->par_message->msg_buffer_number] : NULL;
1171-
UCHAR* msgBuffer = request->req_msg_buffers[parameter->par_message->msg_buffer_number];
1169+
UCHAR* msgBuffer = req_msg_buffers[parameter->par_message->msg_buffer_number];
11721170

11731171
fb_assert(parentMsgBuffer);
11741172

@@ -1198,7 +1196,7 @@ static void map_in_out(thread_db* tdbb, dsql_req* request, bool toExternal, cons
11981196
UCHAR* parentMsgBuffer = statement->getParentRequest() ?
11991197
statement->getParentRequest()->req_msg_buffers[rec_version->par_message->msg_buffer_number] :
12001198
NULL;
1201-
UCHAR* msgBuffer = request->req_msg_buffers[parameter->par_message->msg_buffer_number];
1199+
UCHAR* msgBuffer = req_msg_buffers[parameter->par_message->msg_buffer_number];
12021200

12031201
fb_assert(parentMsgBuffer);
12041202

@@ -1225,7 +1223,7 @@ static void map_in_out(thread_db* tdbb, dsql_req* request, bool toExternal, cons
12251223

12261224
/**
12271225
1228-
parse_metadata
1226+
parseMetadata
12291227
12301228
@brief Parse the message of a request.
12311229

src/dsql/dsql.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,8 @@ class dsql_req : public pool_alloc<dsql_type_req>
572572
TimeoutTimer* setupTimer(thread_db* tdbb);
573573

574574
USHORT parseMetadata(Firebird::IMessageMetadata* meta, const Firebird::Array<dsql_par*>& parameters_list);
575+
void mapInOut(Jrd::thread_db* tdbb, bool toExternal, const dsql_msg* message, Firebird::IMessageMetadata* meta,
576+
UCHAR* dsql_msg_buf, const UCHAR* in_dsql_msg_buf = NULL);
575577

576578
static void destroy(thread_db* tdbb, dsql_req* request, bool drop);
577579

src/include/firebird/FirebirdInterface.idl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,8 +586,8 @@ version: // 3.0 => 4.0
586586
void setStatementTimeout(Status status, uint timeOut);
587587

588588
// Batch API
589-
Batch createBatch(Status status, uint stmtLength, const string sqlStmt, uint dialect,
590-
MessageMetadata inMetadata, uint parLength, const uchar* par);
589+
Batch createBatch(Status status, Transaction transaction, uint stmtLength, const string sqlStmt,
590+
uint dialect, MessageMetadata inMetadata, uint parLength, const uchar* par);
591591
/* Pipe createPipe(Status status, uint stmtLength, const string sqlStmt, uint dialect,
592592
Transaction transaction, MessageMetadata inMetadata, void* inBuffer,
593593
MessageMetadata outMetadata, uint parLength, const uchar* par);*/

src/include/firebird/IdlFbInterfaces.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,7 +2060,7 @@ namespace Firebird
20602060
void (CLOOP_CARG *setIdleTimeout)(IAttachment* self, IStatus* status, unsigned timeOut) throw();
20612061
unsigned (CLOOP_CARG *getStatementTimeout)(IAttachment* self, IStatus* status) throw();
20622062
void (CLOOP_CARG *setStatementTimeout)(IAttachment* self, IStatus* status, unsigned timeOut) throw();
2063-
IBatch* (CLOOP_CARG *createBatch)(IAttachment* self, IStatus* status, unsigned stmtLength, const char* sqlStmt, unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par) throw();
2063+
IBatch* (CLOOP_CARG *createBatch)(IAttachment* self, IStatus* status, ITransaction* transaction, unsigned stmtLength, const char* sqlStmt, unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par) throw();
20642064
};
20652065

20662066
protected:
@@ -2266,7 +2266,7 @@ namespace Firebird
22662266
StatusType::checkException(status);
22672267
}
22682268

2269-
template <typename StatusType> IBatch* createBatch(StatusType* status, unsigned stmtLength, const char* sqlStmt, unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par)
2269+
template <typename StatusType> IBatch* createBatch(StatusType* status, ITransaction* transaction, unsigned stmtLength, const char* sqlStmt, unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par)
22702270
{
22712271
if (cloopVTable->version < 4)
22722272
{
@@ -2275,7 +2275,7 @@ namespace Firebird
22752275
return 0;
22762276
}
22772277
StatusType::clearException(status);
2278-
IBatch* ret = static_cast<VTable*>(this->cloopVTable)->createBatch(this, status, stmtLength, sqlStmt, dialect, inMetadata, parLength, par);
2278+
IBatch* ret = static_cast<VTable*>(this->cloopVTable)->createBatch(this, status, transaction, stmtLength, sqlStmt, dialect, inMetadata, parLength, par);
22792279
StatusType::checkException(status);
22802280
return ret;
22812281
}
@@ -9764,13 +9764,13 @@ namespace Firebird
97649764
}
97659765
}
97669766

9767-
static IBatch* CLOOP_CARG cloopcreateBatchDispatcher(IAttachment* self, IStatus* status, unsigned stmtLength, const char* sqlStmt, unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par) throw()
9767+
static IBatch* CLOOP_CARG cloopcreateBatchDispatcher(IAttachment* self, IStatus* status, ITransaction* transaction, unsigned stmtLength, const char* sqlStmt, unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par) throw()
97689768
{
97699769
StatusType status2(status);
97709770

97719771
try
97729772
{
9773-
return static_cast<Name*>(self)->Name::createBatch(&status2, stmtLength, sqlStmt, dialect, inMetadata, parLength, par);
9773+
return static_cast<Name*>(self)->Name::createBatch(&status2, transaction, stmtLength, sqlStmt, dialect, inMetadata, parLength, par);
97749774
}
97759775
catch (...)
97769776
{
@@ -9840,7 +9840,7 @@ namespace Firebird
98409840
virtual void setIdleTimeout(StatusType* status, unsigned timeOut) = 0;
98419841
virtual unsigned getStatementTimeout(StatusType* status) = 0;
98429842
virtual void setStatementTimeout(StatusType* status, unsigned timeOut) = 0;
9843-
virtual IBatch* createBatch(StatusType* status, unsigned stmtLength, const char* sqlStmt, unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par) = 0;
9843+
virtual IBatch* createBatch(StatusType* status, ITransaction* transaction, unsigned stmtLength, const char* sqlStmt, unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par) = 0;
98449844
};
98459845

98469846
template <typename Name, typename StatusType, typename Base>

src/jrd/EngineInterface.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -389,9 +389,9 @@ class JAttachment FB_FINAL :
389389
void setIdleTimeout(Firebird::CheckStatusWrapper* status, unsigned int timeOut);
390390
unsigned int getStatementTimeout(Firebird::CheckStatusWrapper* status);
391391
void setStatementTimeout(Firebird::CheckStatusWrapper* status, unsigned int timeOut);
392-
Firebird::IBatch* createBatch(Firebird::CheckStatusWrapper* status, unsigned stmtLength,
393-
const char* sqlStmt, unsigned dialect, Firebird::IMessageMetadata* inMetadata,
394-
unsigned parLength, const unsigned char* par);
392+
Firebird::IBatch* createBatch(Firebird::CheckStatusWrapper* status, Firebird::ITransaction* transaction,
393+
unsigned stmtLength, const char* sqlStmt, unsigned dialect,
394+
Firebird::IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par);
395395

396396
public:
397397
explicit JAttachment(StableAttachmentPart* js);

src/jrd/jrd.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4776,10 +4776,12 @@ ITransaction* JAttachment::execute(CheckStatusWrapper* user_status, ITransaction
47764776
}
47774777

47784778

4779-
IBatch* JAttachment::createBatch(CheckStatusWrapper* status, unsigned stmtLength, const char* sqlStmt,
4780-
unsigned dialect, IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par)
4779+
IBatch* JAttachment::createBatch(CheckStatusWrapper* status, ITransaction* transaction,
4780+
unsigned stmtLength, const char* sqlStmt, unsigned dialect,
4781+
IMessageMetadata* inMetadata, unsigned parLength, const unsigned char* par)
47814782
{
4782-
RefPtr<IStatement> tmpStatement(REF_NO_INCR, prepare(status, NULL, stmtLength, sqlStmt, dialect, 0));
4783+
RefPtr<IStatement> tmpStatement(REF_NO_INCR, prepare(status, transaction, stmtLength, sqlStmt,
4784+
dialect, 0));
47834785
if (status->getState() & IStatus::STATE_ERRORS)
47844786
{
47854787
return NULL;

0 commit comments

Comments
 (0)