class XmlrpcConnectionProvider(DBConnectionProvider): def __init__(self, host, db, user, pwd, verbose=0): """host: here is the url of the server db: TODO is meaningless here?""" DBConnectionProvider.__init__(self, host, db, user, pwd, verbose) self.verbose = verbose if self._host.startswith('https'): self.transport = SafeCookieTransport() else: self.transport = CookieTransport() self._server = None self._cache = {} self.dbmgr = None # Needed by _xmlrpcToDbe self.semaforo = threading.Semaphore() def customInit(self): """???""" pass def getConnection(self): self.semaforo.acquire(True) if self._server is None: self._server = Server(self._host, self.transport, 'utf-8') #,verbose=1 self.semaforo.release() return self def freeConnection(self, conn): self.semaforo.acquire(True) if self._server is not None: del self._server self._server = None self.semaforo.release() def getDBType(self): return "Xmlrpc" def isProxy(self): return True def _dbeToXmlrpc(self, dbe): ret = {} for n in dbe.getNames(): tmpvalue = dbe.getValue(n) if isinstance(tmpvalue, str) or isinstance(tmpvalue, unicode): try: tmpvalue.decode('ascii') except Exception: tmpvalue = Binary(tmpvalue) if isinstance(tmpvalue, datetime.datetime): ret[n] = "%s" % tmpvalue else: ret[n] = tmpvalue return [dbe.getTypeName(), ret] def _xmlrpcToDbe(self, xmldbe): typename = xmldbe['_typename'] xmldbe.pop('_typename') nomi = [n for n in xmldbe.keys()] valori = [n for n in xmldbe.values()] valori2 = [] for v in valori: if isinstance(v, Binary): v = v.data #if isinstance(v,str): v=u"%s"%v if isDateTime(v): #rra.dblayer.isDateTime(v): #"0000-00-00 00:00:00" v2 = None try: v2 = datetime.datetime(int(v[:4]), int(v[5:7]), int(v[8:10]), int(v[11:13]), int(v[14:16]), int(v[17:19])) except Exception: try: v2 = datetime.datetime(int(v[:4]), int(v[5:7]), int(v[8:10]), int(v[11:13]), int(v[14:16])) except Exception: try: v2 = datetime.time(int(v[11:13]), int(v[14:16]), int(v[17:19])) except Exception: v2 = datetime.time(int(v[11:13]), int(v[14:16])) valori2.append(v2) else: valori2.append(v) if isinstance(typename, Binary): typename = typename.data myclazz = self.dbmgr.getClazzByTypeName(typename) if isinstance(myclazz, RemoteDBE): return myclazz(myclazz.getTableName(), names=nomi, values=valori2) else: return myclazz(myclazz().getTableName(), names=nomi, values=valori2) def getRegisteredTypes(self): """Returns the registered types""" ret = {} try: self.semaforo.acquire(True) msg, lista = self._server.getTypeList() self.semaforo.release() self.lastMessages = msg.data for k, v in lista[0].iteritems(): ret[k] = RemoteDBE(k, v.data, self) self._cache = ret except Exception, e: print "XmlrpcConnectionProvider.getRegisteredTypes: ECCEZIONE ############# Inizio." print "ECCEZIONE: %s" % (e) print "".join(traceback.format_tb(sys.exc_info()[2])) print "XmlrpcConnectionProvider.getRegisteredTypes: ECCEZIONE ############# Fine." raise DBLayerException("Problemi di comunicazione col server: %s" % e) return ret