jt400helper.py

  1. #coding=utf-8
  2. import jpype
  3. import os
  4.  
  5. class JT400Helper(object):
  6. def __init__(self, server,username,pwd):
  7. jvmpath=r"C:\Program Files\Java\jre1.8.0_60\bin\server\jvm.dll"
  8. jarpath=r'd:\temp\jt400.jar'
  9. jvmArg = "-Djava.class.path=%s" % jarpath
  10. jpype.startJVM(jvmpath,jvmArg)
  11.  
  12. #jt400
  13. AS400=jpype.JClass('com.ibm.as400.access.AS400')
  14. CommandCall=jpype.JClass('com.ibm.as400.access.CommandCall')
  15. ProgramCall=jpype.JClass('com.ibm.as400.access.ProgramCall')
  16. SpooledFileList=jpype.JClass('com.ibm.as400.access.SpooledFileList')
  17. AS400Text=jpype.JClass('com.ibm.as400.access.AS400Text')
  18. AS400JDBCDriver=jpype.JClass('com.ibm.as400.access.AS400JDBCDriver')
  19.  
  20. #java
  21. Connection=jpype.JClass('java.sql.Connection')
  22. DatabaseMetaData=jpype.JClass('java.sql.DatabaseMetaData')
  23. Statement=jpype.JClass('java.sql.Statement')
  24. self.ResultSet=jpype.JClass('java.sql.ResultSet')
  25.  
  26. self.server,self.username,self.pwd = server,username,pwd
  27. self.RJobLog=jpype.JClass('com.ibm.as400.resource.RJobLog')
  28. self.AS400FTP=jpype.JClass('com.ibm.as400.access.AS400FTP')
  29. self.IFSFile=jpype.JClass('com.ibm.as400.access.IFSFile')
  30. self.ObjectDescription=jpype.JClass('com.ibm.as400.access.ObjectDescription')
  31.  
  32. self.ProgramParameter=jpype.JClass('com.ibm.as400.access.ProgramParameter')
  33. self.DriverManager=jpype.JClass('java.sql.DriverManager')
  34. self.DriverManager.registerDriver(AS400JDBCDriver())
  35.  
  36. self.system=AS400(server,username,pwd)
  37. self.cc=CommandCall(self.system)
  38. self.outqueue = SpooledFileList(self.system)
  39. self.pc = ProgramCall(self.system)
  40.  
  41. def ShowIfs(self,ifspath):
  42. ifs=self.IFSFile(self.system,ifspath)
  43. print 'exists : ',ifs.exists()
  44. print 'isDirectory : ',ifs.isDirectory()
  45. print 'isFile : ',ifs.isFile()
  46. fs=ifs.listFiles()
  47. if len(fs)>0:
  48. for f in fs:
  49. print f.name
  50.  
  51. def ShowObj2(self,lib,obj):
  52. od = self.ObjectDescription(system,lib,obj,"FILE")
  53. print od.CHANGE_DATE_AND_TIME
  54.  
  55. def ShowObj(self,lib,obj,tmplib):
  56. cmdstr = "DSPOBJD OBJ(%s/%s) OBJTYPE(*PGM) OUTPUT(*OUTFILE) OUTFILE(%s/OBJD)" % (lib,obj,tmplib)
  57. msg = self.GetCmdMsg(cmdstr)
  58. if msg == "":
  59. cmdstr = "SELECT ODLBNM, ODOBNM, ODOBTP, ODOBAT,ODOBSZ , ODOBTX, ODLDAT, ODLTIM, ODOBSY, ODCRTU, ODJRST, ODJRNM, ODJRLB, ODJRIM, ODJREN,ODJRCN, ODJRDT, ODJRTI FROM %s.objd" % tmplib
  60. self.GetSQLResult(cmdstr)
  61.  
  62. def SaveFieldDef(self,flib,file,tmplib,ofile):
  63. cmdstr = "DSPFFD FILE(%s/%s) OUTPUT(*OUTFILE) OUTFILE(%s/FIELDDEF)" % (flib,file,tmplib)
  64. msg = self.GetCmdMsg(cmdstr)
  65. if msg == "":
  66. cmdstr = "SELECT WHFLDI, WHFTXT, WHFLDT, WHFLDD, WHFLDP,WHFLDB, WHFOBO FROM %s.FIELDDEF WHERE WHFLDI <> ' ' ORDER BY WHFOBO" % tmplib
  67. self.GetSQLResult(cmdstr,ofile)
  68.  
  69. def SaveJobLog(self,jobstr,ofile):
  70. msg = self.GetJobLog(jobstr)
  71. with open(ofile,'w') as f:
  72. f.write(msg)
  73.  
  74. def GetJobLog(self,jobstr):
  75. jobarr = jobstr.split('/')
  76. jobnum,jobuser,jobname=jobarr[0],jobarr[1],jobarr[2]
  77. return self.GetJobLogByNum(jobnum,jobuser,jobname)
  78.  
  79. def GetJobLogByNum(self,jobnum,jobuser,jobname):
  80. joblog=self.RJobLog(self.system,jobname,jobuser,jobnum)
  81. joblog.open()
  82. joblog.waitForComplete()
  83. num=joblog.getListLength()
  84. msgs = []
  85. for i in range(0,num):
  86. qmsg=joblog.resourceAt(i)
  87. msgs.append(qmsg.getAttributeValue("MESSAGE_TEXT"))
  88. msg = '\n'.join(msgs)
  89. return msg
  90.  
  91. def GetSQLResult(self,cmdstr,ofile=""):
  92. connection = self.DriverManager.getConnection("jdbc:as400://" + self.server, self.username, self.pwd)
  93. dmd = connection.getMetaData()
  94. select = connection.createStatement(self.ResultSet.TYPE_SCROLL_SENSITIVE,self.ResultSet.CONCUR_UPDATABLE)
  95. print cmdstr
  96. rs = select.executeQuery(cmdstr)
  97. strs = ""
  98. cols = rs.getMetaData().getColumnCount()
  99. while (rs.next()):
  100. rowstrs = []
  101. for i in range(1,cols+1):
  102. value = rs.getString(i)
  103. if ' ' in value:
  104. value = '"%s"' % value
  105. rowstrs.append(rs.getString(i))
  106. strs+=','.join(rowstrs)+'\n'
  107. connection.close();
  108. if ofile <> "":
  109. with open(ofile,'w') as f:
  110. f.write(strs)
  111. else:
  112. print strs
  113.  
  114. def CallProgram(self,plib,pgm,paras):
  115. #WRKACTJOB SBS(QUSRWRK) JOB(QZRCSRVS) - dump not work
  116. #paras=["Y","12345"," "]
  117. pgmparas=[]
  118. for para in paras:
  119. pgmparas.append(ProgramParameter(para))
  120. print str(pgmparas.getInputData())
  121. self.pc.setProgram("/QSYS.LIB/%s.LIB/%s.PGM" % (plib,pgm),pgmparas)
  122. successfully = self.pc.run()
  123. msg = ''
  124. job = pc.getJob()
  125. print pc.toString()
  126. print job.toString()
  127. if successfully <> True:
  128. ml=self.pc.getMessageList()
  129. for m in ml:
  130. msg += m.getText() +'\n'
  131. print msg
  132. self.system.disconnectAllServices()
  133. return msg
  134.  
  135. def GetCmdMsg(self,cmdstr):
  136. msg = ''
  137. print cmdstr
  138. successfully = self.cc.run(cmdstr)
  139. if successfully <> True:
  140. ml=self.cc.getMessageList()
  141. for m in ml:
  142. msg += m.getText() +'\n'
  143. print msg
  144. return msg
  145.  
  146. def CheckObjExists(self,lib,file,type="*FILE"):
  147. str = "CHKOBJ OBJ(%s/%s) OBJTYPE(%s)" % (lib,file,type)
  148. return self.GetCmdMsg(str)
  149.  
  150. def DeleteObj(self,lib,file):
  151. str = "DLTF FILE(%s/%s)" % (lib,file)
  152. return self.GetCmdMsg(str)
  153.  
  154. def FileToIfs(self,lib,file,mem,ifspath):
  155. # don't use RMVBLANK(*TRAILING) ,will cause numeric field contains blank characters error when put ifs to file
  156. str = "CPYTOIMPF FROMFILE(%s/%s %s) TOSTMF('%s') MBROPT(*REPLACE) STMFCCSID(*STMF) RCDDLM(*CRLF) DTAFMT(*DLM) STRDLM(*NONE)" % (lib,file,mem,ifspath)
  157. print lib,file,mem,"->",ifspath
  158. return self.GetCmdMsg(str)
  159.  
  160. def IfsToFile(self,ifspath,lib,file,mem):
  161. str = "CPYFRMIMPF FROMSTMF('%s') TOFILE(%s/%s %s) MBROPT(*REPLACE) RCDDLM(*CRLF) STRDLM(*NONE) FLDDLM(',') ERRRCDOPT(*REPLACE) RPLNULLVAL(*FLDDFT)" % (ifspath,lib,file,mem)
  162. print ifspath,"->",lib,file,mem
  163. return self.GetCmdMsg(str)
  164.  
  165. def FileToPc(self,lib,file,mem,ofile):
  166. tmpifs = "QDLS/TEMP/%s.CSV" % mem
  167. self.FileToIfs(lib,file,mem,tmpifs)
  168. self.FtpGetIfsFile(tmpifs,ofile)
  169.  
  170. def PcToFile(self,ifile,lib,file,mem):
  171. tmpifs = "QDLS/TEMP/%s.CSV" % mem
  172. self.FtpPutIfsFile(ifile,tmpifs)
  173. self.IfsToFile(tmpifs,lib,file,mem)
  174.  
  175. def FtpGetIfsFile(self,ifspath,ofile):
  176. ftp=self.AS400FTP(self.system)
  177. successfully = ftp.get(ifspath,ofile)
  178. print ifspath,"->",ofile
  179. return successfully
  180.  
  181. def FtpGetText(self,lib,srcf,mem,dest=r"d:\temp"):
  182. ftp=self.AS400FTP(self.system)
  183. target="/QSYS.LIB/%s.LIB/%s.FILE/%s.MBR" % (lib,srcf,mem)
  184. if os.path.isdir(dest):
  185. dest=os.path.join(dest,mem+".txt")
  186. print target,"->",dest
  187. successfully = ftp.get(target,dest)
  188. return successfully
  189.  
  190. def FtpGetSavf(self,lib,savf,dest=r"d:\temp"):
  191. ftp=self.AS400FTP(self.system)
  192. target="/QSYS.LIB/%s.LIB/%s.SAVF" % (lib,savf)
  193. # QUOTE SITE NAMEFMT 0 QGPL/QCLSRC.TEST
  194. # QUOTE SITE NAMEFMT 1 /QSYS.lib/Libname.lib/Fname.file/Mname.mbr
  195. ftp.issueCommand("quote site namefmt 1")
  196. if os.path.isdir(dest):
  197. dest=os.path.join(dest,savf+".SAVF")
  198. # can not get it if not set data transfer type
  199. ftp.setDataTransferType(1)
  200. successfully = ftp.get(target,dest)
  201. return successfully
  202.  
  203. def FtpPutIfsFile(self,ifile,ifspath):
  204. ftp=self.AS400FTP(self.system)
  205. successfully = ftp.put(ifile,ifspath)
  206. print ifile,"->",ifspath
  207. return successfully
  208.  
  209. def FtpPutText(self,ifile,lib,srcf,mem):
  210. ftp=self.AS400FTP(self.system)
  211. dest="/QSYS.LIB/%s.LIB/%s.FILE/%s.MBR" % (lib,srcf,mem)
  212. successfully = ftp.put(ifile,dest)
  213. print ifile,"->",lib,srcf,mem
  214. return successfully
  215.  
  216. def GetOutQList(self,outqlib,outq):
  217. print "OutQueue : %s/%s" % (outqlib,outq)
  218. self.outqueue.setQueueFilter("/QSYS.LIB/%s.LIB/%s.OUTQ" % (outqlib,outq))
  219. self.outqueue.setUserFilter("*ALL")
  220. self.outqueue.openSynchronously()
  221. enums=self.outqueue.getObjects()
  222. i = 1
  223. info = ""
  224. while (enums.hasMoreElements()):
  225. splf=enums.nextElement()
  226. if(splf<>None):
  227. strs=[]
  228. strs.append("System :%s , File : %s , File Number : %s , Progarm :%s , Date : %s" % (splf.getStringAttribute(271),splf.getStringAttribute(104),splf.getIntegerAttribute(105).toString(),splf.getStringAttribute(272),splf.getStringAttribute(34)))
  229. strs.append("Number/User/Job : %s/%s/%s" % (splf.getStringAttribute(60),splf.getStringAttribute(62),splf.getStringAttribute(59)))
  230. strs.append("File Pages: %s , Print quality : %s , Printer device type : %s , Page size length : %d " % (splf.getIntegerAttribute(111).toString(),splf.getStringAttribute(48),splf.getStringAttribute(90),splf.getFloatAttribute(78).intValue()))
  231. info += '\n'.join(strs)+'\n'
  232. i+=1
  233. self.system.disconnectAllServices()
  234. print "total spool files : ",i
  235. print info
  236.  
  237. def GetSpoolFile(self,sflib,sffile,sfname,sfjobnum,fnum,dest):
  238. if self.CheckObjExists(sflib,sffile)<>"":
  239. # IGCDTA parameter is for DBCS file
  240. self.GetCmdMsg("CRTPF FILE(%s/%s) RCDLEN(160) IGCDTA(*YES)" % (sflib,sffile))
  241. str = "CPYSPLF FILE(%s) TOFILE(%s/%s) JOB(%s) SPLNBR(%d)" % (sfname,sflib,sffile,sfjobnum,fnum)
  242. msg = self.GetCmdMsg(str)
  243. if msg == "":
  244. self.FtpGetText(sflib,sffile,sffile,dest)
  245. print "download successfully!"

  246.     def PutMsg(self,qlib,qname,msg):
            qstr = "/QSYS.LIB/%s.LIB/%s.DTAQ" % (qlib,qname)
            dataqueue=self.DataQueue(self.system,qstr)
            dataqueue.write(msg)
           
        def GetMsg(self,qlib,qname):
            qstr = "/QSYS.LIB/%s.LIB/%s.DTAQ" % (qlib,qname)
            dataqueue=self.DataQueue(self.system,qstr)
            dqdata = dataqueue.read()
            dqdatastr = 'No data'
            if dqdata <> None:
                dqdatastr =  dqdata.getString()
            print dqdatastr
            return dqdatastr
  247.  
  248. if __name__ == '__main__':
  249. pass

