OCILIB (C Driver for Oracle) 3.12.1
|
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 }