blob: ce1063053a1dbbc40089a23987c715678b19581a [file] [log] [blame]
Cheng Tangc92b3ea2012-07-02 17:29:24 +08001#!/usr/bin/python
2# -*- coding: gbk -*-
3
4from ctypes import *
5
6bccclt_dll = None
7xpack_path = 'cpack.dat'
8
9cpack_fields = [
10"scust_no",
11"scust_no2",
12"sholder_ac_no",
13"sholder_ac_no2",
14"sholder_type",
15"sholder_type2",
16"sname",
17"sname2",
18"sall_name",
19"smarket_code",
20"smarket_code2",
21"sdate0",
22"sdate1",
23"sdate2",
24"sdate3",
25"stime0",
26"stime1",
27"stime2",
28"stime3",
29"lvol0",
30"lvol1",
31"lvol2",
32"lvol3",
33"lvol4",
34"lvol5",
35"lvol6",
36"lvol7",
37"lvol8",
38"lvol9",
39"lvol10",
40"lvol11",
41"lvol12",
42"damt0",
43"damt1",
44"damt2",
45"damt3",
46"damt4",
47"damt5",
48"damt6",
49"damt7",
50"damt8",
51"damt9",
52"damt10",
53"damt11",
54"damt12",
55"damt13",
56"damt14",
57"damt15",
58"damt16",
59"damt17",
60"damt18",
61"damt19",
62"damt20",
63"damt21",
64"damt22",
65"damt23",
66"damt24",
67"damt25",
68"damt26",
69"damt27",
70"damt28",
71"damt29",
72"damt30",
73"damt31",
74"damt32",
75"damt33",
76"sstock_code",
77"sstock_code2",
78"scust_type",
79"scust_type2",
80"sstat_type",
81"sstat_type2",
82"sroom_no",
83"sroom_no2",
84"sopen_emp",
85"sclose_emp",
86"schange_emp",
87"scheck_emp",
88"semp",
89"snation_code",
90"lcert_code",
91"stx_pwd",
92"stx_pwd2",
93"swithdraw_pwd",
94"swithdraw_pwd2",
95"semp_pwd",
96"semp_pwd2",
97"sbank_pwd",
98"sbank_pwd2",
99"scust_auth",
100"scust_auth2",
101"scust_limit",
102"scust_limit2",
103"lsafe_level",
104"lsafe_level2",
105"spost_code",
106"spost_code2",
107"sphone",
108"sphone2",
109"sphone3",
110"spager",
111"semail",
112"semail2",
113"snote",
114"snote2",
115"scert_no",
116"scert_no2",
117"scert_addr",
118"sstatus0",
119"sstatus1",
120"sstatus2",
121"sstatus3",
122"sstatus4",
123"lwithdraw_flag",
124"saddr",
125"saddr2",
126"sserial0",
127"sserial1",
128"sserial2",
129"sserial3",
130"sserial4",
131"scurrency_type",
132"scurrency_type2",
133"sbranch_code0",
134"sbranch_code1",
135"sbranch_code2",
136"usset0",
137"usset1",
138"usset2",
139"usset3",
140"usset4",
141"usset5",
142"usset6",
143"sstation0",
144"sstation1",
145"sbank_acc",
146"sbank_acc2",
147"lbank_acc_type",
148"lbank_acc_type2",
149"smain_flag",
150"smain_flag2",
151"sbank_code",
152"sbank_code2",
153"semp_no",
154"semp_no2",
155"drate0",
156"drate1",
157"lserial0",
158"lserial1",
159"sbankname",
160"sbankname2",
161"scard0",
162"scard1",
163"sorder0",
164"sorder1",
165"sorder2",
166"scusttypes",
167"ssectypes",
168"vsmess",
169"vsvarstr0",
170"vsvarstr1",
171"vsvarstr2"
172]
173
174def load_bccclt():
175 global bccclt_dll
176 bccclt_dll = cdll.LoadLibrary('bccclt.dll')
177
178
179load_bccclt()
180
181class pyBccclt:
182 drtp_no = -1
183
184 def setup(ip,port,xpack='cpack.dat',debug=0):
185 ''' ³õʼ»¯ '''
186 global xpack_path
187 xpack_path = xpack
188 bccclt_dll.SetDebugSwitch( debug )
189 r = bccclt_dll.BCCCLTInit(1)
190 if not r:
191 raise RuntimeError("³õʼ»¯Á¬½Óʧ°Ü")
192 no = bccclt_dll.AddDrtpNode(ip,port)
193 pyBccclt.drtp_no = no
194 if pyBccclt.drtp_no < 0:
195 raise RuntimeError('³õʼ»¯Í¨Ñ¶Æ½Ì¨Á¬½Óʧ°Ü')
196
197
198
199 setup = staticmethod(setup)
200
201 def __init__(self,mainfunc):
202 self.handle = bccclt_dll.NewXpackHandle( xpack_path )
203 self.mainfunc = mainfunc
204 self.reset()
205
206 def get_errormsg(self):
207 return self.error_msg.value
208
209 def reset(self):
210 self.request_row = 0
211 self.error_code = c_int(0)
212 self.error_msg = create_string_buffer('\000' * 1024)
213 self.return_code = c_int(0)
214 self.record_count = 0
215 self.record = None
216 self.timeout = 5000
217 self.response_row = 0
218 bccclt_dll.ResetPackHandle(self.handle)
219
220 def close(self):
221 if self.handle <> None:
222 bccclt_dll.DeleteXpackHandle( self.handle )
223 self.handle = None
224
225 def callsvr(self,func,request,timeout = 1000):
226 self.reset()
227 self.timeout = timeout
228 for k,v in request.iteritems():
229 if k not in cpack_fields:
230 raise ValueError("×Ö¶Î %s ²»´æÔÚ" % k)
231
232 if isinstance(v,int):
233 bccclt_dll.SetIntFieldByName(self.handle,self.request_row,k,v)
234 elif isinstance(v,float):
235 bccclt_dll.SetDoubleFieldByName(self.handle,self.request_row,k,v)
236 elif isinstance(v,str):
237 bccclt_dll.SetStringFieldByName(self.handle,self.request_row,k,v)
238 else:
239 raise ValueError("×Ö¶Î %s Êý¾ÝÀàÐÍ´íÎó" % k)
240
241 bccclt_dll.SetRequestType(self.handle,func)
242 #print "CallRequest %d:%d" % (self.mainfunc,func)
243 if not bccclt_dll.CallRequest(self.handle,pyBccclt.drtp_no,0,self.mainfunc,timeout,byref(self.error_code),self.error_msg):
244 #print "CallRequest error "
245 return False
246
247 self.get_return_error()
248
249 cnt = c_int(0)
250 bccclt_dll.GetRecordCount(self.handle,byref(cnt))
251 self.record_count = cnt.value
252 return True
253
254 def get_retcode(self):
255 return self.return_code.value
256
257 def get_return_error(self):
258 r = bccclt_dll.GetRetCode(self.handle,byref(self.return_code))
259 if not r:
260 raise RuntimeError('È¡·µ»ØÂë´íÎó')
261 if self.get_retcode() <> 0:
262 bccclt_dll.GetStringFieldByName(self.handle,0,"vsmess",self.error_msg)
263 return self.return_code.value
264
265 def has_more_record(self):
266 #print "resp:%d, record: %d" % (self.response_row , self.record_count)
267 if self.response_row < self.record_count:
268 return True
269 elif not bccclt_dll.HaveNextPack( self.handle ):
270 return False
271 elif not bccclt_dll.CallNext(self.handle,self.timeout,byref(self.error_code),self.error_msg):
272 raise RuntimeError('»ñÈ¡ºóÐøÊý¾Ý°üÒì³£')
273 else:
274 self.response_row = 0
275 self.record_count = 0
276 self.get_return_error()
277 if self.get_retcode() <> 0:
278 raise RuntimeError('È¡ºóÐøÊý¾Ý·µ»Ø´íÎó£¬ret=%d' % self.get_retcode())
279 cnt = c_int(0)
280 bccclt_dll.GetRecordCount(self.handle,byref(cnt))
281 self.record_count = cnt.value
282 if self.response_row < self.record_count:
283 return True
284 return False
285
286 def convert_ascii(self,data):
287 i = 0
288 datalen = len(data)
289 result = ''
290 while i < datalen:
291 t = data[i:i+2]
292 t1 = int(t,16) & 0xFF
293 if (t1 < ord('0') or t1 > ord('9')) and (t1 < ord('A') or t1 > ord('F')):
294 raise ValueError("Value is non-hexdicimal %s:%d" % (chr(t1),t1))
295 result += chr(t1)
296 i += 2
297 return result
298
299 def next_record(self,fields):
300 if self.response_row >= self.record_count:
301 raise ValueError('ÎÞ¿ÉÓüǼ')
302
303 self.record = {}
304 for f in fields:
305 #print "»ñÈ¡×Ö¶Î ",f
306 if f not in cpack_fields:
307 raise ValueError("×Ö¶Î %s ²»´æÔÚ" % f)
308
309 ctype_field = create_string_buffer(f)
310 if f[0] == 'l':
311 v = c_int(0)
312 r = bccclt_dll.GetIntFieldByName(self.handle,self.response_row,ctype_field,byref(v))
313 if not r:
314 raise ValueError("×Ö¶Î %s δ·µ»Ø" % f)
315 self.record[f] = v.value
316 elif f[0] == 's':
317 v = create_string_buffer('\000' * 512)
318 r = bccclt_dll.GetStringFieldByName(self.handle,self.response_row,ctype_field,v,511)
319 if not r:
320 raise ValueError("×Ö¶Î %s δ·µ»Ø" % f)
321 #print "%s: %s" % (f,v.value)
322 self.record[f] = v.value
323 elif f[0] == 'd':
324 v = c_double(0.0)
325 r = bccclt_dll.GetDoubleFieldByName(self.handle,self.response_row,ctype_field,byref(v))
326 if not r:
327 raise ValueError("×Ö¶Î %s δ·µ»Ø" % f)
328 self.record[f] = v.value
329 elif f[0] == 'u':
330 v = create_string_buffer('\000' * 1024)
331 r = bccclt_dll.GetStringFieldByName(self.handle,self.response_row,ctype_field,v,1023)
332 if not r:
333 raise ValueError("×Ö¶Î %s δ·µ»Ø" % f)
334
335 data = v.value
336 data = data[2:]
337 data = self.convert_ascii(data)
338 self.record[f] = data
339 else:
340 raise ValueError('×Ö¶ÎÀàÐÍ´íÎó %s' % f)
341 self.response_row += 1
342 #print "fetch one record , " ,self.record
343 return self.record
344
345 def fetch_record(self,fields):
346 while self.has_more_record():
347 ret = self.next_record(fields)
348 yield ret
349
350
351
352
353