예제 #1
0
 def _connect(self):
     if self._closed:
         raise PyRedisConnError('Connection Gone')
     if self.host:
         sock = self._connect_inet46()
     else:
         sock = self._connect_unix()
     self._sock = sock
     if self._encoding:
         self._reader = Reader(encoding=self._encoding)
     else:
         self._reader = Reader()
     if not self._sentinel:
         self._authenticate()
         self._setdb()
     self._sock.settimeout(self._read_timeout)
예제 #2
0
def execute(commands, client=None, sock=None, fail=True):
    assert client or sock, 'client or sock is required'

    if client:
        conn = client.connection_pool.get_connection('MULTI')
        conn.send_packed_command([b''.join(commands)])
        sock = conn._sock
    else:
        sock.sendall(b''.join(commands))

    try:
        errors = []
        cnt = len(commands)
        reader = Reader()
        while cnt > 0:
            data = sock.recv(16384)
            if not data:
                break  # pragma: no cover

            reader.feed(data)
            while True:
                r = reader.gets()
                if r is False:
                    break
                if type(r) is ReplyError:
                    errors.append(
                        (str(r), parse_cmd(commands[len(commands) - cnt])))
                cnt -= 1
    finally:
        client and client.connection_pool.release(conn)

    if errors and fail:
        raise RedisError(*errors[0])

    return errors