我正在使用C api在OSX10.10上使用最新的Firebird 2.5.3
,并且我已经发布了一个专门针对事件进行缩减的内容。我得到了
"error writing data to the connection"
使用以下命令从数据库触发器运行的事件发生约1:5的概率:
POST_EVENT 'xxx';
其中' xxx'是Event_Callback
这是其他人看到的问题吗?我很难使用谷歌跟踪大量信息,因为大多数参考文献都是针对Firebird的早期版本,或者是针对所谓的“固定”版本。错误。
编辑 - 其他信息
显然,一些细节已经触发器的创建类似于:
"CREATE TRIGGER \"%s\" FOR \"%s\" \
AFTER %s \
AS \
BEGIN \
if( new.id = %d ) THEN \
BEGIN \
INSERT INTO \"Event_Log\" (\"ID\",\"triggerName\", \"lastModified\") VALUES (GEN_ID(\"seq_Event_Table\",1)'%s', (select current_timestamp from rdb$database) ); \
POST_EVENT '%s'; \
END \
END;"
使用执行的代码初始化事件:
isc_que_events(status, &database, &eventData->id, eventData->length, eventData->buffer, (isc_callback)EventCallback, eventData->resultBuffer);
最后,活动的结构是:
isc_callback EventCallback( char *result, short length, char *updated )
{
uint64_t startTime;
startTime = mach_absolute_time();
printf("__EVENT__:%s:%s:%llu\n",eventData->buffer,eventData->resultBuffer,startTime);
while (length--)
{
*result++ = *updated++;
}
isc_event_counts(status, eventData->length, eventData->buffer, eventData->resultBuffer);
isc_que_events(status, &database, &eventData->id, eventData->length, eventData->buffer, (isc_callback)EventCallback, eventData->resultBuffer);
return(0);
}
最后,通过在类似于以下的测试套件中反复触发触发器来测试代码:
query = "UPDATE table_name SET column1=value1 WHERE some_column=some_value;";
for (int i=0 ; i<1e6 ; i++)
{
if (isc_start_transaction(status_vector, &transactionHandle, 1, &database, 0, NULL))
{
/*error handling*/
}
if (isc_dsql_execute_immediate(status_vector, &database, &transactionHandle, 0, query, 3, NULL))
{
/*error handling*/
}
if (isc_commit_transaction(status_vector, &transactionHandle))
{
/*error handling*/
}
}