Firebird 2.5事件“将数据写入连接时出错”

Firebird 2.5事件“将数据写入连接时出错”,firebird,firebird2.5,Firebird,Firebird2.5,我使用的是OSX10.10上最新的Firebird 2.5.3,使用的是C api,并且发布了一个专门针对事件的版本。我明白了 "error writing data to the connection" 从数据库触发器运行的事件发生概率约为1:5,使用: POST_EVENT 'xxx'; 其中“xxx”是事件\u回调 这是其他人看到的问题吗?我很难用谷歌追踪到很多信息,因为大多数参考资料都是早期版本的Firebird,或者是所谓的“修复”bug 编辑-其他

我使用的是OSX10.10上最新的Firebird 2.5.3,使用的是C api,并且发布了一个专门针对事件的版本。我明白了

"error writing data to the connection"
从数据库触发器运行的事件发生概率约为1:5,使用:

POST_EVENT 'xxx';                
其中“xxx”是事件\u回调

这是其他人看到的问题吗?我很难用谷歌追踪到很多信息,因为大多数参考资料都是早期版本的Firebird,或者是所谓的“修复”bug

编辑-其他信息

显然,一些细节已经被忽略了

触发器的创建类似于:

"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*/
    }
}

显示用于设置事件回调并将其排队的C代码。这不包括eventblocks的初始化。您可能想考虑将此发布到FielBube支持邮件列表中,请参阅详细信息,您将获得更多熟悉C-API的眼睛。