python 使用 jt400.jar的更多相关文章

  1. python脚本简化jar操作命令

    本篇和大家分享的是使用python简化对jar包操作命令,封装成简短关键字或词,达到操作简便的目的.最近在回顾和构思shell脚本工具,后面一些文章应该会分享shell内容,希望大家继续关注. 获取磁 ...

  2. 在python中引用jar包

    在本文中,首先创建一个maven项目,然后打包成jar包,在python中调用jar包,执行java类方法. 1.在eclipse中创建maven项目 我这里创建一个普通java项目,择选择 “mav ...

  3. Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...

  4. python call java jar

    python脚本如何调用Java的jar文件呢? HelloWorld.java public class HelloWorld { public static void main(String[] ...

  5. ojdbc14.jar 放在kettle那个目录下面

    \libext\edtftpj-1.4.5.jar \libext\firebirdsql-full.jar \libext\firebirdsql.jar \libext\gis-shape.jar ...

  6. robotframework笔记24

    侦听器接口 机器人框架有一个侦听器接口,可以用于接收 对测试执行通知. 示例用法包括 外部测试监控,测试失败时发送邮件消息, 与其他系统进行通信. 侦听器API版本3也使得 它可以修改测试在测试执行和 ...

  7. DB2 Magazine 中文版: 访问 iSeries 数据

    当您第一次开始学习 DB2 for iSeries 时,一下子要弄清楚如何访问所有数据可能有些令人生畏.我将介绍访问 DB2 for iSeries 数据的一些常见的方法,并展示如何开始开发访问存储在 ...

  8. logstash jdbc 各种数据库配置

    MySQL数据库 Driver ="path/to/jdbc-drivers/mysql-connector-java-5.1.35-bin.jar"   //驱动程序Class ...

  9. Kettle简介

    ETL和Kettle简介     ETL即数据抽取(Extract).转换(Transform).装载(Load)的过程.它是构建数据仓库的重要环节.数据仓库是面向主题的.集成的.稳定的且随时间不断变 ...

随机推荐

  1. ModelSerializer组件

    ModelSerializer组件 一 .DRF模型类序列化器 如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一 ...

  2. 不一样的go语言-athens源码概览

    前言   上一篇文章介绍了athens私服的安装以及vgo download protocol的简要介绍.本文着重介绍go proxy sever的实现原理以及athens是如何实现的. go get ...

  3. Socket简单Demo

    Socket协议网上介绍的有很多了,就不在画蛇添足了,本文主要编写一个小Demo,介绍下它具体实现 一:Socket服务器端 package com.founderit; import java.io ...

  4. Java 二叉搜索树 实现和学习

    /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * <p> ...

  5. 支持移动端裁剪图片插件Jcrop(结合WebUploader上传)

    (此教程包括前端实现图片裁剪,后端进行获取裁剪区并保存) 最近有一个需求,微信公众号上传图片,支持自定义裁剪. 以前用过一款裁剪插件cropper,很久没用了,不知道对移动端操作兼容如何,重新从网上搜 ...

  6. 5_PHP数组_3_数组处理函数及其应用_1_快速创建数组的函数

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 一.快速创建数组的函数 1. range() 函数 程序: <?php $numbers = range(1 ...

  7. 【洛谷 P4688】 [Ynoi2016]掉进兔子洞(bitset,莫队)

    题目链接 第一道Ynoi 显然每次询问的答案为三个区间的长度和减去公共数字个数*3. 如果是公共数字种数的话就能用莫队+bitset存每个区间的状态,然后3个区间按位与就行了. 但现在是个数,bits ...

  8. 入门Docker,你要下载什么?注册什么?

    此随笔根据前人经验改编并亲自实践.遇到问题提供出相应解决方法. 入门Docker,你要下载什么?注册什么? Docker.app你肯定是要下载的!此教程应用于MAC系统PC不保证适用 Docker f ...

  9. tp5模板中js方法中url函数传参的解决办法

    代码如下: layer.msg(data.msg, {icon: 1,time:1500,shade: 0.1}, function(index){ layer.close(index); var s ...

  10. linux设备树的建立过程

    为了阐明表示总线.设备和设备驱动程序的各个数据结构之间彼此的关联,它们的注册过程是很有必要的.顺序一定是如下:(1)注册总线---bus_register:(2)注册设备device_register ...