OCILIB (C Driver for Oracle) 3.12.1
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-2013 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, 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     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00281     OCI_CHECK_PTR(OCI_IPC_VOID, raw, FALSE);
00282     OCI_CHECK_PTR(OCI_IPC_VOID, size, FALSE);
00283 
00284     OCI_CHECK_COMPAT(msg->typinf->con, msg->typinf->tcode == OCI_UNKNOWN, FALSE);
00285 
00286     if ((msg->payload != NULL) && (msg->ind != OCI_IND_NULL))
00287     {
00288         unsigned int raw_size = OCIRawSize(msg->typinf->con->env, (OCIRaw *) msg->payload);
00289 
00290         if (*size > raw_size)
00291         {
00292             *size = raw_size;
00293         }
00294 
00295         memcpy(raw, OCIRawPtr(msg->typinf->con->env, msg->payload), (size_t) (*size));
00296     }
00297     else
00298     {
00299         *size = 0;
00300     }
00301 
00302     OCI_RESULT(TRUE);
00303 
00304     return TRUE;
00305 }
00306 
00307 /* --------------------------------------------------------------------------------------------- *
00308  * OCI_MsgSetRaw
00309  * --------------------------------------------------------------------------------------------- */
00310 
00311 boolean OCI_API OCI_MsgSetRaw
00312 (
00313     OCI_Msg      *msg,
00314     const void   *raw,
00315     unsigned int  size
00316 )
00317 {
00318     boolean res = TRUE;
00319 
00320     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00321 
00322     OCI_CHECK_COMPAT(msg->typinf->con, msg->typinf->tcode == OCI_UNKNOWN, FALSE);
00323 
00324     OCI_CALL2
00325     (
00326         res, msg->typinf->con,
00327 
00328         OCIRawAssignBytes(msg->typinf->con->env, msg->typinf->con->err,
00329                           (ub1*) raw, (ub4) size, (OCIRaw **) &msg->payload)
00330     )
00331 
00332     if ((res == TRUE) && (msg->payload != NULL) && (size > 0))
00333     {
00334         msg->ind = OCI_IND_NOTNULL;
00335     }
00336     else
00337     {
00338         msg->ind = OCI_IND_NULL;
00339     }
00340 
00341     OCI_RESULT(res);
00342 
00343     return res;
00344 }
00345 
00346 /* --------------------------------------------------------------------------------------------- *
00347  * OCI_MsgGetAttemptCount
00348  * --------------------------------------------------------------------------------------------- */
00349 
00350 int OCI_API OCI_MsgGetAttemptCount
00351 (
00352     OCI_Msg *msg
00353 )
00354 {
00355     boolean res = TRUE;
00356     sb4 ret     = 0;
00357 
00358     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00359 
00360     OCI_CALL2
00361     (
00362         res, msg->typinf->con,
00363 
00364         OCIAttrGet((dvoid *) msg->proph,
00365                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00366                    (dvoid *) &ret,
00367                    (ub4   *) NULL,
00368                    (ub4    ) OCI_ATTR_ATTEMPTS,
00369                    msg->typinf->con->err)
00370     )
00371 
00372     OCI_RESULT(res);
00373 
00374     return (int) ret;
00375 }
00376 
00377 /* --------------------------------------------------------------------------------------------- *
00378  * OCI_MsgGetEnqueueDelay
00379  * --------------------------------------------------------------------------------------------- */
00380 
00381 int OCI_API OCI_MsgGetEnqueueDelay
00382 (
00383     OCI_Msg *msg
00384 )
00385 {
00386     boolean res = TRUE;
00387     sb4 ret     = 0;
00388 
00389     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00390 
00391     OCI_CALL2
00392     (
00393         res, msg->typinf->con,
00394 
00395         OCIAttrGet((dvoid *) msg->proph,
00396                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00397                    (dvoid *) &ret,
00398                    (ub4   *) NULL,
00399                    (ub4    ) OCI_ATTR_DELAY,
00400                    msg->typinf->con->err)
00401     )
00402 
00403     OCI_RESULT(res);
00404 
00405     return (int) ret;
00406 }
00407 
00408 /* --------------------------------------------------------------------------------------------- *
00409  * OCI_MsgSetEnqueueDelay
00410  * --------------------------------------------------------------------------------------------- */
00411 
00412 boolean OCI_API OCI_MsgSetEnqueueDelay
00413 (
00414     OCI_Msg *msg,
00415     int      value
00416 )
00417 {
00418     boolean res = TRUE;
00419     sb4 sval    = (sb4) value;
00420 
00421     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00422 
00423     OCI_CALL2
00424     (
00425         res, msg->typinf->con,
00426 
00427         OCIAttrSet((dvoid *) msg->proph,
00428                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00429                    (dvoid *) &sval,
00430                    (ub4    ) sizeof(sval),
00431                    (ub4    ) OCI_ATTR_DELAY,
00432                    msg->typinf->con->err)
00433     )
00434 
00435     OCI_RESULT(res);
00436 
00437     return res;
00438 }
00439 
00440 /* --------------------------------------------------------------------------------------------- *
00441  * OCI_MsgGetEnqueueTime
00442  * --------------------------------------------------------------------------------------------- */
00443 
00444 OCI_Date * OCI_API OCI_MsgGetEnqueueTime
00445 (
00446     OCI_Msg *msg
00447 )
00448 {
00449     boolean res    = TRUE;
00450     OCI_Date *date = NULL;
00451     OCIDate oci_date;
00452 
00453     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00454 
00455     OCI_CALL2
00456     (
00457         res, msg->typinf->con,
00458 
00459         OCIAttrGet((dvoid *) msg->proph,
00460                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00461                    (dvoid *) &oci_date,
00462                    (ub4   *) NULL,
00463                    (ub4    ) OCI_ATTR_ENQ_TIME,
00464                    msg->typinf->con->err)
00465     )
00466 
00467     if (res == TRUE)
00468     {
00469         date = OCI_DateInit(msg->typinf->con, &msg->date, &oci_date, FALSE, FALSE);
00470 
00471         res = (date != NULL);
00472     }
00473 
00474     OCI_RESULT(res);
00475 
00476     return date;
00477 }
00478 
00479 /* --------------------------------------------------------------------------------------------- *
00480  * OCI_MsgGetExpiration
00481  * --------------------------------------------------------------------------------------------- */
00482 
00483 int OCI_API OCI_MsgGetExpiration
00484 (
00485     OCI_Msg *msg
00486 )
00487 {
00488     boolean res = TRUE;
00489     sb4 ret     = 0;
00490 
00491     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00492 
00493     OCI_CALL2
00494     (
00495         res, msg->typinf->con,
00496 
00497         OCIAttrGet((dvoid *) msg->proph,
00498                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00499                    (dvoid *) &ret,
00500                    (ub4   *) NULL,
00501                    (ub4    ) OCI_ATTR_EXPIRATION,
00502                    msg->typinf->con->err)
00503     )
00504 
00505     OCI_RESULT(res);
00506 
00507     return (int) ret;
00508 }
00509 
00510 /* --------------------------------------------------------------------------------------------- *
00511  * OCI_MsgSetExpiration
00512  * --------------------------------------------------------------------------------------------- */
00513 
00514 boolean OCI_API OCI_MsgSetExpiration
00515 (
00516     OCI_Msg *msg,
00517     int      value
00518 )
00519 {
00520     boolean res = TRUE;
00521     sb4 sval    = (sb4) value;
00522 
00523     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00524 
00525     OCI_CALL2
00526     (
00527         res, msg->typinf->con,
00528 
00529         OCIAttrSet((dvoid *) msg->proph,
00530                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00531                    (dvoid *) &sval,
00532                    (ub4    ) sizeof(sval),
00533                    (ub4    ) OCI_ATTR_EXPIRATION,
00534                    msg->typinf->con->err)
00535     )
00536 
00537     OCI_RESULT(res);
00538 
00539     return res;
00540 }
00541 
00542 /* --------------------------------------------------------------------------------------------- *
00543  * OCI_MsgGetState
00544  * --------------------------------------------------------------------------------------------- */
00545 
00546 unsigned int OCI_API OCI_MsgGetState
00547 (
00548     OCI_Msg *msg
00549 )
00550 {
00551     boolean res = TRUE;
00552     sb4 ret     = 0;
00553 
00554     OCI_CHECK_PTR(OCI_IPC_MSG, msg, OCI_UNKNOWN);
00555 
00556     OCI_CALL2
00557     (
00558         res, msg->typinf->con,
00559 
00560         OCIAttrGet((dvoid *) msg->proph,
00561                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00562                    (dvoid *) &ret,
00563                    (ub4   *) NULL,
00564                    (ub4    ) OCI_ATTR_MSG_STATE,
00565                    msg->typinf->con->err)
00566     )
00567 
00568     /* increment value to handle return code OCI_UNKNOWN on failure */
00569 
00570     if (res == TRUE)
00571     {
00572         ret++;
00573     }
00574     else
00575     {
00576         ret = OCI_UNKNOWN;
00577     }
00578 
00579     OCI_RESULT(res);
00580 
00581     return (int) ret;
00582 }
00583 
00584 /* --------------------------------------------------------------------------------------------- *
00585  * OCI_MsgGetPriority
00586  * --------------------------------------------------------------------------------------------- */
00587 
00588 int OCI_API OCI_MsgGetPriority
00589 (
00590     OCI_Msg *msg
00591 )
00592 {
00593     boolean res = TRUE;
00594     sb4 ret     = 0;
00595 
00596     OCI_CHECK_PTR(OCI_IPC_MSG, msg, 0);
00597 
00598     OCI_CALL2
00599     (
00600         res, msg->typinf->con,
00601 
00602         OCIAttrGet((dvoid *) msg->proph,
00603                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00604                    (dvoid *) &ret,
00605                    (ub4   *) NULL,
00606                    (ub4    ) OCI_ATTR_PRIORITY,
00607                    msg->typinf->con->err)
00608     )
00609 
00610     OCI_RESULT(res);
00611 
00612     return (int) ret;
00613 }
00614 
00615 /* --------------------------------------------------------------------------------------------- *
00616  * OCI_MsgSetPriority
00617  * --------------------------------------------------------------------------------------------- */
00618 
00619 boolean OCI_API OCI_MsgSetPriority
00620 (
00621     OCI_Msg *msg,
00622     int      value
00623 )
00624 {
00625     boolean res = TRUE;
00626     sb4 sval    = (sb4) value;
00627 
00628     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00629 
00630     OCI_CALL2
00631     (
00632         res, msg->typinf->con,
00633 
00634         OCIAttrSet((dvoid *) msg->proph,
00635                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00636                    (dvoid *) &sval,
00637                    (ub4    ) sizeof(sval),
00638                    (ub4    ) OCI_ATTR_PRIORITY,
00639                    msg->typinf->con->err)
00640     )
00641 
00642     OCI_RESULT(res);
00643 
00644     return res;
00645 }
00646 
00647 
00648 /* --------------------------------------------------------------------------------------------- *
00649  * OCI_MsgGetID
00650  * --------------------------------------------------------------------------------------------- */
00651 
00652 boolean OCI_API OCI_MsgGetID
00653 (
00654     OCI_Msg      *msg,
00655     void         *id,
00656     unsigned int *len
00657 )
00658 {
00659     boolean res   = TRUE;
00660 
00661     OCI_CHECK_PTR(OCI_IPC_MSG,  msg, FALSE);
00662     OCI_CHECK_PTR(OCI_IPC_VOID, id,  FALSE);
00663     OCI_CHECK_PTR(OCI_IPC_VOID, len, FALSE);
00664 
00665     if (msg->id != NULL)
00666     {
00667         ub4 raw_len = OCIRawSize(msg->typinf->con->env, msg->id);
00668 
00669         if (*len > raw_len)
00670         {
00671             *len = raw_len;
00672         }
00673 
00674         memcpy(id, OCIRawPtr(msg->typinf->con->env, msg->id), (size_t) (*len));
00675     }
00676     else
00677     {
00678         *len = 0;
00679     }
00680 
00681     OCI_RESULT(res);
00682 
00683     return res;
00684 }
00685 
00686 /* --------------------------------------------------------------------------------------------- *
00687  * OCI_MsgGetOriginalID
00688  * --------------------------------------------------------------------------------------------- */
00689 
00690 boolean OCI_API OCI_MsgGetOriginalID
00691 (
00692     OCI_Msg      *msg,
00693     void         *id,
00694     unsigned int *len
00695 )
00696 {
00697     boolean res   = TRUE;
00698     OCIRaw *value = NULL;
00699 
00700     OCI_CHECK_PTR(OCI_IPC_MSG,  msg, FALSE);
00701     OCI_CHECK_PTR(OCI_IPC_VOID, id,  FALSE);
00702     OCI_CHECK_PTR(OCI_IPC_VOID, len, FALSE);
00703 
00704     OCI_CALL2
00705     (
00706         res, msg->typinf->con,
00707 
00708         OCIAttrGet((dvoid *) msg->proph,
00709                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00710                    (dvoid *) &value,
00711                    (ub4   *) NULL,
00712                    (ub4    ) OCI_ATTR_ORIGINAL_MSGID,
00713                    msg->typinf->con->err)
00714     )
00715 
00716     if (value != NULL)
00717     {
00718         ub4 raw_len = OCIRawSize(msg->typinf->con->env, value);
00719 
00720         if (*len > raw_len)
00721         {
00722             *len = raw_len;
00723         }
00724 
00725         memcpy(id, OCIRawPtr(msg->typinf->con->env, value), (size_t) (*len));
00726     }
00727     else
00728     {
00729         *len = 0;
00730     }
00731 
00732     OCI_RESULT(res);
00733 
00734     return res;
00735 }
00736 
00737 /* --------------------------------------------------------------------------------------------- *
00738  * OCI_MsgSetOriginalID
00739  * --------------------------------------------------------------------------------------------- */
00740 
00741 boolean OCI_API OCI_MsgSetOriginalID
00742 (
00743     OCI_Msg      *msg,
00744     const void   *id,
00745     unsigned int len
00746 )
00747 {
00748     boolean res   = TRUE;
00749     OCIRaw *value = NULL;
00750 
00751     OCI_CHECK_PTR(OCI_IPC_MSG,  msg, FALSE);
00752 
00753     OCI_CALL2
00754     (
00755         res, msg->typinf->con,
00756 
00757         OCIRawAssignBytes(msg->typinf->con->env, msg->typinf->con->err,
00758                           (ub1*) id, (ub4) len, (OCIRaw **) &value)
00759     )
00760 
00761     OCI_CALL2
00762     (
00763         res, msg->typinf->con,
00764 
00765         OCIAttrSet((dvoid *) msg->proph,
00766                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00767                    (dvoid *) &value,
00768                    (ub4    ) 0,
00769                    (ub4    ) OCI_ATTR_ORIGINAL_MSGID,
00770                    msg->typinf->con->err)
00771     )
00772 
00773     OCI_RESULT(res);
00774 
00775     return res;
00776 }
00777 
00778 /* --------------------------------------------------------------------------------------------- *
00779  * OCI_MsgGetCorrelation
00780  * --------------------------------------------------------------------------------------------- */
00781 
00782 const mtext * OCI_API OCI_MsgGetCorrelation
00783 (
00784     OCI_Msg *msg
00785 )
00786 {
00787     boolean res = TRUE;
00788 
00789     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00790 
00791     if (msg->correlation == NULL)
00792     {
00793         res = OCI_StringGetFromAttrHandle(msg->typinf->con,
00794                                           msg->proph,
00795                                           OCI_DTYPE_AQMSG_PROPERTIES,
00796                                           OCI_ATTR_CORRELATION,
00797                                           &msg->correlation);
00798     }
00799 
00800     OCI_RESULT(res);
00801 
00802     return msg->correlation;
00803 }
00804 
00805 /* --------------------------------------------------------------------------------------------- *
00806  * OCI_MsgSetCorrelation
00807  * --------------------------------------------------------------------------------------------- */
00808 
00809 boolean OCI_API OCI_MsgSetCorrelation
00810 (
00811     OCI_Msg     *msg,
00812     const mtext *correlation
00813 )
00814 {
00815     boolean res = TRUE;
00816 
00817     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00818 
00819     res =  OCI_StringSetToAttrHandle(msg->typinf->con,
00820                                      msg->proph,
00821                                      OCI_DTYPE_AQMSG_PROPERTIES,
00822                                      OCI_ATTR_CORRELATION,
00823                                      &msg->correlation,
00824                                      correlation);
00825 
00826     OCI_RESULT(res);
00827 
00828     return res;
00829 }
00830 
00831 /* --------------------------------------------------------------------------------------------- *
00832  * OCI_MsgGetExceptionQueue
00833  * --------------------------------------------------------------------------------------------- */
00834 
00835 const mtext * OCI_API OCI_MsgGetExceptionQueue
00836 (
00837     OCI_Msg *msg
00838 )
00839 {
00840     boolean res = TRUE;
00841 
00842     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00843 
00844     if (msg->except_queue == NULL)
00845     {
00846         res = OCI_StringGetFromAttrHandle(msg->typinf->con,
00847                                           msg->proph,
00848                                           OCI_DTYPE_AQMSG_PROPERTIES,
00849                                           OCI_ATTR_EXCEPTION_QUEUE,
00850                                           &msg->except_queue);
00851     }
00852 
00853     OCI_RESULT(res);
00854 
00855     return msg->except_queue;
00856 }
00857 
00858 /* --------------------------------------------------------------------------------------------- *
00859  * OCI_MsgSetExceptionQueue
00860  * --------------------------------------------------------------------------------------------- */
00861 
00862 boolean OCI_API OCI_MsgSetExceptionQueue
00863 (
00864     OCI_Msg     *msg,
00865     const mtext *queue
00866 )
00867 {
00868     boolean res = TRUE;
00869 
00870     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00871 
00872     res =  OCI_StringSetToAttrHandle(msg->typinf->con,
00873                                      msg->proph,
00874                                      OCI_DTYPE_AQMSG_PROPERTIES,
00875                                      OCI_ATTR_EXCEPTION_QUEUE,
00876                                      &msg->except_queue,
00877                                      queue);
00878 
00879     OCI_RESULT(res);
00880 
00881     return res;
00882 }
00883 
00884 /* --------------------------------------------------------------------------------------------- *
00885  * OCI_MsgGetSender
00886  * --------------------------------------------------------------------------------------------- */
00887 
00888 OCI_Agent * OCI_API OCI_MsgGetSender
00889 (
00890     OCI_Msg   *msg
00891 )
00892 {
00893     boolean res = TRUE;
00894     OCIAQAgent *handle = NULL;
00895     OCI_Agent  *sender = NULL;
00896 
00897     OCI_CHECK_PTR(OCI_IPC_MSG, msg, NULL);
00898 
00899     OCI_CALL2
00900     (
00901         res, msg->typinf->con,
00902 
00903         OCIAttrGet((dvoid *) msg->proph,
00904                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00905                    (dvoid *) &handle,
00906                    (ub4    ) 0,
00907                    (ub4    ) OCI_ATTR_SENDER_ID,
00908                    msg->typinf->con->err)
00909     )
00910 
00911     if ((res == TRUE) && (handle != NULL))
00912     {
00913         sender = OCI_AgentInit(msg->typinf->con, &msg->sender, handle, NULL, NULL);
00914     }
00915 
00916     OCI_RESULT(res);
00917 
00918     return sender;
00919 }
00920 
00921 /* --------------------------------------------------------------------------------------------- *
00922  * OCI_MsgSetSender
00923  * --------------------------------------------------------------------------------------------- */
00924 
00925 boolean OCI_API OCI_MsgSetSender
00926 (
00927     OCI_Msg   *msg,
00928     OCI_Agent *sender
00929 )
00930 {
00931     boolean res = TRUE;
00932 
00933     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00934 
00935     OCI_CALL2
00936     (
00937         res, msg->typinf->con,
00938 
00939         OCIAttrSet((dvoid *) msg->proph,
00940                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00941                    (dvoid *) (sender ? sender->handle : NULL),
00942                    (ub4    ) 0,
00943                    (ub4    ) OCI_ATTR_SENDER_ID,
00944                    msg->typinf->con->err)
00945     )
00946 
00947     OCI_RESULT(res);
00948 
00949     return res;
00950 }
00951 
00952 /* --------------------------------------------------------------------------------------------- *
00953  * OCI_MsgSetConsumers
00954  * --------------------------------------------------------------------------------------------- */
00955 
00956 boolean OCI_API OCI_MsgSetConsumers
00957 (
00958     OCI_Msg     *msg,
00959     OCI_Agent  **consumers,
00960     unsigned int count
00961 )
00962 {
00963     boolean res          = TRUE;
00964     OCIAQAgent **handles = NULL;
00965 
00966     OCI_CHECK_PTR(OCI_IPC_MSG, msg, FALSE);
00967 
00968     /* allocate local array of OCIAQAgent handles if needed */
00969 
00970     if ((consumers != NULL) && (count > 0))
00971     {
00972         handles = (OCIAQAgent **) OCI_MemAlloc(OCI_IPC_ARRAY,sizeof(OCIAQAgent *), count, FALSE);
00973 
00974         if (handles != NULL)
00975         {
00976             unsigned int i;
00977 
00978             for(i = 0; i < count; i++)
00979             {
00980                 handles[i] = consumers[i]->handle;
00981             }
00982         }
00983     }
00984     else
00985     {
00986         count = 0;
00987     }
00988 
00989     OCI_CALL2
00990     (
00991         res, msg->typinf->con,
00992 
00993         OCIAttrSet((dvoid *) msg->proph,
00994                    (ub4    ) OCI_DTYPE_AQMSG_PROPERTIES,
00995                    (dvoid *) handles,
00996                    (ub4    ) count,
00997                    (ub4    ) OCI_ATTR_RECIPIENT_LIST,
00998                    msg->typinf->con->err)
00999     )
01000 
01001 
01002     /* free local array of OCIAQAgent handles if needed */
01003 
01004     if (handles != NULL)
01005     {
01006         OCI_FREE(handles);
01007     }
01008 
01009     OCI_RESULT(res);
01010 
01011     return res;
01012 }