python 使用 jt400.jar
jt400helper.py
- #coding=utf-8
- import jpype
- import os
- class JT400Helper(object):
- def __init__(self, server,username,pwd):
- jvmpath=r"C:\Program Files\Java\jre1.8.0_60\bin\server\jvm.dll"
- jarpath=r'd:\temp\jt400.jar'
- jvmArg = "-Djava.class.path=%s" % jarpath
- jpype.startJVM(jvmpath,jvmArg)
- #jt400
- AS400=jpype.JClass('com.ibm.as400.access.AS400')
- CommandCall=jpype.JClass('com.ibm.as400.access.CommandCall')
- ProgramCall=jpype.JClass('com.ibm.as400.access.ProgramCall')
- SpooledFileList=jpype.JClass('com.ibm.as400.access.SpooledFileList')
- AS400Text=jpype.JClass('com.ibm.as400.access.AS400Text')
- AS400JDBCDriver=jpype.JClass('com.ibm.as400.access.AS400JDBCDriver')
- #java
- Connection=jpype.JClass('java.sql.Connection')
- DatabaseMetaData=jpype.JClass('java.sql.DatabaseMetaData')
- Statement=jpype.JClass('java.sql.Statement')
- self.ResultSet=jpype.JClass('java.sql.ResultSet')
- self.server,self.username,self.pwd = server,username,pwd
- self.RJobLog=jpype.JClass('com.ibm.as400.resource.RJobLog')
- self.AS400FTP=jpype.JClass('com.ibm.as400.access.AS400FTP')
- self.IFSFile=jpype.JClass('com.ibm.as400.access.IFSFile')
- self.ObjectDescription=jpype.JClass('com.ibm.as400.access.ObjectDescription')
- self.ProgramParameter=jpype.JClass('com.ibm.as400.access.ProgramParameter')
- self.DriverManager=jpype.JClass('java.sql.DriverManager')
- self.DriverManager.registerDriver(AS400JDBCDriver())
- self.system=AS400(server,username,pwd)
- self.cc=CommandCall(self.system)
- self.outqueue = SpooledFileList(self.system)
- self.pc = ProgramCall(self.system)
- def ShowIfs(self,ifspath):
- ifs=self.IFSFile(self.system,ifspath)
- print 'exists : ',ifs.exists()
- print 'isDirectory : ',ifs.isDirectory()
- print 'isFile : ',ifs.isFile()
- fs=ifs.listFiles()
- if len(fs)>0:
- for f in fs:
- print f.name
- def ShowObj2(self,lib,obj):
- od = self.ObjectDescription(system,lib,obj,"FILE")
- print od.CHANGE_DATE_AND_TIME
- def ShowObj(self,lib,obj,tmplib):
- cmdstr = "DSPOBJD OBJ(%s/%s) OBJTYPE(*PGM) OUTPUT(*OUTFILE) OUTFILE(%s/OBJD)" % (lib,obj,tmplib)
- msg = self.GetCmdMsg(cmdstr)
- if msg == "":
- cmdstr = "SELECT ODLBNM, ODOBNM, ODOBTP, ODOBAT,ODOBSZ , ODOBTX, ODLDAT, ODLTIM, ODOBSY, ODCRTU, ODJRST, ODJRNM, ODJRLB, ODJRIM, ODJREN,ODJRCN, ODJRDT, ODJRTI FROM %s.objd" % tmplib
- self.GetSQLResult(cmdstr)
- def SaveFieldDef(self,flib,file,tmplib,ofile):
- cmdstr = "DSPFFD FILE(%s/%s) OUTPUT(*OUTFILE) OUTFILE(%s/FIELDDEF)" % (flib,file,tmplib)
- msg = self.GetCmdMsg(cmdstr)
- if msg == "":
- cmdstr = "SELECT WHFLDI, WHFTXT, WHFLDT, WHFLDD, WHFLDP,WHFLDB, WHFOBO FROM %s.FIELDDEF WHERE WHFLDI <> ' ' ORDER BY WHFOBO" % tmplib
- self.GetSQLResult(cmdstr,ofile)
- def SaveJobLog(self,jobstr,ofile):
- msg = self.GetJobLog(jobstr)
- with open(ofile,'w') as f:
- f.write(msg)
- def GetJobLog(self,jobstr):
- jobarr = jobstr.split('/')
- jobnum,jobuser,jobname=jobarr[0],jobarr[1],jobarr[2]
- return self.GetJobLogByNum(jobnum,jobuser,jobname)
- def GetJobLogByNum(self,jobnum,jobuser,jobname):
- joblog=self.RJobLog(self.system,jobname,jobuser,jobnum)
- joblog.open()
- joblog.waitForComplete()
- num=joblog.getListLength()
- msgs = []
- for i in range(0,num):
- qmsg=joblog.resourceAt(i)
- msgs.append(qmsg.getAttributeValue("MESSAGE_TEXT"))
- msg = '\n'.join(msgs)
- return msg
- def GetSQLResult(self,cmdstr,ofile=""):
- connection = self.DriverManager.getConnection("jdbc:as400://" + self.server, self.username, self.pwd)
- dmd = connection.getMetaData()
- select = connection.createStatement(self.ResultSet.TYPE_SCROLL_SENSITIVE,self.ResultSet.CONCUR_UPDATABLE)
- print cmdstr
- rs = select.executeQuery(cmdstr)
- strs = ""
- cols = rs.getMetaData().getColumnCount()
- while (rs.next()):
- rowstrs = []
- for i in range(1,cols+1):
- value = rs.getString(i)
- if ' ' in value:
- value = '"%s"' % value
- rowstrs.append(rs.getString(i))
- strs+=','.join(rowstrs)+'\n'
- connection.close();
- if ofile <> "":
- with open(ofile,'w') as f:
- f.write(strs)
- else:
- print strs
- def CallProgram(self,plib,pgm,paras):
- #WRKACTJOB SBS(QUSRWRK) JOB(QZRCSRVS) - dump not work
- #paras=["Y","12345"," "]
- pgmparas=[]
- for para in paras:
- pgmparas.append(ProgramParameter(para))
- print str(pgmparas.getInputData())
- self.pc.setProgram("/QSYS.LIB/%s.LIB/%s.PGM" % (plib,pgm),pgmparas)
- successfully = self.pc.run()
- msg = ''
- job = pc.getJob()
- print pc.toString()
- print job.toString()
- if successfully <> True:
- ml=self.pc.getMessageList()
- for m in ml:
- msg += m.getText() +'\n'
- print msg
- self.system.disconnectAllServices()
- return msg
- def GetCmdMsg(self,cmdstr):
- msg = ''
- print cmdstr
- successfully = self.cc.run(cmdstr)
- if successfully <> True:
- ml=self.cc.getMessageList()
- for m in ml:
- msg += m.getText() +'\n'
- print msg
- return msg
- def CheckObjExists(self,lib,file,type="*FILE"):
- str = "CHKOBJ OBJ(%s/%s) OBJTYPE(%s)" % (lib,file,type)
- return self.GetCmdMsg(str)
- def DeleteObj(self,lib,file):
- str = "DLTF FILE(%s/%s)" % (lib,file)
- return self.GetCmdMsg(str)
- def FileToIfs(self,lib,file,mem,ifspath):
- # don't use RMVBLANK(*TRAILING) ,will cause numeric field contains blank characters error when put ifs to file
- str = "CPYTOIMPF FROMFILE(%s/%s %s) TOSTMF('%s') MBROPT(*REPLACE) STMFCCSID(*STMF) RCDDLM(*CRLF) DTAFMT(*DLM) STRDLM(*NONE)" % (lib,file,mem,ifspath)
- print lib,file,mem,"->",ifspath
- return self.GetCmdMsg(str)
- def IfsToFile(self,ifspath,lib,file,mem):
- str = "CPYFRMIMPF FROMSTMF('%s') TOFILE(%s/%s %s) MBROPT(*REPLACE) RCDDLM(*CRLF) STRDLM(*NONE) FLDDLM(',') ERRRCDOPT(*REPLACE) RPLNULLVAL(*FLDDFT)" % (ifspath,lib,file,mem)
- print ifspath,"->",lib,file,mem
- return self.GetCmdMsg(str)
- def FileToPc(self,lib,file,mem,ofile):
- tmpifs = "QDLS/TEMP/%s.CSV" % mem
- self.FileToIfs(lib,file,mem,tmpifs)
- self.FtpGetIfsFile(tmpifs,ofile)
- def PcToFile(self,ifile,lib,file,mem):
- tmpifs = "QDLS/TEMP/%s.CSV" % mem
- self.FtpPutIfsFile(ifile,tmpifs)
- self.IfsToFile(tmpifs,lib,file,mem)
- def FtpGetIfsFile(self,ifspath,ofile):
- ftp=self.AS400FTP(self.system)
- successfully = ftp.get(ifspath,ofile)
- print ifspath,"->",ofile
- return successfully
- def FtpGetText(self,lib,srcf,mem,dest=r"d:\temp"):
- ftp=self.AS400FTP(self.system)
- target="/QSYS.LIB/%s.LIB/%s.FILE/%s.MBR" % (lib,srcf,mem)
- if os.path.isdir(dest):
- dest=os.path.join(dest,mem+".txt")
- print target,"->",dest
- successfully = ftp.get(target,dest)
- return successfully
- def FtpGetSavf(self,lib,savf,dest=r"d:\temp"):
- ftp=self.AS400FTP(self.system)
- target="/QSYS.LIB/%s.LIB/%s.SAVF" % (lib,savf)
- # QUOTE SITE NAMEFMT 0 QGPL/QCLSRC.TEST
- # QUOTE SITE NAMEFMT 1 /QSYS.lib/Libname.lib/Fname.file/Mname.mbr
- ftp.issueCommand("quote site namefmt 1")
- if os.path.isdir(dest):
- dest=os.path.join(dest,savf+".SAVF")
- # can not get it if not set data transfer type
- ftp.setDataTransferType(1)
- successfully = ftp.get(target,dest)
- return successfully
- def FtpPutIfsFile(self,ifile,ifspath):
- ftp=self.AS400FTP(self.system)
- successfully = ftp.put(ifile,ifspath)
- print ifile,"->",ifspath
- return successfully
- def FtpPutText(self,ifile,lib,srcf,mem):
- ftp=self.AS400FTP(self.system)
- dest="/QSYS.LIB/%s.LIB/%s.FILE/%s.MBR" % (lib,srcf,mem)
- successfully = ftp.put(ifile,dest)
- print ifile,"->",lib,srcf,mem
- return successfully
- def GetOutQList(self,outqlib,outq):
- print "OutQueue : %s/%s" % (outqlib,outq)
- self.outqueue.setQueueFilter("/QSYS.LIB/%s.LIB/%s.OUTQ" % (outqlib,outq))
- self.outqueue.setUserFilter("*ALL")
- self.outqueue.openSynchronously()
- enums=self.outqueue.getObjects()
- i = 1
- info = ""
- while (enums.hasMoreElements()):
- splf=enums.nextElement()
- if(splf<>None):
- strs=[]
- 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)))
- strs.append("Number/User/Job : %s/%s/%s" % (splf.getStringAttribute(60),splf.getStringAttribute(62),splf.getStringAttribute(59)))
- 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()))
- info += '\n'.join(strs)+'\n'
- i+=1
- self.system.disconnectAllServices()
- print "total spool files : ",i
- print info
- def GetSpoolFile(self,sflib,sffile,sfname,sfjobnum,fnum,dest):
- if self.CheckObjExists(sflib,sffile)<>"":
- # IGCDTA parameter is for DBCS file
- self.GetCmdMsg("CRTPF FILE(%s/%s) RCDLEN(160) IGCDTA(*YES)" % (sflib,sffile))
- str = "CPYSPLF FILE(%s) TOFILE(%s/%s) JOB(%s) SPLNBR(%d)" % (sfname,sflib,sffile,sfjobnum,fnum)
- msg = self.GetCmdMsg(str)
- if msg == "":
- self.FtpGetText(sflib,sffile,sffile,dest)
- print "download successfully!"
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- if __name__ == '__main__':
- pass
python 使用 jt400.jar的更多相关文章
- python脚本简化jar操作命令
本篇和大家分享的是使用python简化对jar包操作命令,封装成简短关键字或词,达到操作简便的目的.最近在回顾和构思shell脚本工具,后面一些文章应该会分享shell内容,希望大家继续关注. 获取磁 ...
- 在python中引用jar包
在本文中,首先创建一个maven项目,然后打包成jar包,在python中调用jar包,执行java类方法. 1.在eclipse中创建maven项目 我这里创建一个普通java项目,择选择 “mav ...
- Python一键转Jar包,Java调用Python新姿势!
粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...
- python call java jar
python脚本如何调用Java的jar文件呢? HelloWorld.java public class HelloWorld { public static void main(String[] ...
- ojdbc14.jar 放在kettle那个目录下面
\libext\edtftpj-1.4.5.jar \libext\firebirdsql-full.jar \libext\firebirdsql.jar \libext\gis-shape.jar ...
- robotframework笔记24
侦听器接口 机器人框架有一个侦听器接口,可以用于接收 对测试执行通知. 示例用法包括 外部测试监控,测试失败时发送邮件消息, 与其他系统进行通信. 侦听器API版本3也使得 它可以修改测试在测试执行和 ...
- DB2 Magazine 中文版: 访问 iSeries 数据
当您第一次开始学习 DB2 for iSeries 时,一下子要弄清楚如何访问所有数据可能有些令人生畏.我将介绍访问 DB2 for iSeries 数据的一些常见的方法,并展示如何开始开发访问存储在 ...
- logstash jdbc 各种数据库配置
MySQL数据库 Driver ="path/to/jdbc-drivers/mysql-connector-java-5.1.35-bin.jar" //驱动程序Class ...
- Kettle简介
ETL和Kettle简介 ETL即数据抽取(Extract).转换(Transform).装载(Load)的过程.它是构建数据仓库的重要环节.数据仓库是面向主题的.集成的.稳定的且随时间不断变 ...
随机推荐
- ModelSerializer组件
ModelSerializer组件 一 .DRF模型类序列化器 如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一 ...
- 不一样的go语言-athens源码概览
前言 上一篇文章介绍了athens私服的安装以及vgo download protocol的简要介绍.本文着重介绍go proxy sever的实现原理以及athens是如何实现的. go get ...
- Socket简单Demo
Socket协议网上介绍的有很多了,就不在画蛇添足了,本文主要编写一个小Demo,介绍下它具体实现 一:Socket服务器端 package com.founderit; import java.io ...
- Java 二叉搜索树 实现和学习
/** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * <p> ...
- 支持移动端裁剪图片插件Jcrop(结合WebUploader上传)
(此教程包括前端实现图片裁剪,后端进行获取裁剪区并保存) 最近有一个需求,微信公众号上传图片,支持自定义裁剪. 以前用过一款裁剪插件cropper,很久没用了,不知道对移动端操作兼容如何,重新从网上搜 ...
- 5_PHP数组_3_数组处理函数及其应用_1_快速创建数组的函数
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 一.快速创建数组的函数 1. range() 函数 程序: <?php $numbers = range(1 ...
- 【洛谷 P4688】 [Ynoi2016]掉进兔子洞(bitset,莫队)
题目链接 第一道Ynoi 显然每次询问的答案为三个区间的长度和减去公共数字个数*3. 如果是公共数字种数的话就能用莫队+bitset存每个区间的状态,然后3个区间按位与就行了. 但现在是个数,bits ...
- 入门Docker,你要下载什么?注册什么?
此随笔根据前人经验改编并亲自实践.遇到问题提供出相应解决方法. 入门Docker,你要下载什么?注册什么? Docker.app你肯定是要下载的!此教程应用于MAC系统PC不保证适用 Docker f ...
- tp5模板中js方法中url函数传参的解决办法
代码如下: layer.msg(data.msg, {icon: 1,time:1500,shade: 0.1}, function(index){ layer.close(index); var s ...
- linux设备树的建立过程
为了阐明表示总线.设备和设备驱动程序的各个数据结构之间彼此的关联,它们的注册过程是很有必要的.顺序一定是如下:(1)注册总线---bus_register:(2)注册设备device_register ...