80
80
their MQI counterparts.
83
import pymqe, CMQC, CMQCFC
84
85
import struct, exceptions, types, threading
86
__version__ = '1.0dev'
88
import pymqe, CMQC, CMQCFC, CMQXC
90
__version__ = '1.0trunk'
87
91
__mqlevels__ = pymqe.__mqlevels__
88
92
__mqbuild__ = pymqe.__mqbuild__
96
# 64bit suppport courtesy of Brent S. Elmer, Ph.D. (mailto:webe3vt@aim.com)
98
# On 64 bit machines when MQ is compiled 64bit, MQLONG is an int defined
99
# in /opt/mqm/inc/cmqc.h or wherever your MQ installs to.
101
# On 32 bit machines, MQLONG is a long and many other MQ data types are set to MQLONG
103
# So, set MQLONG_TYPE to 'i' for 64bit MQ and 'l' for 32bit MQ so that the
104
# conversion from the Python data types to C data types in the MQ structures
105
# will work correctly.
108
# Are we running 64 bit?
109
if struct.calcsize("P") == 8:
110
MQLONG_TYPE = 'i' # 64 bit
112
MQLONG_TYPE = 'l' # 32 bit
90
114
#######################################################################
263
287
def __init__(self, **kw):
264
288
opts = [['StrucId', CMQC.MQGMO_STRUC_ID, '4s'],
265
['Version', CMQC.MQGMO_VERSION_1, 'l'],
266
['Options', CMQC.MQGMO_NO_WAIT, 'l'],
267
['WaitInterval', 0, 'l'],
289
['Version', CMQC.MQGMO_VERSION_1, MQLONG_TYPE],
290
['Options', CMQC.MQGMO_NO_WAIT, MQLONG_TYPE],
291
['WaitInterval', 0, MQLONG_TYPE],
292
['Signal1', 0, MQLONG_TYPE],
293
['Signal2', 0, MQLONG_TYPE],
270
294
['ResolvedQName', '', '48s'],
271
['MatchOptions', CMQC.MQMO_MATCH_MSG_ID+CMQC.MQMO_MATCH_CORREL_ID, 'l'],
295
['MatchOptions', CMQC.MQMO_MATCH_MSG_ID+CMQC.MQMO_MATCH_CORREL_ID, MQLONG_TYPE],
272
296
['GroupStatus', CMQC.MQGS_NOT_IN_GROUP, 'b'],
273
297
['SegmentStatus', CMQC.MQSS_NOT_A_SEGMENT, 'b'],
274
298
['Segmentation', CMQC.MQSEG_INHIBITED, 'b'],
275
299
['Reserved1', ' ', 'c'],
276
300
['MsgToken', '', '16s'],
277
['ReturnedLength', CMQC.MQRL_UNDEFINED, 'l'],]
301
['ReturnedLength', CMQC.MQRL_UNDEFINED, MQLONG_TYPE],]
279
303
if "7.0" in pymqe.__mqlevels__:
281
['Reserved2', 0L, 'l'],
305
['Reserved2', 0L, MQLONG_TYPE],
282
306
['MsgHandle', 0L, 'q']]
284
308
apply(MQOpts.__init__, (self, tuple(opts)), kw)
294
318
def __init__(self, **kw):
296
320
['StrucId', CMQC.MQPMO_STRUC_ID, '4s'],
297
['Version', CMQC.MQPMO_VERSION_1, 'l'],
298
['Options', CMQC.MQPMO_NONE, 'l'],
299
['Timeout', -1, 'l'],
301
['KnownDestCount', 0, 'l'],
302
['UnknownDestCount', 0, 'l'],
303
['InvalidDestCount', 0, 'l'],
321
['Version', CMQC.MQPMO_VERSION_1, MQLONG_TYPE],
322
['Options', CMQC.MQPMO_NONE, MQLONG_TYPE],
323
['Timeout', -1, MQLONG_TYPE],
324
['Context', 0, MQLONG_TYPE],
325
['KnownDestCount', 0, MQLONG_TYPE],
326
['UnknownDestCount', 0, MQLONG_TYPE],
327
['InvalidDestCount', 0, MQLONG_TYPE],
304
328
['ResolvedQName', '', '48s'],
305
329
['ResolvedQMgrName', '', '48s'],
306
['RecsPresent', 0, 'l'],
307
['PutMsgRecFields', 0, 'l'],
308
['PutMsgRecOffset', 0,'l'],
309
['ResponseRecOffset', 0, 'l'],
330
['RecsPresent', 0, MQLONG_TYPE],
331
['PutMsgRecFields', 0, MQLONG_TYPE],
332
['PutMsgRecOffset', 0, MQLONG_TYPE],
333
['ResponseRecOffset', 0, MQLONG_TYPE],
310
334
['PutMsgRecPtr', 0, 'P'],
311
335
['ResponseRecPtr', 0, 'P']]
329
353
def __init__(self, **kw):
330
354
opts = [['StrucId', CMQC.MQOD_STRUC_ID, '4s'],
331
['Version', CMQC.MQOD_VERSION_1, 'l'],
332
['ObjectType', CMQC.MQOT_Q, 'l'],
355
['Version', CMQC.MQOD_VERSION_1, MQLONG_TYPE],
356
['ObjectType', CMQC.MQOT_Q, MQLONG_TYPE],
333
357
['ObjectName', '', '48s'],
334
358
['ObjectQMgrName', '', '48s'],
335
359
['DynamicQName', 'AMQ.*', '48s'],
336
360
['AlternateUserId', '', '12s'],
337
['RecsPresent', 0, 'l'],
338
['KnownDestCount', 0, 'l'],
339
['UnknownDestCount', 0, 'l'],
340
['InvalidDestCount', 0, 'l'],
341
['ObjectRecOffset', 0, 'l'],
342
['ResponseRecOffset', 0, 'l'],
361
['RecsPresent', 0, MQLONG_TYPE],
362
['KnownDestCount', 0, MQLONG_TYPE],
363
['UnknownDestCount', 0, MQLONG_TYPE],
364
['InvalidDestCount', 0, MQLONG_TYPE],
365
['ObjectRecOffset', 0, MQLONG_TYPE],
366
['ResponseRecOffset', 0, MQLONG_TYPE],
343
367
['ObjectRecPtr', 0, 'P'],
344
368
['ResponseRecPtr', 0, 'P'],
345
369
['AlternateSecurityId', '', '40s'],
349
373
if "7.0" in pymqe.__mqlevels__:
351
['ObjectStringVSPtr', 0L, 'l'],
352
['ObjectStringVSOffset', 0L, 'l'],
353
['ObjectStringVSBufSize', 0L, 'l'],
354
['ObjectStringVSLength', 0L, 'l'],
355
['ObjectStringVSCCSID', 0L, 'l'],
356
['SelectionStringVSPtr', 0L, 'l'],
357
['SelectionStringVSOffset', 0L, 'l'],
358
['SelectionStringVSBufSize', 0L, 'l'],
359
['SelectionStringVSLength', 0L, 'l'],
360
['SelectionStringVSCCSID', 0L, 'l'],
361
['ResObjectStringVSPtr', 0L, 'l'],
362
['ResObjectStringVSOffset', 0L, 'l'],
363
['ResObjectStringVSBufSize', 0L, 'l'],
364
['ResObjectStringVSLength', 0L, 'l'],
365
['ResObjectStringVSCCSID', 0L, 'l'],
366
['ResolvedType', -3L, 'l']]
377
['ObjectStringVSPtr', 0, 'P'],
378
['ObjectStringVSOffset', 0L, MQLONG_TYPE],
379
['ObjectStringVSBufSize', 0L, MQLONG_TYPE],
380
['ObjectStringVSLength', 0L, MQLONG_TYPE],
381
['ObjectStringVSCCSID', 0L, MQLONG_TYPE],
384
['SelectionStringVSPtr', 0, 'P'],
385
['SelectionStringVSOffset', 0L, MQLONG_TYPE],
386
['SelectionStringVSBufSize', 0L, MQLONG_TYPE],
387
['SelectionStringVSLength', 0L, MQLONG_TYPE],
388
['SelectionStringVSCCSID', 0L, MQLONG_TYPE],
391
['ResObjectStringVSPtr', 0, 'P'],
392
['ResObjectStringVSOffset', 0L, MQLONG_TYPE],
393
['ResObjectStringVSBufSize', 0L, MQLONG_TYPE],
394
['ResObjectStringVSLength', 0L, MQLONG_TYPE],
395
['ResObjectStringVSCCSID', 0L, MQLONG_TYPE],
397
['ResolvedType', -3L, MQLONG_TYPE]]
399
# For 64bit platforms MQLONG is an int and this pad
400
# needs to be here for WMQ 7.0
401
if MQLONG_TYPE == 'i':
402
opts += [['pad','', '4s']]
368
404
apply(MQOpts.__init__, (self, tuple(opts)), kw)
378
414
def __init__(self, **kw):
379
415
apply(MQOpts.__init__, (self, (
380
416
['StrucId', CMQC.MQMD_STRUC_ID, '4s'],
381
['Version', CMQC.MQMD_VERSION_1, 'l'],
382
['Report', CMQC.MQRO_NONE, 'l'],
383
['MsgType', CMQC.MQMT_DATAGRAM, 'l'],
384
['Expiry', CMQC.MQEI_UNLIMITED, 'l'],
385
['Feedback', CMQC.MQFB_NONE, 'l'],
386
['Encoding', CMQC.MQENC_NATIVE, 'l'],
387
['CodedCharSetId', CMQC.MQCCSI_Q_MGR, 'l'],
417
['Version', CMQC.MQMD_VERSION_1, MQLONG_TYPE],
418
['Report', CMQC.MQRO_NONE, MQLONG_TYPE],
419
['MsgType', CMQC.MQMT_DATAGRAM, MQLONG_TYPE],
420
['Expiry', CMQC.MQEI_UNLIMITED, MQLONG_TYPE],
421
['Feedback', CMQC.MQFB_NONE, MQLONG_TYPE],
422
['Encoding', CMQC.MQENC_NATIVE, MQLONG_TYPE],
423
['CodedCharSetId', CMQC.MQCCSI_Q_MGR, MQLONG_TYPE],
388
424
['Format', '', '8s'],
389
['Priority', CMQC.MQPRI_PRIORITY_AS_Q_DEF,'l'],
390
['Persistence', CMQC.MQPER_PERSISTENCE_AS_Q_DEF, 'l'],
425
['Priority', CMQC.MQPRI_PRIORITY_AS_Q_DEF, MQLONG_TYPE],
426
['Persistence', CMQC.MQPER_PERSISTENCE_AS_Q_DEF, MQLONG_TYPE],
391
427
['MsgId', '', '24s'],
392
428
['CorrelId', '', '24s'],
393
['BackoutCount', 0, 'l'],
429
['BackoutCount', 0, MQLONG_TYPE],
394
430
['ReplyToQ', '', '48s'],
395
431
['ReplyToQMgr', '', '48s'],
396
432
['UserIdentifier', '', '12s'],
397
433
['AccountingToken', '', '32s'],
398
434
['ApplIdentityData', '', '32s'],
399
['PutApplType', CMQC.MQAT_NO_CONTEXT, 'l'],
435
['PutApplType', CMQC.MQAT_NO_CONTEXT, MQLONG_TYPE],
400
436
['PutApplName', '', '28s'],
401
437
['PutDate', '', '8s'],
402
438
['PutTime', '', '8s'],
403
439
['ApplOriginData', '', '4s'],
404
440
['GroupId', '', '24s'],
405
['MsgSeqNumber', 1, 'l'],
407
['MsgFlags', CMQC.MQMF_NONE, 'l'],
408
['OriginalLength', CMQC.MQOL_UNDEFINED, 'l'])), kw)
441
['MsgSeqNumber', 1, MQLONG_TYPE],
442
['Offset', 0, MQLONG_TYPE],
443
['MsgFlags', CMQC.MQMF_NONE, MQLONG_TYPE],
444
['OriginalLength', CMQC.MQOL_UNDEFINED, MQLONG_TYPE])), kw)
411
447
# MQCONNX code courtesy of John OSullivan (mailto:jos@onebox.com)
418
454
default values may be overridden by the optional keyword arguments
457
# The MQCD_VERSION & MQCD_LENGTH_* we're going to use depend on the WMQ
458
# version we had been compiled with but it is not known on Python side
459
# until runtime so set it once here when first importing pymqi
460
# (originally written by Brent S. Elmer, Ph.D. (mailto:webe3vt@aim.com)).
462
if '7.0' in pymqe.__mqlevels__:
463
_mqcd_version = CMQXC.MQCD_VERSION_9
464
_mqcd_current_length = CMQXC.MQCD_LENGTH_9
466
elif '6.0' in pymqe.__mqlevels__:
467
_mqcd_version = CMQXC.MQCD_VERSION_8
468
_mqcd_current_length = CMQXC.MQCD_LENGTH_8
470
elif '5.3' in pymqe.__mqlevels__:
471
_mqcd_version = CMQXC.MQCD_VERSION_7
472
_mqcd_current_length = CMQXC.MQCD_LENGTH_7
475
# The default version in MQCD_DEFAULT in cmqxc.h is MQCD_VERSION_6
476
_mqcd_version = CMQXC.MQCD_VERSION_6
477
_mqcd_current_length = CMQXC.MQCD_LENGTH_6
421
479
def __init__(self, **kw):
423
482
['ChannelName', '', '20s'],
424
['Version', CMQC.MQCD_CURRENT_VERSION, 'l'],
425
['ChannelType', CMQC.MQCHT_SENDER, 'l'],
426
['TransportType', CMQC.MQXPT_LU62, 'l'],
483
['Version', self._mqcd_version, MQLONG_TYPE],
484
['ChannelType', CMQC.MQCHT_SENDER, MQLONG_TYPE],
485
['TransportType', CMQC.MQXPT_LU62, MQLONG_TYPE],
427
486
['Desc', '', '64s'],
428
487
['QMgrName', '', '48s'],
429
488
['XmitQName', '', '48s'],
431
490
['MCAName', '', '20s'],
432
491
['ModeName', '', '8s'],
433
492
['TpName', '', '64s'],
434
['BatchSize', 50L, 'l'],
435
['DiscInterval', 6000L, 'l'],
436
['ShortRetryCount', 10L, 'l'],
437
['ShortRetryInterval', 60L, 'l'],
438
['LongRetryCount', 999999999L, 'l'],
439
['LongRetryInterval', 1200L, 'l'],
493
['BatchSize', 50L, MQLONG_TYPE],
494
['DiscInterval', 6000L, MQLONG_TYPE],
495
['ShortRetryCount', 10L, MQLONG_TYPE],
496
['ShortRetryInterval', 60L, MQLONG_TYPE],
497
['LongRetryCount', 999999999L, MQLONG_TYPE],
498
['LongRetryInterval', 1200L, MQLONG_TYPE],
440
499
['SecurityExit', '', '128s'],
441
500
['MsgExit', '', '128s'],
442
501
['SendExit', '', '128s'],
443
502
['ReceiveExit', '', '128s'],
444
['SeqNumberWrap', 999999999L, 'l'],
445
['MaxMsgLength', 4194304L, 'l'],
446
['PutAuthority', CMQC.MQPA_DEFAULT, 'l'],
447
['DataConversion', CMQC.MQCDC_NO_SENDER_CONVERSION, 'l'],
503
['SeqNumberWrap', 999999999L, MQLONG_TYPE],
504
['MaxMsgLength', 4194304L, MQLONG_TYPE],
505
['PutAuthority', CMQC.MQPA_DEFAULT, MQLONG_TYPE],
506
['DataConversion', CMQC.MQCDC_NO_SENDER_CONVERSION, MQLONG_TYPE],
448
507
['SecurityUserData', '', '32s'],
449
508
['MsgUserData', '', '32s'],
450
509
['SendUserData', '', '32s'],
452
511
['UserIdentifier', '', '12s'],
453
512
['Password', '', '12s'],
454
513
['MCAUserIdentifier', '', '12s'],
455
['MCAType', CMQC.MQMCAT_PROCESS, 'l'],
514
['MCAType', CMQC.MQMCAT_PROCESS, MQLONG_TYPE],
456
515
['ConnectionName', '', '264s'],
457
516
['RemoteUserIdentifier', '', '12s'],
458
517
['RemotePassword', '', '12s'],
459
518
['MsgRetryExit', '', '128s'],
460
519
['MsgRetryUserData', '', '32s'],
461
['MsgRetryCount', 10L, 'l'],
462
['MsgRetryInterval', 1000L, 'l'],
463
['HeartbeatInterval', 300L, 'l'],
464
['BatchInterval', 0L, 'l'],
465
['NonPersistentMsgSpeed', CMQC.MQNPMS_FAST, 'l'],
466
['StrucLength', CMQC.MQCD_CURRENT_LENGTH, 'l'],
467
['ExitNameLength', CMQC.MQ_EXIT_NAME_LENGTH, 'l'],
468
['ExitDataLength', CMQC.MQ_EXIT_DATA_LENGTH, 'l'],
469
['MsgExitsDefined', 0L, 'l'],
470
['SendExitsDefined', 0L, 'l'],
471
['ReceiveExitsDefined', 0L, 'l'],
520
['MsgRetryCount', 10L, MQLONG_TYPE],
521
['MsgRetryInterval', 1000L, MQLONG_TYPE],
522
['HeartbeatInterval', 300L, MQLONG_TYPE],
523
['BatchInterval', 0L, MQLONG_TYPE],
524
['NonPersistentMsgSpeed', CMQC.MQNPMS_FAST, MQLONG_TYPE],
525
['StrucLength', self._mqcd_current_length, MQLONG_TYPE],
526
['ExitNameLength', CMQC.MQ_EXIT_NAME_LENGTH, MQLONG_TYPE],
527
['ExitDataLength', CMQC.MQ_EXIT_DATA_LENGTH, MQLONG_TYPE],
528
['MsgExitsDefined', 0L, MQLONG_TYPE],
529
['SendExitsDefined', 0L, MQLONG_TYPE],
530
['ReceiveExitsDefined', 0L, MQLONG_TYPE],
472
531
['MsgExitPtr', 0, 'P'],
473
532
['MsgUserDataPtr', 0, 'P'],
474
533
['SendExitPtr', 0, 'P'],
476
535
['ReceiveExitPtr', 0, 'P'],
477
536
['ReceiveUserDataPtr', 0, 'P'],
478
537
['ClusterPtr', 0, 'P'],
479
['ClustersDefined', 0L, 'l'],
480
['NetworkPriority', 0L, 'l'],
481
['LongMCAUserIdLength', 0L, 'l'],
482
['LongRemoteUserIdLength', 0L, 'l'],
538
['ClustersDefined', 0L, MQLONG_TYPE],
539
['NetworkPriority', 0L, MQLONG_TYPE],
540
['LongMCAUserIdLength', 0L, MQLONG_TYPE],
541
['LongRemoteUserIdLength', 0L, MQLONG_TYPE],
483
542
['LongMCAUserIdPtr', 0, 'P'],
484
543
['LongRemoteUserIdPtr', 0, 'P'],
485
544
['MCASecurityId', '', '40s'],
489
548
# implied by 5.3.
490
549
if "5.3" in pymqe.__mqlevels__:
491
550
opts += [['SSLCipherSpec','','32s'],
492
['SSLPeerName',0,'P'],
493
['SSLPeerNameLength',0L,'l'],
494
['SSLClientAuth',0L,'l'],
495
['KeepAliveInterval',-1,'l'],
551
['SSLPeerNamePtr',0,'P'],
552
['SSLPeerNameLength',0L,MQLONG_TYPE],
553
['SSLClientAuth',0L,MQLONG_TYPE],
554
['KeepAliveInterval',-1,MQLONG_TYPE],
496
555
['LocalAddress','','48s'],
497
['BatchHeartbeat',0L,'l']]
556
['BatchHeartbeat',0L,MQLONG_TYPE]]
499
558
# No mqaiExecute means no 5.3, so redefine the struct version
500
opts[1] = ['Version', CMQC.MQCD_VERSION_6, 'l']
559
opts[1] = ['Version', CMQC.MQCD_VERSION_6, MQLONG_TYPE]
502
561
if "6.0" in pymqe.__mqlevels__:
503
opts += [['HdrCompList', [0L, -1L], '2l'],
504
['MsgCompList', [0] + 15 * [-1L], '16l'],
505
['CLWLChannelRank', 0L, 'l'],
506
['CLWLChannelPriority', 0L, 'l'],
507
['CLWLChannelWeight', 50L, 'l'],
508
['ChannelMonitoring', 0L, 'l'],
509
['ChannelStatistics', 0L, 'l']]
562
opts += [['HdrCompList', [0L, -1L], '2' + MQLONG_TYPE],
563
['MsgCompList', [0] + 15 * [-1L], '16' + MQLONG_TYPE],
564
['CLWLChannelRank', 0L, MQLONG_TYPE],
565
['CLWLChannelPriority', 0L, MQLONG_TYPE],
566
['CLWLChannelWeight', 50L, MQLONG_TYPE],
567
['ChannelMonitoring', 0L, MQLONG_TYPE],
568
['ChannelStatistics', 0L, MQLONG_TYPE]]
511
570
if "7.0" in pymqe.__mqlevels__:
512
opts += [['SharingConversations', 10, 'l'],
513
['PropertyControl', 0, 'l'], # 0 = MQPROP_COMPATIBILITY
514
['MaxInstances', 999999999, 'l'],
515
['MaxInstancesPerClient', 999999999, 'l'],
516
['ClientChannelWeight', 0, 'l'],
517
['ConnectionAffinity', 1, 'l']] # 1 = MQCAFTY_PREFERRED
571
opts += [['SharingConversations', 10, MQLONG_TYPE],
572
['PropertyControl', 0, MQLONG_TYPE], # 0 = MQPROP_COMPATIBILITY
573
['MaxInstances', 999999999, MQLONG_TYPE],
574
['MaxInstancesPerClient', 999999999, MQLONG_TYPE],
575
['ClientChannelWeight', 0, MQLONG_TYPE],
576
['ConnectionAffinity', 1, MQLONG_TYPE]] # 1 = MQCAFTY_PREFERRED
578
# In theory, the pad should've been placed right before the 'MsgExitPtr'
579
# attribute, however setting it there makes no effect and that's why
580
# it's being set here, as a last element in the list.
581
if MQLONG_TYPE == 'i':
582
opts += [['pad','', '4s']]
519
584
apply(MQOpts.__init__, (self, tuple(opts)), kw)
531
596
def __init__(self, **kw):
533
598
['StrucId', CMQC.MQSCO_STRUC_ID, '4s'],
534
['Version', CMQC.MQSCO_VERSION_1, 'l'],
599
['Version', CMQC.MQSCO_VERSION_1, MQLONG_TYPE],
535
600
['KeyRepository', '', '256s'],
536
601
['CryptoHardware', '', '256s'],
537
['AuthInfoRecCount', 0L, 'l'],
538
['AuthInfoRecOffset', 0L, 'l'],
602
['AuthInfoRecCount', 0L, MQLONG_TYPE],
603
['AuthInfoRecOffset', 0L, MQLONG_TYPE],
539
604
['AuthInfoRecPtr', 0, 'P']]
541
606
# Add new SSL fields defined in 6.0 and update version to 2
542
607
if "6.0" in pymqe.__mqlevels__:
543
opts += [['KeyResetCount', 0L, 'l'],
544
['FipsRequired', 0L, 'l']]
608
opts += [['KeyResetCount', 0L, MQLONG_TYPE],
609
['FipsRequired', 0L, MQLONG_TYPE]]
546
611
apply(MQOpts.__init__, (self, tuple(opts)), kw)