Firebird 2.5事件"错误将数据写入连接"

时间:2015-03-05 16:06:51

标签: firebird firebird2.5

我正在使用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*/
    }
}

0 个答案:

没有答案