Subscription в OCI(oracle)
От: collider  
Дата: 21.10.15 16:04
Оценка:
Вот кусок кода, который создает Subscription и привязывает его в вызову функции NotifyCallback, которая должна вызываться в случае изменения запроса *p_statement (OCIStmt** p_statement).
pfn_XXX это указатели на XXX из oci.dll, которая грузиться динамически.

Беда в том что
oci_error = pfn_OCISubscriptionRegister(pServiceContext, &subscrhp, 1, pError, OCI_DEFAULT);
a) Вызывает вопросы в firewall (windows 7)
b) И что совсем скверно, при запрете в firewall все равно возвращает 0.

1)Может кто подскажет как с этим можно бороться ? Если не с a) то хотя бы с b) как проверить, что Callback будет вызываться?

2)И еще вся эта хрень нужна, только для того, чтобы узнать, являются данные в памяти актуальными или их стоит перечитать.
Может быть есть готовые решения или еще какие возможности в oracle чтобы решить такую задачу?

    OCISubscription *subscrhp=NULL;
    ub4 dbspace = OCI_SUBSCR_NAMESPACE_DBCHANGE;
    ub4 qosflags = OCI_SUBSCR_CQ_QOS_QUERY  ;
    bool rowids = TRUE;

    long oci_error =0;

    oci_error = pfn_OCIHandleAlloc(pEnvironment, (void**)&subscrhp, OCI_HTYPE_SUBSCRIPTION,  0, 0);
    if (oci_error != 0) return ProceedError (oci_error);

        
    oci_error = pfn_OCIAttrSet (subscrhp, OCI_HTYPE_SUBSCRIPTION, &dbspace, sizeof(ub4),OCI_ATTR_SUBSCR_NAMESPACE, pError);
    if (oci_error != 0) return ProceedError (oci_error);


    oci_error = pfn_OCIAttrSet (subscrhp, OCI_HTYPE_SUBSCRIPTION, (void*)this, 0,OCI_ATTR_SUBSCR_CTX, pError);
    if (oci_error != 0) return ProceedError (oci_error);

    oci_error = pfn_OCIAttrSet (subscrhp, OCI_HTYPE_SUBSCRIPTION,(void *)NotifyCallback, 0, OCI_ATTR_SUBSCR_CALLBACK, pError);
    if (oci_error != 0) return ProceedError (oci_error);

    oci_error = pfn_OCIAttrSet (subscrhp, OCI_HTYPE_SUBSCRIPTION,(void *)&rowids, sizeof(ub4), OCI_ATTR_CHNF_ROWIDS, pError);
    if (oci_error != 0) return ProceedError (oci_error);

    oci_error = pfn_OCIAttrSet (subscrhp, OCI_HTYPE_SUBSCRIPTION,(void *)&qosflags, sizeof(ub4),OCI_ATTR_SUBSCR_CQ_QOSFLAGS, pError);
    if (oci_error != 0) return ProceedError (oci_error);    

    oci_error = pfn_OCISubscriptionRegister(pServiceContext, &subscrhp, 1, pError, OCI_DEFAULT);
    if (oci_error != 0) return ProceedError (oci_error);


    oci_error = pfn_OCIAttrSet (*p_statement, OCI_HTYPE_STMT, subscrhp, 0,OCI_ATTR_CHNF_REGHANDLE, pError);
    if (oci_error != 0) return ProceedError (oci_error);

    oci_error = pfn_OCIStmtExecute (pServiceContext, *p_statement, pError, (ub4) 1, (ub4) 0,(CONST OCISnapshot *) NULL, (OCISnapshot *) NULL ,OCI_DEFAULT);
    if (oci_error != 0) return ProceedError (oci_error);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.