python將rs轉換成可迭代的對象


#data row
class Row(pb.Copyable):
	def __init__(self,entries): 
		self.__dict__.update(entries)
#tran objects
########################################################################
class ResultObj(pb.Copyable):
	#字符串太長pb無法 傳輸,轉成列表,原理跟FilePager一樣
	def __init__(self,rs,PageNo=1,pageSize=300,filedDict=None):
		self.pageSize=pageSize	
		if rs.RecordCount:
			rs.AbsolutePage=PageNo
		self.pageNo=PageNo 
		rs.PageSize=self.pageSize
		self.pageCount=rs.PageCount
		if rs.RecordCount:
			self.rs=rs.GetRows(self.pageSize)
		self.field_num=rs.Fields.Count
		self.next=None
		self.count=self.pageSize

		if self.pageNo<self.pageCount:
			self.next=ResultObj(rs,PageNo+1,self.pageSize,filedDict)
		else:
			self.count=rs.RecordCount-(self.pageNo-1)*self.pageSize
		#查詢結果的每一列 生成字典
		if filedDict is None:
			self.filedDict={}
			for n in xrange(self.field_num):
				self.filedDict[n]=rs.Fields.Item(n).Name.lower()
				#沒有列明轉成 c0 c1.....
				if not self.filedDict[n]:
					self.filedDict[n]='c'+str(n)
		else:
			self.filedDict=filedDict

	def __len__(self):
		return self.count

	def __getitem__(self,key):       	
		row={}
		for cur_col in xrange(self.field_num):
			row[self.filedDict[cur_col]]=self.rs[cur_col][key]
		return Row(row)					
		
	def __iter__(self):
		return iter(self.__next__())
	
	#遍歷列表
	def __next__(self):
		fiedlcount=xrange(self.field_num)
		while self:
			for cur_row in xrange(self.count):
				row={}
				for cur_col in fiedlcount:
					row[self.filedDict[cur_col]]=self.rs[cur_col][cur_row]
				yield Row(row)					
			self=self.next
########################################################################
class ResultDict(ResultObj,pb.Copyable):
	def __init__(self,rs,PageNo=1,pageSize=300,filedDict=None):
		ResultObj.__init__(self,rs,PageNo=1,pageSize=300,filedDict=None)	
	def __getitem__(self,key):       	
		row={}
		for cur_col in xrange(self.field_num):
			row[self.filedDict[cur_col]]=self.rs[cur_col][key]
		return row		
	#遍歷列表
	def __next__(self):
		fiedlcount=xrange(self.field_num)
		while self:
			for cur_row in xrange(self.count):
				row={}
				for cur_col in fiedlcount:
					row[self.filedDict[cur_col]]=self.rs[cur_col][cur_row]
				yield row					
			self=self.next
########################################################################
class ResultArray(ResultObj,pb.Copyable):
	def __init__(self,rs,PageNo=1,pageSize=300,filedDict=None):
		ResultObj.__init__(self,rs,PageNo=1,pageSize=300,filedDict=None)
	
	def __getitem__(self,key):       	
		row=[]
		for cur_col in xrange(self.field_num):
			row.append(self.rs[cur_col][key])
		return row		
	
	#遍歷列表
	def __next__(self):
		fiedlcount=xrange(self.field_num)
		while self:
			for cur_row in xrange(self.count):
				row=[]
				for cur_col in fiedlcount:
					row.append(self.rs[cur_col][cur_row])
				yield tuple(row)					
			self=self.next

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章