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

cachedObject.py (4670B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\script\net\cachedObject.py
      2 import binascii
      3 import sys
      4 import zlib
      5 import blue
      6 import uthread
      7 import carbon.common.script.net.machobase as macho
      8 from carbon.common.script.util.timerstuff import ClockThis
      9 
     10 class CachedObject:
     11     __guid__ = 'util.CachedObject'
     12     __passbyvalue__ = 1
     13     __persistvar__ = ['__objectID__',
     14      '__nodeID__',
     15      '__objectVersion__',
     16      '__shared__']
     17 
     18     def __init__(self, shared, objectID, cachedObject, objectVersion = None):
     19         self.__shared__ = shared
     20         self.__objectID__ = objectID
     21         self.__nodeID__ = sm.GetService('machoNet').GetNodeID()
     22         self.__cachedObject__ = cachedObject
     23         self.__compressed__ = 0
     24         self.__thePickle__ = None
     25         self.__objectVersion__ = (blue.os.GetWallclockTimeNow(), objectVersion)
     26         if (self.__shared__ or objectVersion is None) and macho.mode != 'client':
     27             self.__thePickle__ = blue.marshal.Save(cachedObject)
     28             if len(self.__thePickle__) > 170:
     29                 try:
     30                     t = ClockThis('machoNet::util.CachedObject::compress', zlib.compress, self.__thePickle__, 1)
     31                 except zlib.error as e:
     32                     raise RuntimeError('Compression Failure: ' + strx(e))
     33 
     34                 if len(t) < len(self.__thePickle__):
     35                     self.__thePickle__ = t
     36                     self.__compressed__ = 1
     37             if objectVersion is None:
     38                 self.__objectVersion__ = (self.__objectVersion__[0], binascii.crc_hqx(self.__thePickle__, macho.version + 170472))
     39 
     40     def __getstate__(self):
     41         ret = [ getattr(self, attr) for attr in self.__persistvar__ ]
     42         if ret[-1]:
     43             ret = ret[:-1]
     44         return tuple(ret)
     45 
     46     def __str__(self):
     47         try:
     48             ret = []
     49             for each in self.__persistvar__ + ['__thePickle__', '__compressed__']:
     50                 if each == '__thePickle__':
     51                     ret.append(len(each))
     52                 else:
     53                     ret.append(self.__dict__[each])
     54 
     55             return '<CachedObject %s>' % str(ret)
     56         except Exception:
     57             sys.exc_clear()
     58             return '<CachedObject ?>'
     59 
     60     def __repr__(self):
     61         return str(self)
     62 
     63     def __setstate__(self, state):
     64         for i in xrange(len(self.__persistvar__)):
     65             if i >= len(state):
     66                 if self.__persistvar__[i] == '__shared__':
     67                     setattr(self, self.__persistvar__[i], 1)
     68                 else:
     69                     raise RuntimeError('Cached Object format version mismatch')
     70             else:
     71                 setattr(self, self.__persistvar__[i], state[i])
     72 
     73         self.__cachedObject__ = None
     74         self.__thePickle__ = None
     75         self.__compressed__ = 0
     76 
     77     def __getattr__(self, key):
     78         if key == '__getinitargs__':
     79             raise AttributeError(key, "CachedObject's cannot define __getinitargs__")
     80         self.__UpdateCache()
     81         c = self.__cachedObject__
     82         if c is None:
     83             raise ReferenceError('The specified object is no longer available in cache')
     84         return getattr(c, key)
     85 
     86     def __getitem__(self, key):
     87         self.__UpdateCache()
     88         c = self.__cachedObject__
     89         if c is None:
     90             raise ReferenceError('The specified object is no longer available in cache')
     91         return c[key]
     92 
     93     def __UpdateCache(self):
     94         if self.__cachedObject__ is not None:
     95             return
     96         if '__semaphore__' not in self.__dict__:
     97             s = uthread.Semaphore(('cachedObject',
     98              self.__objectID__,
     99              self.__objectVersion__,
    100              self.__nodeID__))
    101             self.__semaphore__ = s
    102         with self.__semaphore__:
    103             if self.__cachedObject__ is None:
    104                 self.__cachedObject__ = sm.GetService('objectCaching').GetCachableObject(self.__shared__, self.__objectID__, self.__objectVersion__, self.__nodeID__).GetObject()
    105         if '__semaphore__' in self.__dict__:
    106             if self.__semaphore__.IsCool():
    107                 del self.__semaphore__
    108 
    109     def GetCachedObject(self):
    110         self.__UpdateCache()
    111         if self.__cachedObject__ is None:
    112             raise ReferenceError('The specified object is no longer available in cache')
    113         return self.__cachedObject__
    114 
    115     def GetObjectID(self):
    116         return self.__objectID__
    117 
    118     def MachoGetCachedObjectGuts(self):
    119         return (self.__shared__,
    120          self.__objectID__,
    121          self.__objectVersion__,
    122          self.__nodeID__,
    123          self.__cachedObject__,
    124          self.__thePickle__,
    125          self.__compressed__)