Originally I wrote the itoolkit for Python equivalent to use system API QESRSRVA to retrieve service attributes. I debugged to the point the the stored procedure is called and just directly called it.
There seems to be an issue where the maximum records returned from the iPLUG stored procedures is 4 of 3000 length each.
I have tested this with ODBC through itoolkit and JDBC through Run SQL Scripts utility. Drivers have been updated to current versions from ACS packages. I've tried both stateless and stateful (IPC) methods. User profile is setup with CCSID 37.
itool = iToolKit()
itool.add(
iPgm("retrieveServiceAttrs", "QESRSRVA", {"error": "on"})
.addParm(
iDS("receiverVar", {"len": "receriverVarLen"}) # output
.addData(iData("numServiceAttrRetrieved", "10i0"))
.addData(
iData("offsetsToServiceAttrTempls", "10i0", iopt={"dim": "14"})
)
.addData(
iDS("serviceAttrTemplates")
.addData(
iDS("key1template") # Automatic Problem Analysis
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "1a"))
)
)
.addData(
iDS("key2template") # Automatic Problem Reporting
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "1a"))
)
)
.addData(
iDS("key3template") # Service Provider to Report Problem
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("nameFormat", "1a"))
.addData(iData("serviceProviderName", "17a"))
)
)
.addData(
iDS("key4template") # PTF Install Type
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("typeOfPTFInstall", "10a"))
)
)
.addData(
iDS("key5template") # Critical Message Recipients
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("numOfEntries", "10i0", iopt={"enddo": "numOfEntries"}))
.addData(iData("userList", "10a", iopt={"dim": "50", "dou": "numOfEntries"}))
)
)
.addData(
iDS("key6template") # Send Data Packets
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "1a"))
)
)
.addData(
iDS("key7template") # Copy PTFs
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "1a"))
)
)
.addData(
iDS("key8template") # PTF group levels
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "10i0"))
)
)
.addData(
iDS("key9template") # ECS message queue
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("ecsMsgQueue", "10a"))
.addData(iData("library", "10a"))
)
)
.addData(
iDS("key10template") # System-Disabled Reporting Connection Number
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "30a"))
)
)
.addData(
iDS("key11template") # System-Disabled Call-Back Connection Number
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "30a"))
)
)
.addData(
iDS("key12template") # Service Provider Connection Number
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "30a"))
)
)
.addData(
iDS("key13template") # Order PTFs automatically
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("attr", "1a"))
)
)
.addData(
iDS("key14template") # Order PTF groups
.addData(iData("serviceAttrKey", "10i0"))
.addData(iData("dataTypeOfServiceAttr", "1a"))
.addData(iData("statusOfServiceAttr", "1a"))
.addData(iData("reserved", "2a"))
.addData(iData("lengthOfServiceAttr", "10i0"))
.addData(
iDS("serviceAttr")
.addData(iData("numOfEntries", "10i0", iopt={"enddo": "numOfEntries2"}))
.addData(iData("ptfGroupList", "10a", iopt={"dim": "20", "dou": "numOfEntries2"}))
)
)
)
)
.addParm(iData("lenOfReceiverVar", "10i0", iopt={"setlen": "receriverVarLen"})) # input
.addParm(iData("numOfServiceAttrKeys", "10i0", "14")) # input
.addParm(
iDS("serviceAttrKeys") # input
.addData(iData("key1", "10i0", "1"))
.addData(iData("key2", "10i0", "2"))
.addData(iData("key3", "10i0", "3"))
.addData(iData("key4", "10i0", "4"))
.addData(iData("key5", "10i0", "5"))
.addData(iData("key6", "10i0", "6"))
.addData(iData("key7", "10i0", "7"))
.addData(iData("key8", "10i0", "8"))
.addData(iData("key9", "10i0", "9"))
.addData(iData("key10", "10i0", "10"))
.addData(iData("key11", "10i0", "11"))
.addData(iData("key12", "10i0", "12"))
.addData(iData("key13", "10i0", "13"))
.addData(iData("key14", "10i0", "14"))
)
.addParm(
iDS("errorCode", {"len": "errorCodeLen"}) # input/output
.addData(iData("bytesProvided", "10i0")) # input
.addData(iData("bytesAvailable", "10i0")) # output
.addData(iData("exceptionID", "7a", iopt={"setlen": "errorCodeLen"})) # output
.addData(iData("reserved", "1a")) # output
#.addData(iData("exceptionData", "char(*)")) # output: TODO
)
)
Edit: It seems that the parameters do not align correctly so I will try to remap lengths appropriately (though RPG style from C style conversions seem to be correct after multiple takes). However, I believe there may still be an indirect bug. Just taking a wild guess but there may be some kind of overflow issue where more checking of sizes needs to happen. I may take a crack at debugging the RPG at some point.