兼容python3的SSDB客户端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了兼容python3的SSDB客户端相关的知识,希望对你有一定的参考价值。

SSDB.py

import socket


class SSDB_Response(object):
    def __init__(self, code=‘‘, data_or_message=None):
        self.type = none
        self.code = code
        self.data = None
        self.message = None
        self.set(code, data_or_message)

    def set(self, code, data_or_message=None):
        self.code = code

        if code == ok:
            self.data = data_or_message
        else:
            if isinstance(data_or_message, list):
                if len(data_or_message) > 0:
                    self.message = data_or_message[0]
            else:
                self.message = data_or_message

    def __repr__(self):
        return ((((str(self.code) +  ) + str(self.message)) +  ) + str(self.data))

    def ok(self):
        return self.code == ok

    def not_found(self):
        return self.code == not_found

    def str_resp(self, resp):
        self.type = val

        if resp[0] == ok:
            if len(resp) == 2:
                self.set(ok, resp[1])
            else:
                self.set(server_error, Invalid response)
        else:
            self.set(resp[0], resp[1:])
        return self

    def str_resp(self, resp):
        self.type = val
        if resp[0] == ok:
            if len(resp) == 2:
                self.set(ok, resp[1])
            else:
                self.set(server_error, Invalid response)
        else:
            self.set(resp[0], resp[1:])
        return self

    def int_resp(self, resp):
        self.type = val

        if resp[0] == ok:
            if len(resp) == 2:
                try:
                    val = int(resp[1])
                    self.set(ok, val)
                except Exception as e:
                    self.set(server_error, Invalid response)
            else:
                self.set(server_error, Invalid response)
        else:
            pass
            self.set(resp[0], resp[1:])
        return self

    def float_resp(self, resp):
        self.type = val
        if resp[0] == ok:
            if len(resp) == 2:
                try:
                    val = float(resp[1])
                    self.set(ok, val)
                except Exception as e:
                    self.set(server_error, Invalid response)
            else:
                self.set(server_error, Invalid response)
        else:
            self.set(resp[0], resp[1:])
        return self

    def list_resp(self, resp):
        self.type = list
        self.set(resp[0], resp[1:])
        return self

    def int_map_resp(self, resp):
        self.type = map

        if resp[0] == ok:
            if len(resp) % 2 == 1:
                data = {index: [], items: {}, }
                i = 1

                while i < len(resp):
                    k = resp[i]
                    v = resp[(i + 1)]
                    try:
                        v = int(v)
                    except Exception as e:
                        v = - (1)
                    data[index].append(k)
                    data[items][k] = v
                    i += 2
                self.set(ok, data)
            else:
                self.set(server_error, Invalid response)
        else:
            self.set(resp[0], resp[1:])
        return self

    def str_map_resp(self, resp):
        self.type = map

        if resp[0] == ok:

            if len(resp) % 2 == 1:
                data = {index: [], items: {}, }
                i = 1

                while i < len(resp):
                    k = resp[i]
                    v = resp[(i + 1)]
                    data[index].append(k)
                    data[items][k] = v
                    i += 2
                self.set(ok, data)
            else:
                self.set(server_error, Invalid response)
        else:
            self.set(resp[0], resp[1:])
        return self


