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