Example #1
0
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