class SSDB(object):
    def __init__(self, host, port):
        self.recv_buf = ‘‘
        self._closed = False
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect(tuple([host, port]))
        self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

    def close(self):
        if not (self._closed):
            self.sock.close()
            self._closed = True

    def closed(self):
        pass
        return self._closed

    def request(self, cmd, params=None):
        pass

        if params is None:
            params = []
        params = ([cmd] + params)
        self.send(params)
        resp = self.recv()

        if resp is None:
            return SSDB_Response(error, Unknown error)

        if len(resp) == 0:
            return SSDB_Response(disconnected, Connection closed)
        ret = SSDB_Response()

        # {{{ switch: cmd
        _continue_1 = False
        while True:
            if False or ((cmd) == ping) or ((cmd) == set) or ((cmd) == del) or ((cmd) == qset) or (
                (cmd) == zset) or ((cmd) == hset) or ((cmd) == qpush) or ((cmd) == qpush_front) or (
                (cmd) == qpush_back) or ((cmd) == zdel) or ((cmd) == hdel) or ((cmd) == multi_set) or (
                (cmd) == multi_del) or ((cmd) == multi_hset) or ((cmd) == multi_hdel) or (
                (cmd) == multi_zset) or ((cmd) == multi_zdel):
                if len(resp) > 1:
                    return ret.int_resp(resp)
                else:
                    return SSDB_Response(resp[0], None)
                break
            if False or ((cmd) == version) or ((cmd) == substr) or ((cmd) == get) or ((cmd) == getset) or (
                (cmd) == hget) or ((cmd) == qfront) or ((cmd) == qback) or ((cmd) == qget):
                pass
                return ret.str_resp(resp)
                break
            if False or ((cmd) == qpop) or ((cmd) == qpop_front) or ((cmd) == qpop_back):
                size = 1
                try:
                    size = int(params[2])
                except Exception as e:
                    pass

                if size == 1:
                    return ret.str_resp(resp)
                else:
                    return ret.list_resp(resp)
                break
            if False or ((cmd) == dbsize) or ((cmd) == getbit) or ((cmd) == setbit) or ((cmd) == countbit) or (
                (cmd) == bitcount) or ((cmd) == strlen) or ((cmd) == ttl) or ((cmd) == expire) or (
                (cmd) == setnx) or ((cmd) == incr) or ((cmd) == decr) or ((cmd) == zincr) or (
                (cmd) == zdecr) or ((cmd) == hincr) or ((cmd) == hdecr) or ((cmd) == hsize) or (
                (cmd) == zsize) or ((cmd) == qsize) or ((cmd) == zget) or ((cmd) == zrank) or (
                (cmd) == zrrank) or ((cmd) == zsum) or ((cmd) == zcount) or ((cmd) == zremrangebyrank) or (
                (cmd) == zremrangebyscore) or ((cmd) == hclear) or ((cmd) == zclear) or ((cmd) == qclear) or (
                (cmd) == qpush) or ((cmd) == qpush_front) or ((cmd) == qpush_back) or (
                (cmd) == qtrim_front) or ((cmd) == qtrim_back):
                pass
                return ret.int_resp(resp)
                break
            if False or ((cmd) == zavg):
                pass
                return ret.float_resp(resp)
                break
            if False or ((cmd) == keys) or ((cmd) == rkeys) or ((cmd) == zkeys) or ((cmd) == zrkeys) or (
                (cmd) == hkeys) or ((cmd) == hrkeys) or ((cmd) == list) or ((cmd) == hlist) or (
                (cmd) == hrlist) or ((cmd) == zlist) or ((cmd) == zrlist):
                pass
                return ret.list_resp(resp)
                break
            if False or ((cmd) == scan) or ((cmd) == rscan) or ((cmd) == hgetall) or ((cmd) == hscan) or (
                (cmd) == hrscan):
                pass
                return ret.str_map_resp(resp)
                break
            if False or ((cmd) == zscan) or ((cmd) == zrscan) or ((cmd) == zrange) or ((cmd) == zrrange) or (
                (cmd) == zpop_front) or ((cmd) == zpop_back):
                pass
                return ret.int_map_resp(resp)
                break
            if False or ((cmd) == auth) or ((cmd) == exists) or ((cmd) == hexists) or ((cmd) == zexists):
                pass
                return ret.int_resp(resp)
                break
            if False or ((cmd) == multi_exists) or ((cmd) == multi_hexists) or ((cmd) == multi_zexists):
                pass
                return ret.int_map_resp(resp)
                break
            if False or ((cmd) == multi_get) or ((cmd) == multi_hget):
                pass
                return ret.str_map_resp(resp)
                break
            if False or ((cmd) == multi_hsize) or ((cmd) == multi_zsize) or ((cmd) == multi_zget):
                pass
                return ret.int_map_resp(resp)
                break
            ### default
            return ret.list_resp(resp)
            break
            break
            if _continue_1:
                continue
        # }}} switch

        return SSDB_Response(error, Unknown error)

    def send(self, data):
        pass
        ps = []

        _cpy_r_0 = _cpy_l_1 = data
        if type(_cpy_r_0).__name__ == dict:
            _cpy_b_3 = True; _cpy_l_1 = _cpy_r_0.iterkeys()
        else:
            _cpy_b_3 = False;
        for _cpy_k_2 in _cpy_l_1:
            if _cpy_b_3:
                p = _cpy_r_0[_cpy_k_2]
            else:
                p = _cpy_k_2
            pass
            p = str(p)
            ps.append(str(len(p)))
            ps.append(p)
        nl = \n
        s = (nl.join(ps) + \n\n)
        try:
            while True:
                ret = self.sock.send(s.encode())
                if ret == 0:
                    return - (1)
                s = s[ret:]
                if len(s) == 0:
                    break
        except socket.error as e:
            return -(1)
        return ret

    def net_read(self):
        try:
            data = self.sock.recv(1024 * 8)
        except Exception as e:
            data = ‘‘

        if data == ‘‘:
            self.close()
            return 0
        self.recv_buf += str(data,encoding = "ascii")
        return len(data)

    def recv(self):
        while True:
            ret = self.parse()
            if ret is None:
                if self.net_read() == 0:
                    return []
            else:
                return ret

    def parse(self):
        pass
        ret = []
        spos = 0
        epos = 0

        while True:
            spos = epos
            epos = self.recv_buf.find(\n, spos)

            if epos == - (1):
                break
            epos += 1
            line = self.recv_buf[spos: epos]
            spos = epos

            if line.strip() == ‘‘:
                if len(ret) == 0:
                    continue
                else:
                    self.recv_buf = self.recv_buf[spos:]
                    return ret
            try:
                num = int(line)
            except Exception as e:
                return []
            epos = (spos + num)

            if epos > len(self.recv_buf):
                break
            data = self.recv_buf[spos: epos]
            ret.append(data)
            spos = epos
            epos = self.recv_buf.find(\n, spos)

            if epos == - (1):
                break
            epos += 1
        return None

