blob: 2c35317fb8733ea721157e16a7a389de99ddf4e6 [file] [log] [blame]
Tang Chenge90e9bb2012-07-03 13:38:01 +08001# -*- coding: utf-8 -*-
Cheng Tangc92b3ea2012-07-02 17:29:24 +08002
3from ctypes import *
4
5bccclt_dll = None
6xpack_path = 'cpack.dat'
7
8cpack_fields = [
9"scust_no",
10"scust_no2",
11"sholder_ac_no",
12"sholder_ac_no2",
13"sholder_type",
14"sholder_type2",
15"sname",
16"sname2",
17"sall_name",
18"smarket_code",
19"smarket_code2",
20"sdate0",
21"sdate1",
22"sdate2",
23"sdate3",
24"stime0",
25"stime1",
26"stime2",
27"stime3",
28"lvol0",
29"lvol1",
30"lvol2",
31"lvol3",
32"lvol4",
33"lvol5",
34"lvol6",
35"lvol7",
36"lvol8",
37"lvol9",
38"lvol10",
39"lvol11",
40"lvol12",
41"damt0",
42"damt1",
43"damt2",
44"damt3",
45"damt4",
46"damt5",
47"damt6",
48"damt7",
49"damt8",
50"damt9",
51"damt10",
52"damt11",
53"damt12",
54"damt13",
55"damt14",
56"damt15",
57"damt16",
58"damt17",
59"damt18",
60"damt19",
61"damt20",
62"damt21",
63"damt22",
64"damt23",
65"damt24",
66"damt25",
67"damt26",
68"damt27",
69"damt28",
70"damt29",
71"damt30",
72"damt31",
73"damt32",
74"damt33",
75"sstock_code",
76"sstock_code2",
77"scust_type",
78"scust_type2",
79"sstat_type",
80"sstat_type2",
81"sroom_no",
82"sroom_no2",
83"sopen_emp",
84"sclose_emp",
85"schange_emp",
86"scheck_emp",
87"semp",
88"snation_code",
89"lcert_code",
90"stx_pwd",
91"stx_pwd2",
92"swithdraw_pwd",
93"swithdraw_pwd2",
94"semp_pwd",
95"semp_pwd2",
96"sbank_pwd",
97"sbank_pwd2",
98"scust_auth",
99"scust_auth2",
100"scust_limit",
101"scust_limit2",
102"lsafe_level",
103"lsafe_level2",
104"spost_code",
105"spost_code2",
106"sphone",
107"sphone2",
108"sphone3",
109"spager",
110"semail",
111"semail2",
112"snote",
113"snote2",
114"scert_no",
115"scert_no2",
116"scert_addr",
117"sstatus0",
118"sstatus1",
119"sstatus2",
120"sstatus3",
121"sstatus4",
122"lwithdraw_flag",
123"saddr",
124"saddr2",
125"sserial0",
126"sserial1",
127"sserial2",
128"sserial3",
129"sserial4",
130"scurrency_type",
131"scurrency_type2",
132"sbranch_code0",
133"sbranch_code1",
134"sbranch_code2",
135"usset0",
136"usset1",
137"usset2",
138"usset3",
139"usset4",
140"usset5",
141"usset6",
142"sstation0",
143"sstation1",
144"sbank_acc",
145"sbank_acc2",
146"lbank_acc_type",
147"lbank_acc_type2",
148"smain_flag",
149"smain_flag2",
150"sbank_code",
151"sbank_code2",
152"semp_no",
153"semp_no2",
154"drate0",
155"drate1",
156"lserial0",
157"lserial1",
158"sbankname",
159"sbankname2",
160"scard0",
161"scard1",
162"sorder0",
163"sorder1",
164"sorder2",
165"scusttypes",
166"ssectypes",
167"vsmess",
168"vsvarstr0",
169"vsvarstr1",
170"vsvarstr2"
171]
172
173def load_bccclt():
174 global bccclt_dll
175 bccclt_dll = cdll.LoadLibrary('bccclt.dll')
176
177
178load_bccclt()
179
180class pyBccclt:
181 drtp_no = -1
182
183 def setup(ip,port,xpack='cpack.dat',debug=0):
Tang Chenge90e9bb2012-07-03 13:38:01 +0800184 ''' 初始化 '''
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800185 global xpack_path
186 xpack_path = xpack
187 bccclt_dll.SetDebugSwitch( debug )
188 r = bccclt_dll.BCCCLTInit(1)
189 if not r:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800190 raise RuntimeError(u"初始化连接失败")
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800191 no = bccclt_dll.AddDrtpNode(ip,port)
192 pyBccclt.drtp_no = no
193 if pyBccclt.drtp_no < 0:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800194 raise RuntimeError(u'初始化通讯平台连接失败')
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800195
196
197
198 setup = staticmethod(setup)
199
200 def __init__(self,mainfunc):
201 self.handle = bccclt_dll.NewXpackHandle( xpack_path )
202 self.mainfunc = mainfunc
203 self.reset()
204
205 def get_errormsg(self):
206 return self.error_msg.value
207
208 def reset(self):
209 self.request_row = 0
210 self.error_code = c_int(0)
211 self.error_msg = create_string_buffer('\000' * 1024)
212 self.return_code = c_int(0)
213 self.record_count = 0
214 self.record = None
215 self.timeout = 5000
216 self.response_row = 0
217 bccclt_dll.ResetPackHandle(self.handle)
218
219 def close(self):
220 if self.handle <> None:
221 bccclt_dll.DeleteXpackHandle( self.handle )
222 self.handle = None
223
224 def callsvr(self,func,request,timeout = 1000):
225 self.reset()
226 self.timeout = timeout
227 for k,v in request.iteritems():
228 if k not in cpack_fields:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800229 raise ValueError(u"字段 %s 不存在" % k)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800230
231 if isinstance(v,int):
232 bccclt_dll.SetIntFieldByName(self.handle,self.request_row,k,v)
233 elif isinstance(v,float):
234 bccclt_dll.SetDoubleFieldByName(self.handle,self.request_row,k,v)
235 elif isinstance(v,str):
236 bccclt_dll.SetStringFieldByName(self.handle,self.request_row,k,v)
237 else:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800238 raise ValueError(u"字段 %s 数据类型错误" % k)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800239
240 bccclt_dll.SetRequestType(self.handle,func)
241 #print "CallRequest %d:%d" % (self.mainfunc,func)
242 if not bccclt_dll.CallRequest(self.handle,pyBccclt.drtp_no,0,self.mainfunc,timeout,byref(self.error_code),self.error_msg):
243 #print "CallRequest error "
244 return False
245
246 self.get_return_error()
247
248 cnt = c_int(0)
249 bccclt_dll.GetRecordCount(self.handle,byref(cnt))
250 self.record_count = cnt.value
251 return True
252
253 def get_retcode(self):
254 return self.return_code.value
255
256 def get_return_error(self):
257 r = bccclt_dll.GetRetCode(self.handle,byref(self.return_code))
258 if not r:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800259 raise RuntimeError(u'取返回码错误')
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800260 if self.get_retcode() <> 0:
261 bccclt_dll.GetStringFieldByName(self.handle,0,"vsmess",self.error_msg)
262 return self.return_code.value
263
264 def has_more_record(self):
265 #print "resp:%d, record: %d" % (self.response_row , self.record_count)
266 if self.response_row < self.record_count:
267 return True
268 elif not bccclt_dll.HaveNextPack( self.handle ):
269 return False
270 elif not bccclt_dll.CallNext(self.handle,self.timeout,byref(self.error_code),self.error_msg):
Tang Chenge90e9bb2012-07-03 13:38:01 +0800271 raise RuntimeError(u'获取后续数据包异常')
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800272 else:
273 self.response_row = 0
274 self.record_count = 0
275 self.get_return_error()
276 if self.get_retcode() <> 0:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800277 raise RuntimeError(u'取后续数据返回错误,ret=%d' % self.get_retcode())
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800278 cnt = c_int(0)
279 bccclt_dll.GetRecordCount(self.handle,byref(cnt))
280 self.record_count = cnt.value
281 if self.response_row < self.record_count:
282 return True
283 return False
284
285 def convert_ascii(self,data):
286 i = 0
287 datalen = len(data)
288 result = ''
289 while i < datalen:
290 t = data[i:i+2]
291 t1 = int(t,16) & 0xFF
292 if (t1 < ord('0') or t1 > ord('9')) and (t1 < ord('A') or t1 > ord('F')):
293 raise ValueError("Value is non-hexdicimal %s:%d" % (chr(t1),t1))
294 result += chr(t1)
295 i += 2
296 return result
297
298 def next_record(self,fields):
299 if self.response_row >= self.record_count:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800300 raise ValueError(u'无可用记录')
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800301
302 self.record = {}
303 for f in fields:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800304 #print "获取字段 ",f
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800305 if f not in cpack_fields:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800306 raise ValueError(u"字段 %s 不存在" % f)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800307
308 ctype_field = create_string_buffer(f)
309 if f[0] == 'l':
310 v = c_int(0)
311 r = bccclt_dll.GetIntFieldByName(self.handle,self.response_row,ctype_field,byref(v))
312 if not r:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800313 raise ValueError(u"字段 %s 未返回" % f)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800314 self.record[f] = v.value
315 elif f[0] == 's':
316 v = create_string_buffer('\000' * 512)
317 r = bccclt_dll.GetStringFieldByName(self.handle,self.response_row,ctype_field,v,511)
318 if not r:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800319 raise ValueError(u"字段 %s 未返回" % f)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800320 #print "%s: %s" % (f,v.value)
321 self.record[f] = v.value
322 elif f[0] == 'd':
323 v = c_double(0.0)
324 r = bccclt_dll.GetDoubleFieldByName(self.handle,self.response_row,ctype_field,byref(v))
325 if not r:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800326 raise ValueError(u"字段 %s 未返回" % f)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800327 self.record[f] = v.value
328 elif f[0] == 'u':
329 v = create_string_buffer('\000' * 1024)
330 r = bccclt_dll.GetStringFieldByName(self.handle,self.response_row,ctype_field,v,1023)
331 if not r:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800332 raise ValueError(u"字段 %s 未返回" % f)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800333
334 data = v.value
335 data = data[2:]
336 data = self.convert_ascii(data)
337 self.record[f] = data
338 else:
Tang Chenge90e9bb2012-07-03 13:38:01 +0800339 raise ValueError(u'字段类型错误 %s' % f)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800340 self.response_row += 1
341 #print "fetch one record , " ,self.record
342 return self.record
343
344 def fetch_record(self,fields):
345 while self.has_more_record():
346 ret = self.next_record(fields)
347 yield ret
348
349
350
351
352