NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

godmarowset.py (5941B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\util\godmarowset.py
      2 from __future__ import print_function
      3 import blue
      4 import types
      5 import log
      6 from carbon.common.script.sys.crowset import CFilterRowset, CIndexedRowset, CRowset
      7 DEBUG = True
      8 
      9 def rowsetIterator(rowset):
     10     if isinstance(rowset, (GodmaIndexedRowset, GodmaFilterRowset)):
     11         for key in rowset.iterkeys():
     12             yield rowset.__getitem__(key)
     13 
     14     elif isinstance(rowset, GodmaRowset):
     15         for i in xrange(len(rowset)):
     16             yield rowset.__getitem__(i)
     17 
     18     else:
     19         raise NotImplementedError('Yikes, what are you? rowsetIterator does not operate on %s (%s)' % (str(type(rowset)), str(rowset.__class__)))
     20     raise StopIteration
     21 
     22 
     23 class GodmaRowset(CRowset):
     24     __passbyvalue__ = 1
     25 
     26     def __init__(self, header, rows, rowClass = blue.DBRow):
     27         CRowset.__init__(self, header, rows)
     28         self.rowClass = rowClass
     29 
     30     def __getitem__(self, index):
     31         ret = CRowset.__getitem__(self, index)
     32         if isinstance(self.rowClass, types.MethodType) or not isinstance(ret, self.rowClass):
     33             if not isinstance(ret, blue.DBRow):
     34                 ret = blue.DBRow(self.header, ret)
     35             return self.rowClass(self.header, ret)
     36         return ret
     37 
     38     def __setitem__(self, idx, row):
     39         if not isinstance(row, blue.DBRow):
     40             log.LogTraceback('__setitem__:Storing non-dbrow in GodmaRowset')
     41         CRowset.__setitem__(self, idx, row)
     42 
     43     def __iter__(self):
     44         if self.rowClass != blue.DBRow:
     45             return rowsetIterator(self)
     46         return CRowset.__iter__(self)
     47 
     48     def __getslice__(self, i, j):
     49         return GodmaRowset(self.header, list.__getslice__(self, i, j), rowClass=self.rowClass)
     50 
     51     def pop(self, idx = -1):
     52         ret = self.__getitem__(idx)
     53         CRowset.pop(self, idx)
     54         return ret
     55 
     56     def Index(self, columnName):
     57         return GodmaIndexedRowset(self.header, columnName, CRowset.Index(self, columnName), rowClass=self.rowClass)
     58 
     59     def Filter(self, columnName, indexName = None):
     60         return GodmaFilterRowset(self.header, columnName, indexName, CRowset.Filter(self, columnName, indexName), rowClass=self.rowClass)
     61 
     62 
     63 class GodmaIndexedRowset(CIndexedRowset):
     64 
     65     def __init__(self, header, columnName, ccdict = {}, rowClass = blue.DBRow):
     66         CIndexedRowset.__init__(self, header, columnName)
     67         self.rowClass = rowClass
     68         if len(ccdict):
     69             self.update(ccdict)
     70 
     71     def __getitem__(self, key):
     72         ret = CIndexedRowset.__getitem__(self, key)
     73         if isinstance(self.rowClass, types.MethodType) or not isinstance(ret, self.rowClass):
     74             if not isinstance(ret, blue.DBRow):
     75                 ret = blue.DBRow(self.header, ret)
     76             ret = self.rowClass(self.header, ret)
     77         return ret
     78 
     79     def values(self):
     80         return GodmaRowset(self.header, CIndexedRowset.values(self), rowClass=self.rowClass)
     81 
     82     def itervalues(self):
     83         if self.rowClass != blue.DBRow:
     84             return rowsetIterator(self)
     85         return CIndexedRowset.itervalues(self)
     86 
     87     def get(self, k, d = None):
     88         try:
     89             ret = self.__getitem__(k)
     90         except KeyError:
     91             return d
     92 
     93         return ret
     94 
     95     def pop(self, *args):
     96         if len(args) > 2 or len(args) < 1:
     97             raise TypeError('pop expected at most 2 arguments, got %d' % len(args))
     98         try:
     99             ret = self.__getitem__(args[0])
    100             del self[args[0]]
    101         except KeyError:
    102             if len(args) != 2:
    103                 raise
    104             return args[1]
    105 
    106         return ret
    107 
    108     def popitem(self):
    109         if len(self) == 0:
    110             raise KeyError
    111         import random
    112         key = random.randrange(len(self))
    113         ret = self.__getitem__(key)
    114         del self[key]
    115         return ret
    116 
    117 
    118 class GodmaFilterRowset(CFilterRowset):
    119 
    120     def __init__(self, header, columnName, indexName, ccdict = {}, rowClass = blue.DBRow):
    121         CFilterRowset.__init__(self, header, columnName)
    122         self.indexName = indexName
    123         self.rowClass = rowClass
    124         if len(ccdict) > 0:
    125             self.update(ccdict)
    126 
    127     def __getitem__(self, key):
    128         ret = CFilterRowset.__getitem__(self, key)
    129         if isinstance(ret, dict):
    130             if not isinstance(ret, GodmaIndexedRowset):
    131                 return GodmaIndexedRowset(self.header, self.indexName, ret, rowClass=self.rowClass)
    132             return ret
    133         if isinstance(self.rowClass, types.MethodType) or not isinstance(ret, self.rowClass):
    134             if not isinstance(ret, blue.DBRow):
    135                 print(' _!_ GodmaFilteredRowset storing non-DBRow as leaf-element:', type(ret))
    136                 ret = blue.DBRow(self.header, ret)
    137             return self.rowClass(self.header, ret)
    138         return ret
    139 
    140     def values(self):
    141         v = CFilterRowset.values(self)
    142         if isinstance(v, list):
    143             return v
    144         return GodmaIndexedRowset(self.header, self.indexName, v, rowClass=self.rowClass)
    145 
    146     def itervalues(self):
    147         if self.rowClass != blue.DBRow:
    148             return rowsetIterator(self)
    149         return CFilterRowset.itervalues(self)
    150 
    151     def get(self, k, d = None):
    152         try:
    153             ret = self.__getitem__(k)
    154         except KeyError:
    155             return d
    156 
    157         return ret
    158 
    159     def pop(self, *args):
    160         if len(args) > 2 or len(args) < 1:
    161             raise TypeError('pop expected at most 2 arguments, got %d' % len(args))
    162         try:
    163             ret = self.__getitem__(args[0])
    164             del self[args[0]]
    165         except KeyError:
    166             if len(args) != 2:
    167                 raise
    168             return args[1]
    169 
    170         return ret
    171 
    172     def popitem(self):
    173         if len(self) == 0:
    174             raise KeyError
    175         import random
    176         key = self.keys()[random.randrange(len(self))]
    177         ret = self.__getitem__(key)
    178         del self[key]
    179         return ret