测试程序

from SSDB import SSDB

ssdb = SSDB(192.168.1.250, 8888)

l  =  []
l.append(person_1)
l.append(a)
l.append(1111)
l.append(b)
l.append(2222)

print(ssdb.request(multi_hset, l))

‘‘‘
print(ssdb.request(set, [test, 123]))
print(ssdb.request(get, [test]))
print(ssdb.request(incr, [test, 1]))
print(ssdb.request(decr, [test, 1]))
print(ssdb.request(scan, [a, z, 10]))
print(ssdb.request(rscan, [z, a, 10]))
print(ssdb.request(keys, [a, z, 10]))
print(ssdb.request(del, [test]))
print(ssdb.request(get, [test]))
print("\n")
print(ssdb.request(zset, [test, a, 20]))
print(ssdb.request(zget, [test, a]))
print(ssdb.request(zincr, [test, a, 20]))
print(ssdb.request(zdecr, [test, a, 20]))
print(ssdb.request(zscan, [test, a, 0, 100, 10]))
print(ssdb.request(zrscan, [test, a, 100, 0, 10]))
print(ssdb.request(zkeys, [test, a, 0, 100, 10]))
print(ssdb.request(zdel, [test, a]))
print(ssdb.request(zget, [test, a]))
print("\n")
print(ssdb.request(hset, [test, a, 20]))
print(ssdb.request(hget, [test, a]))
print(ssdb.request(hincr, [test, a, 20]))
print(ssdb.request(hdecr, [test, a, 20]))
print(ssdb.request(hscan, [test, 0, z, 10]))
print(ssdb.request(hrscan, [test, z, 0, 10]))
print(ssdb.request(hkeys, [test, 0, z, 10]))
print(ssdb.request(hdel, [test, a]))
print(ssdb.request(hget, [test, a]))
print("\n")
‘‘‘

 

以上是关于兼容python3的SSDB客户端的主要内容,如果未能解决你的问题,请参考以下文章

python3生成测试数据,并写入ssdb

SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.

学习笔记:python3,代码片段(2017)

scrapy主动退出爬虫的代码片段(python3)

scrapy按顺序启动多个爬虫代码片段(python3)

兼容ie8,firefox,chrome浏览器的代码片段