Files
mq-container/vendor/github.com/ibm-messaging/mq-golang/ibmmq/mqiMQCD.go
Stephen Marshall a4b9a9abaf Initial delivery of metrics code (#81)
* Initial delivery of metrics code

* Fix build issues

* Fix build issue with go vet
2018-05-24 09:15:12 +01:00

211 lines
7.3 KiB
Go

package ibmmq
/*
Copyright (c) IBM Corporation 2016
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific
Contributors:
Mark Taylor - Initial Contribution
*/
/*
#include <stdlib.h>
#include <string.h>
#include <cmqc.h>
#include <cmqxc.h>
*/
import "C"
import (
"unsafe"
)
/*
MQCD is a structure containing the MQ Channel Definition (MQCD)
Only fields relevant to a client connection are included in the
Go version of this structure.
*/
type MQCD struct {
ChannelName string
ConnectionName string
DiscInterval int32
SecurityExit string
SecurityUserData string
MaxMsgLength int32
HeartbeatInterval int32
SSLCipherSpec string
SSLPeerName string
SSLClientAuth int32
KeepAliveInterval int32
SharingConversations int32
PropertyControl int32
ClientChannelWeight int32
ConnectionAffinity int32
DefReconnect int32
CertificateLabel string
}
/*
NewMQCD fills in default values for the MQCD structure, based on the
MQCD_CLIENT_CONN_DEFAULT
*/
func NewMQCD() *MQCD {
cd := new(MQCD)
cd.ChannelName = ""
cd.DiscInterval = 6000
cd.SecurityExit = ""
cd.SecurityUserData = ""
cd.MaxMsgLength = 4194304
cd.ConnectionName = ""
cd.HeartbeatInterval = 1
cd.SSLCipherSpec = ""
cd.SSLPeerName = ""
cd.SSLClientAuth = int32(C.MQSCA_REQUIRED)
cd.KeepAliveInterval = -1
cd.SharingConversations = 10
cd.PropertyControl = int32(C.MQPROP_COMPATIBILITY)
cd.ClientChannelWeight = 0
cd.ConnectionAffinity = int32(C.MQCAFTY_PREFERRED)
cd.DefReconnect = int32(C.MQRCN_NO)
cd.CertificateLabel = ""
return cd
}
/*
It is expected that copyXXtoC and copyXXfromC will be called as
matching pairs.
Most of the fields in the MQCD structure are not relevant for client
channels, but the default settings of such fields may still not be 0
or NULL (they are just ignored). The values here are taken from
MQ_CLIENT_CONN_DEFAULT structure for consistency.
*/
func copyCDtoC(mqcd *C.MQCD, gocd *MQCD) {
setMQIString((*C.char)(&mqcd.ChannelName[0]), gocd.ChannelName, C.MQ_CHANNEL_NAME_LENGTH)
mqcd.Version = C.MQCD_VERSION_11 // The version this is written to match
mqcd.ChannelType = C.MQCHT_CLNTCONN
mqcd.TransportType = C.MQXPT_TCP
setMQIString((*C.char)(&mqcd.Desc[0]), "", C.MQ_CHANNEL_DESC_LENGTH)
setMQIString((*C.char)(&mqcd.QMgrName[0]), "", C.MQ_OBJECT_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.XmitQName[0]), "", C.MQ_OBJECT_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.ShortConnectionName[0]), "", C.MQ_SHORT_CONN_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.MCAName[0]), "", C.MQ_MCA_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.ModeName[0]), "", C.MQ_MODE_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.TpName[0]), "", C.MQ_TP_NAME_LENGTH)
mqcd.BatchSize = 50
mqcd.DiscInterval = 6000
mqcd.ShortRetryCount = 10
mqcd.ShortRetryInterval = 60
mqcd.LongRetryCount = 999999999
mqcd.LongRetryInterval = 1200
setMQIString((*C.char)(&mqcd.SecurityExit[0]), gocd.SecurityExit, C.MQ_EXIT_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.MsgExit[0]), "", C.MQ_EXIT_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.SendExit[0]), "", C.MQ_EXIT_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.ReceiveExit[0]), "", C.MQ_EXIT_NAME_LENGTH)
mqcd.SeqNumberWrap = 999999999
mqcd.MaxMsgLength = C.MQLONG(gocd.MaxMsgLength)
mqcd.PutAuthority = C.MQPA_DEFAULT
mqcd.DataConversion = C.MQCDC_NO_SENDER_CONVERSION
setMQIString((*C.char)(&mqcd.SecurityUserData[0]), gocd.SecurityUserData, C.MQ_EXIT_DATA_LENGTH)
setMQIString((*C.char)(&mqcd.MsgUserData[0]), "", C.MQ_EXIT_DATA_LENGTH)
setMQIString((*C.char)(&mqcd.SendUserData[0]), "", C.MQ_EXIT_DATA_LENGTH)
setMQIString((*C.char)(&mqcd.ReceiveUserData[0]), "", C.MQ_EXIT_DATA_LENGTH)
setMQIString((*C.char)(&mqcd.UserIdentifier[0]), "", C.MQ_USER_ID_LENGTH)
setMQIString((*C.char)(&mqcd.Password[0]), "", C.MQ_PASSWORD_LENGTH)
setMQIString((*C.char)(&mqcd.MCAUserIdentifier[0]), "", C.MQ_USER_ID_LENGTH)
mqcd.MCAType = C.MQMCAT_PROCESS
setMQIString((*C.char)(&mqcd.ConnectionName[0]), gocd.ConnectionName, C.MQ_CONN_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.RemoteUserIdentifier[0]), "", C.MQ_USER_ID_LENGTH)
setMQIString((*C.char)(&mqcd.RemotePassword[0]), "", C.MQ_PASSWORD_LENGTH)
setMQIString((*C.char)(&mqcd.MsgRetryExit[0]), "", C.MQ_EXIT_NAME_LENGTH)
setMQIString((*C.char)(&mqcd.MsgRetryUserData[0]), "", C.MQ_EXIT_DATA_LENGTH)
mqcd.MsgRetryCount = 10
mqcd.MsgRetryInterval = 1000
mqcd.HeartbeatInterval = 1
mqcd.BatchInterval = 0
mqcd.NonPersistentMsgSpeed = C.MQNPMS_FAST
mqcd.StrucLength = C.MQCD_LENGTH_11
mqcd.ExitNameLength = C.MQ_EXIT_NAME_LENGTH
mqcd.ExitDataLength = C.MQ_EXIT_DATA_LENGTH
mqcd.MsgExitsDefined = 0
mqcd.SendExitsDefined = 0
mqcd.ReceiveExitsDefined = 0
mqcd.MsgExitPtr = C.MQPTR(nil)
mqcd.MsgUserDataPtr = C.MQPTR(nil)
mqcd.SendExitPtr = C.MQPTR(nil)
mqcd.SendUserDataPtr = C.MQPTR(nil)
mqcd.ReceiveExitPtr = C.MQPTR(nil)
mqcd.ReceiveUserDataPtr = C.MQPTR(nil)
mqcd.ClusterPtr = C.MQPTR(nil)
mqcd.ClustersDefined = 0
mqcd.NetworkPriority = 0
mqcd.LongMCAUserIdLength = 0
mqcd.LongRemoteUserIdLength = 0
mqcd.LongMCAUserIdPtr = C.MQPTR(nil)
mqcd.LongRemoteUserIdPtr = C.MQPTR(nil)
C.memset((unsafe.Pointer)(&mqcd.MCASecurityId[0]), 0, C.MQ_SECURITY_ID_LENGTH)
C.memset((unsafe.Pointer)(&mqcd.RemoteSecurityId[0]), 0, C.MQ_SECURITY_ID_LENGTH)
setMQIString((*C.char)(&mqcd.SSLCipherSpec[0]), gocd.SSLCipherSpec, C.MQ_SSL_CIPHER_SPEC_LENGTH)
mqcd.SSLPeerNamePtr = C.MQPTR(nil)
mqcd.SSLPeerNameLength = 0
if gocd.SSLPeerName != "" {
mqcd.SSLPeerNamePtr = C.MQPTR(unsafe.Pointer(C.CString(gocd.SSLPeerName)))
mqcd.SSLPeerNameLength = C.MQLONG(len(gocd.SSLPeerName))
}
mqcd.SSLClientAuth = C.MQLONG(gocd.SSLClientAuth)
mqcd.KeepAliveInterval = C.MQLONG(gocd.KeepAliveInterval)
setMQIString((*C.char)(&mqcd.LocalAddress[0]), "", C.MQ_LOCAL_ADDRESS_LENGTH)
mqcd.BatchHeartbeat = 0
for i := 0; i < 2; i++ {
mqcd.HdrCompList[i] = C.MQCOMPRESS_NOT_AVAILABLE
}
for i := 0; i < 16; i++ {
mqcd.MsgCompList[i] = C.MQCOMPRESS_NOT_AVAILABLE
}
mqcd.CLWLChannelRank = 0
mqcd.CLWLChannelPriority = 0
mqcd.CLWLChannelWeight = 50
mqcd.ChannelMonitoring = C.MQMON_OFF
mqcd.ChannelStatistics = C.MQMON_OFF
mqcd.SharingConversations = C.MQLONG(gocd.SharingConversations)
mqcd.PropertyControl = C.MQLONG(gocd.PropertyControl)
mqcd.MaxInstances = 999999999
mqcd.MaxInstancesPerClient = 999999999
mqcd.ClientChannelWeight = C.MQLONG(gocd.ClientChannelWeight)
mqcd.ConnectionAffinity = C.MQLONG(gocd.ConnectionAffinity)
mqcd.BatchDataLimit = 5000
mqcd.UseDLQ = C.MQUSEDLQ_YES
mqcd.DefReconnect = C.MQLONG(gocd.DefReconnect)
setMQIString((*C.char)(&mqcd.CertificateLabel[0]), gocd.CertificateLabel, C.MQ_CERT_LABEL_LENGTH)
return
}
/*
Most of the parameters in the MQCD are input only.
Just need to clear up anything that was allocated in the copyCDtoC function
*/
func copyCDfromC(mqcd *C.MQCD, gocd *MQCD) {
if mqcd.SSLPeerNamePtr != nil {
C.free(unsafe.Pointer(mqcd.SSLPeerNamePtr))
}
return
}