Skip to content

Commit 678d659

Browse files
committed
Automatically trim returned strings
1 parent ca0b127 commit 678d659

File tree

7 files changed

+57
-31
lines changed

7 files changed

+57
-31
lines changed

ibmmq/mqi.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import "C"
5757

5858
import (
5959
"encoding/binary"
60+
"strings"
6061
"unsafe"
6162
)
6263

@@ -110,10 +111,11 @@ func (e *MQReturn) Error() string {
110111
}
111112

112113
/*
113-
* Copy a Go string into a fixed-size C char array such as MQCHAR12
114+
* Copy a Go string in "strings"
115+
to a fixed-size C char array such as MQCHAR12
114116
* Once the string has been copied, it can be immediately freed
115117
* Empty strings have first char set to 0 in MQI structures
116-
*/
118+
*/
117119
func setMQIString(a *C.char, v string, l int) {
118120
if len(v) > 0 {
119121
p := C.CString(v)
@@ -124,6 +126,23 @@ func setMQIString(a *C.char, v string, l int) {
124126
}
125127
}
126128

129+
/*
130+
* The C,GoStringN function can return strings that include
131+
* NUL characters (which is not really what is expected for a C string-related
132+
* function). So we have a utility function to remove any trailing nulls
133+
*/
134+
func trimStringN(c *C.char, l C.int) string {
135+
var rc string
136+
s := C.GoStringN(c, l)
137+
i := strings.IndexByte(s, 0)
138+
if i == -1 {
139+
rc = s
140+
} else {
141+
rc = s[0:i]
142+
}
143+
return rc
144+
}
145+
127146
/*
128147
Conn is the function to connect to a queue manager
129148
*/
@@ -242,6 +261,9 @@ func (x *MQQueueManager) Open(good *MQOD, goOpenOptions int32) (MQObject, error)
242261

243262
// ObjectName may have changed because it's a model queue
244263
object.Name = good.ObjectName
264+
if good.ObjectType == C.MQOT_TOPIC {
265+
object.Name = good.ObjectString
266+
}
245267

246268
return object, nil
247269

ibmmq/mqiMQGMO.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func copyGMOfromC(mqgmo *C.MQGMO, gogmo *MQGMO) {
107107
gogmo.WaitInterval = int32(mqgmo.WaitInterval)
108108
gogmo.Signal1 = int32(mqgmo.Signal1)
109109
gogmo.Signal2 = int32(mqgmo.Signal2)
110-
gogmo.ResolvedQName = C.GoStringN((*C.char)(&mqgmo.ResolvedQName[0]), C.MQ_OBJECT_NAME_LENGTH)
110+
gogmo.ResolvedQName = trimStringN((*C.char)(&mqgmo.ResolvedQName[0]), C.MQ_OBJECT_NAME_LENGTH)
111111
gogmo.MatchOptions = int32(mqgmo.MatchOptions)
112112
gogmo.GroupStatus = rune(mqgmo.GroupStatus)
113113
gogmo.SegmentStatus = rune(mqgmo.SegmentStatus)

ibmmq/mqiMQMD.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ func copyMDfromC(mqmd *C.MQMD, gomd *MQMD) {
159159
gomd.Feedback = int32(mqmd.Feedback)
160160
gomd.Encoding = int32(mqmd.Encoding)
161161
gomd.CodedCharSetId = int32(mqmd.CodedCharSetId)
162-
gomd.Format = C.GoStringN((*C.char)(&mqmd.Format[0]), C.MQ_FORMAT_LENGTH)
162+
gomd.Format = trimStringN((*C.char)(&mqmd.Format[0]), C.MQ_FORMAT_LENGTH)
163163
gomd.Priority = int32(mqmd.Priority)
164164
gomd.Persistence = int32(mqmd.Persistence)
165165

@@ -171,19 +171,19 @@ func copyMDfromC(mqmd *C.MQMD, gomd *MQMD) {
171171
}
172172
gomd.BackoutCount = int32(mqmd.BackoutCount)
173173

174-
gomd.ReplyToQ = C.GoStringN((*C.char)(&mqmd.ReplyToQ[0]), C.MQ_OBJECT_NAME_LENGTH)
175-
gomd.ReplyToQMgr = C.GoStringN((*C.char)(&mqmd.ReplyToQMgr[0]), C.MQ_OBJECT_NAME_LENGTH)
174+
gomd.ReplyToQ = trimStringN((*C.char)(&mqmd.ReplyToQ[0]), C.MQ_OBJECT_NAME_LENGTH)
175+
gomd.ReplyToQMgr = trimStringN((*C.char)(&mqmd.ReplyToQMgr[0]), C.MQ_OBJECT_NAME_LENGTH)
176176

177-
gomd.UserIdentifier = C.GoStringN((*C.char)(&mqmd.UserIdentifier[0]), C.MQ_USER_ID_LENGTH)
177+
gomd.UserIdentifier = trimStringN((*C.char)(&mqmd.UserIdentifier[0]), C.MQ_USER_ID_LENGTH)
178178
for i = 0; i < C.MQ_ACCOUNTING_TOKEN_LENGTH; i++ {
179179
gomd.AccountingToken[i] = (byte)(mqmd.AccountingToken[i])
180180
}
181-
gomd.ApplIdentityData = C.GoStringN((*C.char)(&mqmd.ApplIdentityData[0]), C.MQ_APPL_IDENTITY_DATA_LENGTH)
181+
gomd.ApplIdentityData = trimStringN((*C.char)(&mqmd.ApplIdentityData[0]), C.MQ_APPL_IDENTITY_DATA_LENGTH)
182182
gomd.PutApplType = int32(mqmd.PutApplType)
183-
gomd.PutApplName = C.GoStringN((*C.char)(&mqmd.PutApplName[0]), C.MQ_PUT_APPL_NAME_LENGTH)
184-
gomd.PutDate = C.GoStringN((*C.char)(&mqmd.PutDate[0]), C.MQ_PUT_DATE_LENGTH)
185-
gomd.PutTime = C.GoStringN((*C.char)(&mqmd.PutTime[0]), C.MQ_PUT_TIME_LENGTH)
186-
gomd.ApplOriginData = C.GoStringN((*C.char)(&mqmd.ApplOriginData[0]), C.MQ_APPL_ORIGIN_DATA_LENGTH)
183+
gomd.PutApplName = trimStringN((*C.char)(&mqmd.PutApplName[0]), C.MQ_PUT_APPL_NAME_LENGTH)
184+
gomd.PutDate = trimStringN((*C.char)(&mqmd.PutDate[0]), C.MQ_PUT_DATE_LENGTH)
185+
gomd.PutTime = trimStringN((*C.char)(&mqmd.PutTime[0]), C.MQ_PUT_TIME_LENGTH)
186+
gomd.ApplOriginData = trimStringN((*C.char)(&mqmd.ApplOriginData[0]), C.MQ_APPL_ORIGIN_DATA_LENGTH)
187187

188188
for i = 0; i < C.MQ_GROUP_ID_LENGTH; i++ {
189189
gomd.GroupId[i] = (byte)(mqmd.GroupId[i])

ibmmq/mqiMQOD.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,11 @@ func copyODfromC(mqod *C.MQOD, good *MQOD) {
179179

180180
good.Version = int32(mqod.Version)
181181
good.ObjectType = int32(mqod.ObjectType)
182-
good.ObjectName = C.GoStringN((*C.char)(&mqod.ObjectName[0]), C.MQ_OBJECT_NAME_LENGTH)
183-
good.ObjectQMgrName = C.GoStringN((*C.char)(&mqod.ObjectQMgrName[0]), C.MQ_OBJECT_NAME_LENGTH)
184-
good.DynamicQName = C.GoStringN((*C.char)(&mqod.DynamicQName[0]), C.MQ_OBJECT_NAME_LENGTH)
185-
good.AlternateUserId = C.GoStringN((*C.char)(&mqod.AlternateUserId[0]), C.MQ_USER_ID_LENGTH)
182+
good.ObjectName = trimStringN((*C.char)(&mqod.ObjectName[0]), C.MQ_OBJECT_NAME_LENGTH)
183+
184+
good.ObjectQMgrName = trimStringN((*C.char)(&mqod.ObjectQMgrName[0]), C.MQ_OBJECT_NAME_LENGTH)
185+
good.DynamicQName = trimStringN((*C.char)(&mqod.DynamicQName[0]), C.MQ_OBJECT_NAME_LENGTH)
186+
good.AlternateUserId = trimStringN((*C.char)(&mqod.AlternateUserId[0]), C.MQ_USER_ID_LENGTH)
186187

187188
good.RecsPresent = int32(mqod.RecsPresent)
188189
good.KnownDestCount = int32(mqod.KnownDestCount)
@@ -198,14 +199,14 @@ func copyODfromC(mqod *C.MQOD, good *MQOD) {
198199
good.AlternateSecurityId[i] = (byte)(mqod.AlternateSecurityId[i])
199200
}
200201

201-
good.ResolvedQName = C.GoStringN((*C.char)(&mqod.ResolvedQName[0]), C.MQ_OBJECT_NAME_LENGTH)
202-
good.ResolvedQMgrName = C.GoStringN((*C.char)(&mqod.ResolvedQMgrName[0]), C.MQ_OBJECT_NAME_LENGTH)
202+
good.ResolvedQName = trimStringN((*C.char)(&mqod.ResolvedQName[0]), C.MQ_OBJECT_NAME_LENGTH)
203+
good.ResolvedQMgrName = trimStringN((*C.char)(&mqod.ResolvedQMgrName[0]), C.MQ_OBJECT_NAME_LENGTH)
203204

204-
good.ObjectString = C.GoStringN((*C.char)(mqod.ObjectString.VSPtr), (C.int)(mqod.ObjectString.VSLength))
205+
good.ObjectString = trimStringN((*C.char)(mqod.ObjectString.VSPtr), (C.int)(mqod.ObjectString.VSLength))
205206
C.free(unsafe.Pointer(mqod.ObjectString.VSPtr))
206-
good.SelectionString = C.GoStringN((*C.char)(mqod.SelectionString.VSPtr), (C.int)(mqod.SelectionString.VSLength))
207+
good.SelectionString = trimStringN((*C.char)(mqod.SelectionString.VSPtr), (C.int)(mqod.SelectionString.VSLength))
207208
C.free(unsafe.Pointer(mqod.SelectionString.VSPtr))
208-
good.ResObjectString = C.GoStringN((*C.char)(mqod.ResObjectString.VSPtr), (C.int)(mqod.ResObjectString.VSLength))
209+
good.ResObjectString = trimStringN((*C.char)(mqod.ResObjectString.VSPtr), (C.int)(mqod.ResObjectString.VSLength))
209210
C.free(unsafe.Pointer(mqod.ResObjectString.VSPtr))
210211
good.ResolvedType = int32(mqod.ResolvedType)
211212

ibmmq/mqiMQPMO.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ func copyPMOfromC(mqpmo *C.MQPMO, gopmo *MQPMO) {
126126
gopmo.UnknownDestCount = int32(mqpmo.UnknownDestCount)
127127
gopmo.InvalidDestCount = int32(mqpmo.InvalidDestCount)
128128

129-
gopmo.ResolvedQName = C.GoStringN((*C.char)(&mqpmo.ResolvedQName[0]), C.MQ_OBJECT_NAME_LENGTH)
130-
gopmo.ResolvedQMgrName = C.GoStringN((*C.char)(&mqpmo.ResolvedQMgrName[0]), C.MQ_OBJECT_NAME_LENGTH)
129+
gopmo.ResolvedQName = trimStringN((*C.char)(&mqpmo.ResolvedQName[0]), C.MQ_OBJECT_NAME_LENGTH)
130+
gopmo.ResolvedQMgrName = trimStringN((*C.char)(&mqpmo.ResolvedQMgrName[0]), C.MQ_OBJECT_NAME_LENGTH)
131131

132132
gopmo.RecsPresent = int32(mqpmo.RecsPresent)
133133
gopmo.PutMsgRecFields = int32(mqpmo.PutMsgRecFields)

ibmmq/mqiMQSD.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -181,18 +181,18 @@ func copySDfromC(mqsd *C.MQSD, gosd *MQSD) {
181181
gosd.Version = int32(mqsd.Version)
182182
gosd.Options = int32(mqsd.Options)
183183

184-
gosd.ObjectName = C.GoStringN((*C.char)(&mqsd.ObjectName[0]), C.MQ_OBJECT_NAME_LENGTH)
185-
gosd.AlternateUserId = C.GoStringN((*C.char)(&mqsd.AlternateUserId[0]), C.MQ_USER_ID_LENGTH)
184+
gosd.ObjectName = trimStringN((*C.char)(&mqsd.ObjectName[0]), C.MQ_OBJECT_NAME_LENGTH)
185+
gosd.AlternateUserId = trimStringN((*C.char)(&mqsd.AlternateUserId[0]), C.MQ_USER_ID_LENGTH)
186186
for i := 0; i < C.MQ_SECURITY_ID_LENGTH; i++ {
187187
gosd.AlternateSecurityId[i] = (byte)(mqsd.AlternateSecurityId[i])
188188
}
189189
gosd.SubExpiry = int32(mqsd.SubExpiry)
190190

191-
gosd.ObjectString = C.GoStringN((*C.char)(mqsd.ObjectString.VSPtr), (C.int)(mqsd.ObjectString.VSLength))
191+
gosd.ObjectString = trimStringN((*C.char)(mqsd.ObjectString.VSPtr), (C.int)(mqsd.ObjectString.VSLength))
192192
C.free(unsafe.Pointer(mqsd.ObjectString.VSPtr))
193-
gosd.SubName = C.GoStringN((*C.char)(mqsd.SubName.VSPtr), (C.int)(mqsd.SubName.VSLength))
193+
gosd.SubName = trimStringN((*C.char)(mqsd.SubName.VSPtr), (C.int)(mqsd.SubName.VSLength))
194194
C.free(unsafe.Pointer(mqsd.SubName.VSPtr))
195-
gosd.SubUserData = C.GoStringN((*C.char)(mqsd.SubUserData.VSPtr), (C.int)(mqsd.SubUserData.VSLength))
195+
gosd.SubUserData = trimStringN((*C.char)(mqsd.SubUserData.VSPtr), (C.int)(mqsd.SubUserData.VSLength))
196196
C.free(unsafe.Pointer(mqsd.SubUserData.VSPtr))
197197

198198
for i = 0; i < C.MQ_CORREL_ID_LENGTH; i++ {
@@ -204,14 +204,14 @@ func copySDfromC(mqsd *C.MQSD, gosd *MQSD) {
204204
gosd.PubAccountingToken[i] = (byte)(mqsd.PubAccountingToken[i])
205205
}
206206

207-
gosd.PubApplIdentityData = C.GoStringN((*C.char)(&mqsd.PubApplIdentityData[0]), C.MQ_APPL_IDENTITY_DATA_LENGTH)
207+
gosd.PubApplIdentityData = trimStringN((*C.char)(&mqsd.PubApplIdentityData[0]), C.MQ_APPL_IDENTITY_DATA_LENGTH)
208208

209-
gosd.SelectionString = C.GoStringN((*C.char)(mqsd.SelectionString.VSPtr), (C.int)(mqsd.SelectionString.VSLength))
209+
gosd.SelectionString = trimStringN((*C.char)(mqsd.SelectionString.VSPtr), (C.int)(mqsd.SelectionString.VSLength))
210210
C.free(unsafe.Pointer(mqsd.SelectionString.VSPtr))
211211

212212
gosd.SubLevel = int32(mqsd.SubLevel)
213213

214-
gosd.ResObjectString = C.GoStringN((*C.char)(mqsd.ResObjectString.VSPtr), (C.int)(mqsd.ResObjectString.VSLength))
214+
gosd.ResObjectString = trimStringN((*C.char)(mqsd.ResObjectString.VSPtr), (C.int)(mqsd.ResObjectString.VSLength))
215215
C.free(unsafe.Pointer(mqsd.ResObjectString.VSPtr))
216216
return
217217
}

ibmmq/mqistr.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ func MQItoString(class string, value int) string {
9191
case "OT":
9292
s = C.GoString(C.MQOT_STR(v))
9393

94+
case "PL":
95+
s = C.GoString(C.MQPL_STR(v))
96+
9497
case "RC":
9598
s = C.GoString(C.MQRC_STR(v))
9699
if s == "" {

0 commit comments

Comments
 (0)