OCILIB (C Driver for Oracle) 3.9.1
D:/Perso/dev/ocilib/ocilib/src/msg.c
00001 /*
00002     +-----------------------------------------------------------------------------------------+
00003     |                                                                                         |
00004     |                               OCILIB - C Driver for Oracle                              |
00005     |                                                                                         |
00006     |                                (C Wrapper for Oracle OCI)                               |
00007     |                                                                                         |
00008     |                              Website : http://www.ocilib.net                            |
00009     |                                                                                         |
00010     |             Copyright (c) 2007-2011 Vincent ROGIER <vince.rogier@ocilib.net>            |
00011     |                                                                                         |
00012     +-----------------------------------------------------------------------------------------+
00013     |                                                                                         |
00014     |             This library is free software; you can redistribute it and/or               |
00015     |             modify it under the terms of the GNU Lesser General Public                  |
00016     |             License as published by the Free Software Foundation; either                |
00017     |             version 2 of the License, or (at your option) any later version.            |
00018     |                                                                                         |
00019     |             This library is distributed in the hope that it will be useful,             |
00020     |             but WITHOUT ANY WARRANTY; without even the implied warranty of              |
00021     |             MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU           |
00022     |             Lesser General Public License for more details.                             |
00023     |                                                                                         |
00024     |             You should have received a copy of the GNU Lesser General Public            |
00025     |             License along with this library; if not, write to the Free                  |
00026     |             Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.          |
00027     |                                                                                         |
00028     +-----------------------------------------------------------------------------------------+
00029 */
00030 
00031 /* --------------------------------------------------------------------------------------------- *
00032  * $Id: msg.c, v 3.9.1 2011-07-08 00:00 Vincent Rogier $
00033  * --------------------------------------------------------------------------------------------- */
00034 
00035 #include "ocilib_internal.h"
00036 
00037 /* ********************************************************************************************* *
00038  *                            PUBLIC FUNCTIONS
00039  * ********************************************************************************************* */
00040 
00041 /* --------------------------------------------------------------------------------------------- *
00042  * OCI_MsgCreate
00043  * --------------------------------------------------------------------------------------------- */
00044 
00045 OCI_Msg * OCI_API OCI_MsgCreate
00046 (
00047     OCI_TypeInfo *typinf
00048 )
00049 {
00050     OCI_Msg *msg = NULL;
00051     boolean res  = TRUE;
00052 
00053     OCI_CHECK_INITIALIZED(NULL);
00054 
00055     OCI_CHECK_PTR(OCI_IPC_TYPE_INFO, typinf, NULL);
00056 
00057     /* allocate message structure */
00058 
00059     msg = (OCI_Msg *) OCI_MemAlloc(OCI_IPC_MSG, sizeof(*msg), (size_t) 1, TRUE);
00060 
00061     if (msg != NULL)
00062     {
00063         msg->typinf = typinf;
00064         msg->ind    = OCI_IND_NULL;
00065 
00066         /* allocate message properties descriptor */
00067 
00068         res = (OCI_SUCCESS == OCI_DescriptorAlloc((dvoid * ) msg->typinf->con->env,
00069                                                   (dvoid **) &msg->proph,
00070                                                   OCI_DTYPE_AQMSG_PROPERTIES,
00071                                                   (size_t) 0, (dvoid **) NULL));
00072 
00073         if (res == TRUE)
00074         {
00075             /* allocate internal OCI_Object handle if payload is not RAW */
00076 
00077             if (msg->typinf->tcode != OCI_UNKNOWN)
00078             {
00079                 msg->obj = OCI_ObjectCreate(typinf->con, typinf);
00080 
00081                 res = (msg->obj != NULL);
00082             }
00083         }
00084     }
00085     else
00086     {
00087         res = FALSE;
00088     }
00089 
00090     /* check for failure */
00091 
00092     if (res == FALSE)
00093     {
00094         OCI_MsgFree(msg);
00095         msg = NULL;
00096     }
00097 
00098     return msg;
00099 }
00100 
00101 /* --------------------------------------------------------------------------------------------- *
00102  * OCI_MsgFree
00103  * --------------------------------------------------------------------------------------------- */
00104 
00105 boolean OCI_API OCI_MsgFree
00106 (
00107     OCI_Msg *msg
00108 )
00109 {
00110     boolean res = TRUE;
00111 
00112     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00113 
00114     /* free local OCI_Agent object */
00115 
00116     if (msg->sender != NULL)
00117     {
00118         OCI_AgentFree(msg->sender);
00119     }
00120 
00121     /* free internal OCI_Object handle if payload is not RAW */
00122 
00123     if (msg->obj != NULL)
00124     {
00125         msg->obj->hstate =  OCI_OBJECT_ALLOCATED;
00126 
00127         OCI_ObjectFree(msg->obj);
00128 
00129         msg->obj = NULL;
00130     }
00131 
00132     /* free message RAW payload if necessary */
00133 
00134     if ((msg->typinf->tcode == OCI_UNKNOWN)&& ( msg->id != NULL))
00135     {
00136         OCI_CALL2
00137         (
00138             res, msg->typinf->con,
00139 
00140             OCIRawResize(msg->typinf->con->env, msg->typinf->con->err, 0, (OCIRaw **) &msg->payload)
00141         )
00142     }
00143 
00144     /* free message ID */
00145 
00146     if (msg->id != NULL)
00147     {
00148 
00149         OCI_CALL2
00150         (
00151             res, msg->typinf->con,
00152 
00153             OCIRawResize(msg->typinf->con->env, msg->typinf->con->err, 0, (OCIRaw **) &msg->id)
00154         )
00155     }
00156 
00157     msg->id = NULL;
00158 
00159     /* free OCI descriptor */
00160 
00161     OCI_DescriptorFree((dvoid *) msg->proph, OCI_DTYPE_AQMSG_PROPERTIES);
00162 
00163     OCI_FREE(msg);
00164 
00165     return res;
00166 }
00167 
00168 /* --------------------------------------------------------------------------------------------- *
00169  * OCI_MsgReset
00170  * --------------------------------------------------------------------------------------------- */
00171 
00172 boolean OCI_API OCI_MsgReset
00173 (
00174     OCI_Msg *msg
00175 )
00176 {
00177     boolean res = TRUE;
00178 
00179     unsigned int len = 0;
00180     void  *null_ptr  = NULL;
00181 
00182     res =   (
00183                 OCI_MsgSetExpiration(msg, -1)            &&
00184                 OCI_MsgSetEnqueueDelay(msg, 0)           &&
00185                 OCI_MsgSetPriority(msg,0)                &&
00186                 OCI_MsgSetOriginalID(msg, null_ptr, len) &&
00187                 OCI_MsgSetSender(msg, NULL)              &&
00188                 OCI_MsgSetConsumers(msg, null_ptr, len)  &&
00189                 OCI_MsgSetCorrelation(msg, NULL)         &&
00190                 OCI_MsgSetExceptionQueue(msg, NULL)
00191             );
00192 
00193     if (res == TRUE)
00194     {
00195         if (msg->typinf->tcode == OCI_UNKNOWN)
00196         {
00197             res = OCI_MsgSetRaw(msg, null_ptr, len);
00198         }
00199         else
00200         {
00201             res = OCI_MsgSetObject(msg, null_ptr);
00202         }
00203     }
00204 
00205     return res;
00206 }
00207 
00208 /* --------------------------------------------------------------------------------------------- *
00209  * OCI_MsgGetObject
00210  * --------------------------------------------------------------------------------------------- */
00211 
00212 OCI_Object * OCI_API OCI_MsgGetObject
00213 (
00214     OCI_Msg *msg
00215 )
00216 {
00217     OCI_Object *obj = NULL;
00218 
00219     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00220     OCI_CHECK_COMPAT(msg->typinf->con, msg->typinf->tcode != OCI_UNKNOWN, NULL);
00221 
00222     if (msg->ind != OCI_IND_NULL)
00223     {
00224         obj = (OCI_Object *) msg->obj;
00225     }
00226 
00227     OCI_RESULT(TRUE);
00228 
00229     return obj;
00230 }
00231 
00232 /* --------------------------------------------------------------------------------------------- *
00233  * OCI_MsgGetObject
00234  * --------------------------------------------------------------------------------------------- */
00235 
00236 boolean OCI_API OCI_MsgSetObject
00237 (
00238     OCI_Msg    *msg,
00239     OCI_Object *obj
00240 )
00241 {
00242     boolean res = TRUE;
00243 
00244     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00245 
00246     OCI_CHECK_COMPAT(msg->typinf->con, msg->typinf->tcode != OCI_UNKNOWN, FALSE);
00247 
00248     if (obj != NULL)
00249     {
00250         /* assign the given object to the message internal object */
00251 
00252         res = OCI_ObjectAssign((OCI_Object *) msg->obj, obj);
00253 
00254         if (res == TRUE)
00255         {
00256             msg->ind = OCI_IND_NOTNULL;
00257         }
00258     }
00259     else
00260     {
00261         msg->ind = OCI_IND_NULL;
00262     }
00263 
00264     OCI_RESULT(res);
00265 
00266     return res;
00267 }
00268 
00269 /* --------------------------------------------------------------------------------------------- *
00270  * OCI_MsgGetRaw
00271  * --------------------------------------------------------------------------------------------- */
00272 
00273 boolean OCI_API OCI_MsgGetRaw
00274 (
00275     OCI_Msg      *msg,
00276     void         *raw,
00277     unsigned int *size
00278 )
00279 {
00280     unsigned int raw_size = 0;
00281 
00282     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00283     OCI_CHECK_PTR(OCI_IPC_VOID, raw, FALSE);
00284     OCI_CHECK_PTR(OCI_IPC_VOID, size, FALSE);
00285 
00286     OCI_CHECK_COMPAT(msg->typinf->con, msg->typinf->tcode == OCI_UNKNOWN, FALSE);
00287 
00288     if ((msg->payload != NULL) && (msg->ind != OCI_IND_NULL))
00289     {
00290         raw_size = OCIRawSize(msg->typinf->con->env, (OCIRaw *) msg->payload);
00291 
00292         if (*size > raw_size)
00293         {
00294             *size = raw_size;
00295         }
00296 
00297         memcpy(raw, OCIRawPtr(msg->typinf->con->env, msg->payload), (size_t) (*size));
00298     }
00299     else
00300     {
00301         *size = 0;
00302     }
00303 
00304     OCI_RESULT(TRUE);
00305 
00306     return TRUE;
00307 }
00308 
00309 /* --------------------------------------------------------------------------------------------- *
00310  * OCI_MsgSetRaw
00311  * --------------------------------------------------------------------------------------------- */
00312 
00313 boolean OCI_API OCI_MsgSetRaw
00314 (
00315     OCI_Msg      *msg,
00316     const void   *raw,
00317     unsigned int  size
00318 )
00319 {
00320     boolean res = TRUE;
00321 
00322     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00323 
00324     OCI_CHECK_COMPAT(msg->typinf->con, msg->typinf->tcode == OCI_UNKNOWN, FALSE);
00325 
00326     OCI_CALL2
00327     (
00328         res, msg->typinf->con,
00329 
00330         OCIRawAssignBytes(msg->typinf->con->env, msg->typinf->con->err,
00331                           (ub1*) raw, (ub4) size, (OCIRaw **) &msg->payload)
00332     )
00333 
00334     if ((res == TRUE) && (msg->payload != NULL) && (size > 0))
00335     {
00336         msg->ind = OCI_IND_NOTNULL;
00337     }
00338     else
00339     {
00340         msg->ind = OCI_IND_NULL;
00341     }
00342 
00343     OCI_RESULT(res);
00344 
00345     return res;
00346 }
00347 
00348 /* --------------------------------------------------------------------------------------------- *
00349  * OCI_MsgGetAttemptCount
00350  * --------------------------------------------------------------------------------------------- */
00351 
00352 int OCI_API OCI_MsgGetAttemptCount
00353 (
00354     OCI_Msg *msg
00355 )
00356 {
00357     boolean res = TRUE;
00358     sb4 ret     = 0;
00359 
00360     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00361 
00362     OCI_CALL2
00363     (
00364         res, msg->typinf->con,
00365 
00366         OCIAttrGet((dvoid *) msg->proph,
00367                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00368                    (dvoid *) &ret,
00369                    (ub4   *) NULL,
00370                    (ub4    ) OCI_ATTR_ATTEMPTS,
00371                    msg->typinf->con->err)
00372     )
00373 
00374     OCI_RESULT(res);
00375 
00376     return (int) ret;
00377 }
00378 
00379 /* --------------------------------------------------------------------------------------------- *
00380  * OCI_MsgGetEnqueueDelay
00381  * --------------------------------------------------------------------------------------------- */
00382 
00383 int OCI_API OCI_MsgGetEnqueueDelay
00384 (
00385     OCI_Msg *msg
00386 )
00387 {
00388     boolean res = TRUE;
00389     sb4 ret     = 0;
00390 
00391     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00392 
00393     OCI_CALL2
00394     (
00395         res, msg->typinf->con,
00396 
00397         OCIAttrGet((dvoid *) msg->proph,
00398                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00399                    (dvoid *) &ret,
00400                    (ub4   *) NULL,
00401                    (ub4    ) OCI_ATTR_DELAY,
00402                    msg->typinf->con->err)
00403     )
00404 
00405     OCI_RESULT(res);
00406 
00407     return (int) ret;
00408 }
00409 
00410 /* --------------------------------------------------------------------------------------------- *
00411  * OCI_MsgSetEnqueueDelay
00412  * --------------------------------------------------------------------------------------------- */
00413 
00414 boolean OCI_API OCI_MsgSetEnqueueDelay
00415 (
00416     OCI_Msg *msg,
00417     int      value
00418 )
00419 {
00420     boolean res = TRUE;
00421     sb4 sval    = (sb4) value;
00422 
00423     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00424 
00425     OCI_CALL2
00426     (
00427         res, msg->typinf->con,
00428 
00429         OCIAttrSet((dvoid *) msg->proph,
00430                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00431                    (dvoid *) &sval,
00432                    (ub4    ) sizeof(sval),
00433                    (ub4    ) OCI_ATTR_DELAY,
00434                    msg->typinf->con->err)
00435     )
00436 
00437     OCI_RESULT(res);
00438 
00439     return res;
00440 }
00441 
00442 /* --------------------------------------------------------------------------------------------- *
00443  * OCI_MsgGetEnqueueTime
00444  * --------------------------------------------------------------------------------------------- */
00445 
00446 OCI_Date * OCI_API OCI_MsgGetEnqueueTime
00447 (
00448     OCI_Msg *msg
00449 )
00450 {
00451     boolean res    = TRUE;
00452     OCI_Date *date = NULL;
00453     OCIDate oci_date;
00454 
00455     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00456 
00457     OCI_CALL2
00458     (
00459         res, msg->typinf->con,
00460 
00461         OCIAttrGet((dvoid *) msg->proph,
00462                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00463                    (dvoid *) &oci_date,
00464                    (ub4   *) NULL,
00465                    (ub4    ) OCI_ATTR_ENQ_TIME,
00466                    msg->typinf->con->err)
00467     )
00468 
00469     if (res == TRUE)
00470     {
00471         date = OCI_DateInit(msg->typinf->con, &msg->date, &oci_date, FALSE, FALSE);
00472 
00473         res = (date != NULL);
00474     }
00475 
00476     OCI_RESULT(res);
00477 
00478     return date;
00479 }
00480 
00481 /* --------------------------------------------------------------------------------------------- *
00482  * OCI_MsgGetExpiration
00483  * --------------------------------------------------------------------------------------------- */
00484 
00485 int OCI_API OCI_MsgGetExpiration
00486 (
00487     OCI_Msg *msg
00488 )
00489 {
00490     boolean res = TRUE;
00491     sb4 ret     = 0;
00492 
00493     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00494 
00495     OCI_CALL2
00496     (
00497         res, msg->typinf->con,
00498 
00499         OCIAttrGet((dvoid *) msg->proph,
00500                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00501                    (dvoid *) &ret,
00502                    (ub4   *) NULL,
00503                    (ub4    ) OCI_ATTR_EXPIRATION,
00504                    msg->typinf->con->err)
00505     )
00506 
00507     OCI_RESULT(res);
00508 
00509     return (int) ret;
00510 }
00511 
00512 /* --------------------------------------------------------------------------------------------- *
00513  * OCI_MsgSetExpiration
00514  * --------------------------------------------------------------------------------------------- */
00515 
00516 boolean OCI_API OCI_MsgSetExpiration
00517 (
00518     OCI_Msg *msg,
00519     int      value
00520 )
00521 {
00522     boolean res = TRUE;
00523     sb4 sval    = (sb4) value;
00524 
00525     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00526 
00527     OCI_CALL2
00528     (
00529         res, msg->typinf->con,
00530 
00531         OCIAttrSet((dvoid *) msg->proph,
00532                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00533                    (dvoid *) &sval,
00534                    (ub4    ) sizeof(sval),
00535                    (ub4    ) OCI_ATTR_EXPIRATION,
00536                    msg->typinf->con->err)
00537     )
00538 
00539     OCI_RESULT(res);
00540 
00541     return res;
00542 }
00543 
00544 /* --------------------------------------------------------------------------------------------- *
00545  * OCI_MsgGetState
00546  * --------------------------------------------------------------------------------------------- */
00547 
00548 unsigned int OCI_API OCI_MsgGetState
00549 (
00550     OCI_Msg *msg
00551 )
00552 {
00553     boolean res = TRUE;
00554     sb4 ret     = 0;
00555 
00556     OCI_CHECK_PTR(OCI_IPC_MSG, msg, OCI_UNKNOWN);
00557 
00558     OCI_CALL2
00559     (
00560         res, msg->typinf->con,
00561 
00562         OCIAttrGet((dvoid *) msg->proph,
00563                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00564                    (dvoid *) &ret,
00565                    (ub4   *) NULL,
00566                    (ub4    ) OCI_ATTR_MSG_STATE,
00567                    msg->typinf->con->err)
00568     )
00569 
00570     /* increment value to handle return code OCI_UNKNOWN on failure */
00571 
00572     if (res == TRUE)
00573     {
00574         ret++;
00575     }
00576     else
00577     {
00578         ret = OCI_UNKNOWN;
00579     }
00580 
00581     OCI_RESULT(res);
00582 
00583     return (int) ret;
00584 }
00585 
00586 /* --------------------------------------------------------------------------------------------- *
00587  * OCI_MsgGetPriority
00588  * --------------------------------------------------------------------------------------------- */
00589 
00590 int OCI_API OCI_MsgGetPriority
00591 (
00592     OCI_Msg *msg
00593 )
00594 {
00595     boolean res = TRUE;
00596     sb4 ret     = 0;
00597 
00598     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00599 
00600     OCI_CALL2
00601     (
00602         res, msg->typinf->con,
00603 
00604         OCIAttrGet((dvoid *) msg->proph,
00605                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00606                    (dvoid *) &ret,
00607                    (ub4   *) NULL,
00608                    (ub4    ) OCI_ATTR_PRIORITY,
00609                    msg->typinf->con->err)
00610     )
00611 
00612     OCI_RESULT(res);
00613 
00614     return (int) ret;
00615 }
00616 
00617 /* --------------------------------------------------------------------------------------------- *
00618  * OCI_MsgSetPriority
00619  * --------------------------------------------------------------------------------------------- */
00620 
00621 boolean OCI_API OCI_MsgSetPriority
00622 (
00623     OCI_Msg *msg,
00624     int      value
00625 )
00626 {
00627     boolean res = TRUE;
00628     sb4 sval    = (sb4) value;
00629 
00630     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00631 
00632     OCI_CALL2
00633     (
00634         res, msg->typinf->con,
00635 
00636         OCIAttrSet((dvoid *) msg->proph,
00637                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00638                    (dvoid *) &sval,
00639                    (ub4    ) sizeof(sval),
00640                    (ub4    ) OCI_ATTR_PRIORITY,
00641                    msg->typinf->con->err)
00642     )
00643 
00644     OCI_RESULT(res);
00645 
00646     return res;
00647 }
00648 
00649 
00650 /* --------------------------------------------------------------------------------------------- *
00651  * OCI_MsgGetID
00652  * --------------------------------------------------------------------------------------------- */
00653 
00654 boolean OCI_API OCI_MsgGetID
00655 (
00656     OCI_Msg      *msg,
00657     void         *id,
00658     unsigned int *len
00659 )
00660 {
00661     boolean res   = TRUE;
00662 
00663     OCI_CHECK_PTR(OCI_IPC_MSG,  msg, FALSE);
00664     OCI_CHECK_PTR(OCI_IPC_VOID, id,  FALSE);
00665     OCI_CHECK_PTR(OCI_IPC_VOID, len, FALSE);
00666 
00667     if (msg->id != NULL)
00668     {
00669         ub4 raw_len = 0;
00670 
00671         raw_len = OCIRawSize(msg->typinf->con->env, msg->id);
00672 
00673         if (*len > raw_len)
00674         {
00675             *len = raw_len;
00676         }
00677 
00678         memcpy(id, OCIRawPtr(msg->typinf->con->env, msg->id), (size_t) (*len));
00679     }
00680     else
00681     {
00682         *len = 0;
00683     }
00684 
00685     OCI_RESULT(res);
00686 
00687     return res;
00688 }
00689 
00690 /* --------------------------------------------------------------------------------------------- *
00691  * OCI_MsgGetOriginalID
00692  * --------------------------------------------------------------------------------------------- */
00693 
00694 boolean OCI_API OCI_MsgGetOriginalID
00695 (
00696     OCI_Msg      *msg,
00697     void         *id,
00698     unsigned int *len
00699 )
00700 {
00701     boolean res   = TRUE;
00702     OCIRaw *value = NULL;
00703 
00704     OCI_CHECK_PTR(OCI_IPC_MSG,  msg, FALSE);
00705     OCI_CHECK_PTR(OCI_IPC_VOID, id,  FALSE);
00706     OCI_CHECK_PTR(OCI_IPC_VOID, len, FALSE);
00707 
00708     OCI_CALL2
00709     (
00710         res, msg->typinf->con,
00711 
00712         OCIAttrGet((dvoid *) msg->proph,
00713                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00714                    (dvoid *) &value,
00715                    (ub4   *) NULL,
00716                    (ub4    ) OCI_ATTR_ORIGINAL_MSGID,
00717                    msg->typinf->con->err)
00718     )
00719 
00720     if (value != NULL)
00721     {
00722         ub4 raw_len = 0;
00723 
00724         raw_len = OCIRawSize(msg->typinf->con->env, value);
00725 
00726         if (*len > raw_len)
00727         {
00728             *len = raw_len;
00729         }
00730 
00731         memcpy(id, OCIRawPtr(msg->typinf->con->env, value), (size_t) (*len));
00732     }
00733     else
00734     {
00735         *len = 0;
00736     }
00737 
00738     OCI_RESULT(res);
00739 
00740     return res;
00741 }
00742 
00743 /* --------------------------------------------------------------------------------------------- *
00744  * OCI_MsgSetOriginalID
00745  * --------------------------------------------------------------------------------------------- */
00746 
00747 boolean OCI_API OCI_MsgSetOriginalID
00748 (
00749     OCI_Msg      *msg,
00750     const void   *id,
00751     unsigned int len
00752 )
00753 {
00754     boolean res   = TRUE;
00755     OCIRaw *value = NULL;
00756 
00757     OCI_CHECK_PTR(OCI_IPC_MSG,  msg, FALSE);
00758 
00759     OCI_CALL2
00760     (
00761         res, msg->typinf->con,
00762 
00763         OCIRawAssignBytes(msg->typinf->con->env, msg->typinf->con->err,
00764                           (ub1*) id, (ub4) len, (OCIRaw **) &value)
00765     )
00766 
00767     OCI_CALL2
00768     (
00769         res, msg->typinf->con,
00770 
00771         OCIAttrSet((dvoid *) msg->proph,
00772                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00773                    (dvoid *) &value,
00774                    (ub4    ) 0,
00775                    (ub4    ) OCI_ATTR_ORIGINAL_MSGID,
00776                    msg->typinf->con->err)
00777     )
00778 
00779     OCI_RESULT(res);
00780 
00781     return res;
00782 }
00783 
00784 /* --------------------------------------------------------------------------------------------- *
00785  * OCI_MsgGetCorrelation
00786  * --------------------------------------------------------------------------------------------- */
00787 
00788 const mtext * OCI_API OCI_MsgGetCorrelation
00789 (
00790     OCI_Msg *msg
00791 )
00792 {
00793     boolean res = TRUE;
00794 
00795     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00796 
00797     if (msg->correlation == NULL)
00798     {
00799         res = OCI_StringGetFromAttrHandle(msg->typinf->con,
00800                                           msg->proph,
00801                                           OCI_DTYPE_AQMSG_PROPERTIES,
00802                                           OCI_ATTR_CORRELATION,
00803                                           &msg->correlation);
00804     }
00805 
00806     OCI_RESULT(res);
00807 
00808     return msg->correlation;
00809 }
00810 
00811 /* --------------------------------------------------------------------------------------------- *
00812  * OCI_MsgSetCorrelation
00813  * --------------------------------------------------------------------------------------------- */
00814 
00815 boolean OCI_API OCI_MsgSetCorrelation
00816 (
00817     OCI_Msg     *msg,
00818     const mtext *correlation
00819 )
00820 {
00821     boolean res = TRUE;
00822 
00823     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00824 
00825     res =  OCI_StringSetToAttrHandle(msg->typinf->con,
00826                                      msg->proph,
00827                                      OCI_DTYPE_AQMSG_PROPERTIES,
00828                                      OCI_ATTR_CORRELATION,
00829                                      &msg->correlation,
00830                                      correlation);
00831 
00832     OCI_RESULT(res);
00833 
00834     return res;
00835 }
00836 
00837 /* --------------------------------------------------------------------------------------------- *
00838  * OCI_MsgGetExceptionQueue
00839  * --------------------------------------------------------------------------------------------- */
00840 
00841 const mtext * OCI_API OCI_MsgGetExceptionQueue
00842 (
00843     OCI_Msg *msg
00844 )
00845 {
00846     boolean res = TRUE;
00847 
00848     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00849 
00850     if (msg->except_queue == NULL)
00851     {
00852         res = OCI_StringGetFromAttrHandle(msg->typinf->con,
00853                                           msg->proph,
00854                                           OCI_DTYPE_AQMSG_PROPERTIES,
00855                                           OCI_ATTR_EXCEPTION_QUEUE,
00856                                           &msg->except_queue);
00857     }
00858 
00859     OCI_RESULT(res);
00860 
00861     return msg->except_queue;
00862 }
00863 
00864 /* --------------------------------------------------------------------------------------------- *
00865  * OCI_MsgSetExceptionQueue
00866  * --------------------------------------------------------------------------------------------- */
00867 
00868 boolean OCI_API OCI_MsgSetExceptionQueue
00869 (
00870     OCI_Msg     *msg,
00871     const mtext *queue
00872 )
00873 {
00874     boolean res = TRUE;
00875 
00876     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00877 
00878     res =  OCI_StringSetToAttrHandle(msg->typinf->con,
00879                                      msg->proph,
00880                                      OCI_DTYPE_AQMSG_PROPERTIES,
00881                                      OCI_ATTR_EXCEPTION_QUEUE,
00882                                      &msg->except_queue,
00883                                      queue);
00884 
00885     OCI_RESULT(res);
00886 
00887     return res;
00888 }
00889 
00890 /* --------------------------------------------------------------------------------------------- *
00891  * OCI_MsgGetSender
00892  * --------------------------------------------------------------------------------------------- */
00893 
00894 OCI_Agent * OCI_API OCI_MsgGetSender
00895 (
00896     OCI_Msg   *msg
00897 )
00898 {
00899     boolean res = TRUE;
00900     OCIAQAgent *handle = NULL;
00901     OCI_Agent  *sender = NULL;
00902 
00903     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00904 
00905     OCI_CALL2
00906     (
00907         res, msg->typinf->con,
00908 
00909         OCIAttrGet((dvoid *) msg->proph,
00910                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00911                    (dvoid *) &handle,
00912                    (ub4    ) 0,
00913                    (ub4    ) OCI_ATTR_SENDER_ID,
00914                    msg->typinf->con->err)
00915     )
00916 
00917     if ((res == TRUE) && (handle != NULL))
00918     {
00919         sender = OCI_AgentInit(msg->typinf->con, &msg->sender, handle, NULL, NULL);
00920     }
00921 
00922     OCI_RESULT(res);
00923 
00924     return sender;
00925 }
00926 
00927 /* --------------------------------------------------------------------------------------------- *
00928  * OCI_MsgSetSender
00929  * --------------------------------------------------------------------------------------------- */
00930 
00931 boolean OCI_API OCI_MsgSetSender
00932 (
00933     OCI_Msg   *msg,
00934     OCI_Agent *sender
00935 )
00936 {
00937     boolean res = TRUE;
00938 
00939     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00940 
00941     OCI_CALL2
00942     (
00943         res, msg->typinf->con,
00944 
00945         OCIAttrSet((dvoid *) msg->proph,
00946                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00947                    (dvoid *) (sender ? sender->handle : NULL),
00948                    (ub4    ) 0,
00949                    (ub4    ) OCI_ATTR_SENDER_ID,
00950                    msg->typinf->con->err)
00951     )
00952 
00953     OCI_RESULT(res);
00954 
00955     return res;
00956 }
00957 
00958 /* --------------------------------------------------------------------------------------------- *
00959  * OCI_MsgSetConsumers
00960  * --------------------------------------------------------------------------------------------- */
00961 
00962 boolean OCI_API OCI_MsgSetConsumers
00963 (
00964     OCI_Msg     *msg,
00965     OCI_Agent  **consumers,
00966     unsigned int count
00967 )
00968 {
00969     boolean res          = TRUE;
00970     OCIAQAgent **handles = NULL;
00971 
00972     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00973 
00974     /* allocate local array of OCIAQAgent handles if needed */
00975 
00976     if ((consumers != NULL) && (count > 0))
00977     {
00978         handles = (OCIAQAgent **) OCI_MemAlloc(OCI_IPC_ARRAY,sizeof(OCIAQAgent *), count, FALSE);
00979 
00980         if (handles != NULL)
00981         {
00982             unsigned int i;
00983 
00984             for(i = 0; i < count; i++)
00985             {
00986                 handles[i] = consumers[i]->handle;
00987             }
00988         }
00989     }
00990     else
00991     {
00992         count = 0;
00993     }
00994 
00995     OCI_CALL2
00996     (
00997         res, msg->typinf->con,
00998 
00999         OCIAttrSet((dvoid *) msg->proph,
01000                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
01001                    (dvoid *) handles,
01002                    (ub4    ) count,
01003                    (ub4    ) OCI_ATTR_RECIPIENT_LIST,
01004                    msg->typinf->con->err)
01005     )
01006 
01007 
01008     /* free local array of OCIAQAgent handles if needed */
01009 
01010     if (handles != NULL)
01011     {
01012         OCI_FREE(handles);
01013     }
01014 
01015     OCI_RESULT(res);
01016 
01017     return res;
01018 }