예제 #1
0
    def _handle_done(self, resp, mres):
        self.done = True
        self._c_handle = None
        if resp.rc:
            if resp.rc == C.LCB_HTTP_ERROR:
                try:
                    raise PyCBC.exc_http(self.value)
                except:
                    mres._add_err(sys.exc_info())
            else:
                mres._add_bad_rc(resp.rc, self)

        if resp.nvalue:
            self.value = buf2str(resp.value, resp.nvalue)
            try:
                self.value = PyCBC.json_decode(self.value)
            except:
                pass

        if resp.htresp:
            if not self.value and resp.htresp.nbody:
                self.value = buf2str(resp.htresp.body, resp.htresp.nbody)
            self.http_status = resp.htresp.htstatus

        if self._parent._is_async:
            try:
                mres._maybe_throw()
                self._invoke_async(mres, is_final=True)
            except:
                mres.errback(mres, *sys.exc_info())
            finally:
                del self._parent
예제 #2
0
    def _handle_done(self, resp, mres):
        self.done = True
        self._c_handle = None
        if resp.rc:
            if resp.rc == C.LCB_HTTP_ERROR:
                try:
                    raise PyCBC.exc_http(self.value)
                except:
                    mres._add_err(sys.exc_info())
            else:
                mres._add_bad_rc(resp.rc, self)

        if resp.nvalue:
            self.value = buf2str(resp.value, resp.nvalue)
            try:
                self.value = PyCBC.json_decode(self.value)
            except:
                pass

        if resp.htresp:
            if not self.value and resp.htresp.nbody:
                self.value = buf2str(resp.htresp.body, resp.htresp.nbody)
            self.http_status = resp.htresp.htstatus

        if self._parent._is_async:
            try:
                mres._maybe_throw()
                self._invoke_async(mres, is_final=True)
            except:
                mres.errback(mres, *sys.exc_info())
            finally:
                del self._parent
def _modify_helpers(**kw):
    ret = {}
    for k, v in kw.items():
        ret[k] = PyCBC.get(k)
        PyCBC.configure(k, v)

    # print("Modification requested!")
    return ret
예제 #4
0
 def _maybe_throw(self):
     """
     Throw any deferred exceptions set via :meth:`_add_err`
     """
     if self._err:
         ex_cls, ex_obj, ex_bt = self._err
         self._err = None
         PyCBC.raise_helper(ex_cls, ex_obj, ex_bt)
예제 #5
0
 def _maybe_throw(self):
     """
     Throw any deferred exceptions set via :meth:`_add_err`
     """
     if self._err:
         ex_cls, ex_obj, ex_bt = self._err
         self._err = None
         PyCBC.raise_helper(ex_cls, ex_obj, ex_bt)
예제 #6
0
def _modify_helpers(**kw):
    ret = {}
    for k, v in kw.items():
        ret[k] = PyCBC.get(k)
        PyCBC.configure(k, v)

    # print("Modification requested!")
    return ret
예제 #7
0
    def _handle_response(self, mres, resp):
        result = self
        headers = result.headers

        if resp.headers:
            ix = 0
            while True:
                pp = resp.headers[ix]
                if pp == ffi.NULL:
                    break
                key = from_cstring(resp.headers[ix])
                value = from_cstring(resp.headers[ix+1])
                headers[key] = value
                ix += 2

        result.rc = resp.rc
        result.htcode = resp.htstatus

        if resp.rc:
            mres._add_bad_rc(resp.rc)
        elif not self.success and not mres._quiet:
            try:
                raise PyCBC.exc_http(self.value, response=self)
            except PyCBC.default_exception:
                mres._add_err(sys.exc_info())

        if resp.nbody:
            buf = bytes(ffi.buffer(ffi.cast('const char*', resp.body), resp.nbody))
            tc = self._parent._tc
            try:
                result.http_data = tc.decode_value(buf, self._format)
            except:
                if not self._quiet:
                    mres._add_err(sys.exc_info())
                result.http_data = buf
예제 #8
0
    def __init__(self,
                 path,
                 method=C.LCB_HTTP_METHOD_GET,
                 type=C.LCB_HTTP_TYPE_VIEW,
                 response_format=FMT_JSON,
                 content_type='application_json',
                 post_data=None,
                 quiet=False):

        super(HttpRequest, self).__init__()
        self.key = path
        self._parent = None
        self._format = response_format
        self._quiet = quiet
        self._type = type

        if not path:
            raise PyCBC.exc_args('Must provide path')

        def _do_schedule(parent, mres):
            bm = BufManager(ffi)
            cmd = ffi.new('lcb_CMDHTTP*')
            cmd.type = self._type
            cmd.method = method

            C._Cb_set_key(cmd, *bm.new_cbuf(path))
            cmd.body, cmd.nbody = bm.new_cbuf(post_data)
            cmd.content_type = bm.new_cstr(content_type)
            rc = C.lcb_http3(parent._lcbh, mres._cdata, cmd)
            if rc:
                raise PyCBC.exc_lcb(rc, 'Scheduling HTTP request')

        self.__sched = _do_schedule
예제 #9
0
    def _pipeline_end(self):
        if self._pipeline_queue is None:
            PyCBC.exc_pipeline('No pipeline in progress!')

        C.lcb_wait(self._lcbh)
        results = self._pipeline_queue
        self._pipeline_queue = None
        rv = []

        for mres in results:
            mres._maybe_throw()
            if mres._is_single:
                rv.append(mres.unwrap_single())
            else:
                rv.append(mres)
        return rv
예제 #10
0
    def __init__(self, path, method=C.LCB_HTTP_METHOD_GET,
                 type=C.LCB_HTTP_TYPE_VIEW, response_format=FMT_JSON,
                 content_type='application_json', post_data=None, quiet=False):

        super(HttpRequest, self).__init__()
        self.key = path
        self._parent = None
        self._format = response_format
        self._quiet = quiet
        self._type = type

        if not path:
            raise PyCBC.exc_args('Must provide path')

        def _do_schedule(parent, mres):
            bm = BufManager(ffi)
            cmd = ffi.new('lcb_CMDHTTP*')
            cmd.type = self._type
            cmd.method = method

            C._Cb_set_key(cmd, *bm.new_cbuf(path))
            cmd.body, cmd.nbody = bm.new_cbuf(post_data)
            cmd.content_type = bm.new_cstr(content_type)
            rc = C.lcb_http3(parent._lcbh, mres._cdata, cmd)
            if rc:
                raise PyCBC.exc_lcb(rc, 'Scheduling HTTP request')

        self.__sched = _do_schedule
예제 #11
0
 def _do_lock(self):
     if self._lockmode == LOCKMODE_NONE:
         return
     elif self._lockmode == LOCKMODE_EXC:
         if not self._lock.acquire(False):
             raise PyCBC.exc_lock()
     else:
         self._lock.acquire(True)
예제 #12
0
 def _thr_lockop(self, arg):
     # Used by tests
     if not self._lockmode:
         raise PyCBC.exc_lock()
     if not arg:
         self._lock.acquire(True)
     else:
         self._lock.release()
예제 #13
0
        def _do_schedule(parent, mres):
            bm = BufManager(ffi)
            cmd = ffi.new('lcb_CMDHTTP*')
            cmd.type = self._type
            cmd.method = method

            C._Cb_set_key(cmd, *bm.new_cbuf(path))
            cmd.body, cmd.nbody = bm.new_cbuf(post_data)
            cmd.content_type = bm.new_cstr(content_type)
            rc = C.lcb_http3(parent._lcbh, mres._cdata, cmd)
            if rc:
                raise PyCBC.exc_lcb(rc, 'Scheduling HTTP request')
예제 #14
0
        def _do_schedule(parent, mres):
            bm = BufManager(ffi)
            cmd = ffi.new('lcb_CMDHTTP*')
            cmd.type = self._type
            cmd.method = method

            C._Cb_set_key(cmd, *bm.new_cbuf(path))
            cmd.body, cmd.nbody = bm.new_cbuf(post_data)
            cmd.content_type = bm.new_cstr(content_type)
            rc = C.lcb_http3(parent._lcbh, mres._cdata, cmd)
            if rc:
                raise PyCBC.exc_lcb(rc, 'Scheduling HTTP request')
예제 #15
0
    def _on_single_row(self, instance, cbtype, resp):
        mres = ffi.from_handle(resp.cookie)
        if resp.rflags & C.LCB_RESP_F_FINAL:
            if resp.nvalue:
                self.value = bytes(ffi.buffer(resp.value, resp.nvalue))
            self._step(mres, True)
            self._done(mres, resp.rc,
                       resp.htresp.htstatus if resp.htresp else 0)
            return

        # Actually parse the row here!
        row = {}
        if resp.nkey:
            row['key'] = PyCBC.json_decode(buf2str(resp.key, resp.nkey))
        if resp.nvalue:
            row['value'] = PyCBC.json_decode(buf2str(resp.value, resp.nvalue))
        if resp.docid:
            # Document ID is always a simple string, so no need to decode
            row['id'] = buf2str(resp.docid, resp.ndocid)

        if resp.docresp:
            py_doc = ValueResult()
            l_doc = resp.docresp
            row['__DOCRESULT__'] = py_doc
            py_doc.key = row['id']
            py_doc.flags = l_doc.itmflags
            py_doc.cas = l_doc.cas
            py_doc.rc = l_doc.rc
            if not resp.docresp.rc:
                buf = bytes(ffi.buffer(l_doc.value, l_doc.nvalue))
                try:
                    tc = self._parent._tc
                    py_doc.value = tc.decode_value(buf, py_doc.flags)
                except:
                    py_doc.value = buf[::]

        # So now that we have a row..
        self.rows.append(row)
        self._step(mres, False)
예제 #16
0
    def _on_single_row(self, instance, cbtype, resp):
        mres = ffi.from_handle(resp.cookie)
        if resp.rflags & C.LCB_RESP_F_FINAL:
            self._handle_done(resp, mres)
            return

        if resp.rc != C.LCB_SUCCESS:
            mres._add_bad_rc(resp.rc, self)
            return

        row = {}
        if resp.nkey:
            row['key'] = PyCBC.json_decode(buf2str(resp.key, resp.nkey))
        if resp.nvalue:
            row['value'] = PyCBC.json_decode(buf2str(resp.value, resp.nvalue))
        if resp.docid:
            # Document ID is always a simple string, so no need to decode
            row['id'] = buf2str(resp.docid, resp.ndocid)

        if resp.docresp:
            py_doc = ValueResult()
            l_doc = resp.docresp
            row['__DOCRESULT__'] = py_doc
            py_doc.key = row['id']
            py_doc.flags = l_doc.itmflags
            py_doc.cas = l_doc.cas
            py_doc.rc = l_doc.rc
            if not resp.docresp.rc:
                buf = bytes(ffi.buffer(l_doc.value, l_doc.nvalue))
                try:
                    tc = self._parent._tc
                    py_doc.value = tc.decode_value(buf, py_doc.flags)
                except:
                    py_doc.value = buf[::]

        # So now that we have a row..
        self.rows.append(row)
        if self._parent._is_async:
            self._invoke_async(mres)
예제 #17
0
    def _on_single_row(self, instance, cbtype, resp):
        mres = ffi.from_handle(resp.cookie)
        if resp.rflags & C.LCB_RESP_F_FINAL:
            self._handle_done(resp, mres)
            return

        if resp.rc != C.LCB_SUCCESS:
            mres._add_bad_rc(resp.rc, self)
            return

        row = {}
        if resp.nkey:
            row['key'] = PyCBC.json_decode(buf2str(resp.key, resp.nkey))
        if resp.nvalue:
            row['value'] = PyCBC.json_decode(buf2str(resp.value, resp.nvalue))
        if resp.docid:
            # Document ID is always a simple string, so no need to decode
            row['id'] = buf2str(resp.docid, resp.ndocid)

        if resp.docresp:
            py_doc = ValueResult()
            l_doc = resp.docresp
            row['__DOCRESULT__'] = py_doc
            py_doc.key = row['id']
            py_doc.flags = l_doc.itmflags
            py_doc.cas = l_doc.cas
            py_doc.rc = l_doc.rc
            if not resp.docresp.rc:
                buf = bytes(ffi.buffer(l_doc.value, l_doc.nvalue))
                try:
                    tc = self._parent._tc
                    py_doc.value = tc.decode_value(buf, py_doc.flags)
                except:
                    py_doc.value = buf[::]

        # So now that we have a row..
        self.rows.append(row)
        if self._parent._is_async:
            self._invoke_async(mres)
예제 #18
0
    def _on_single_row(self, instance, cbtype, resp):
        mres = ffi.from_handle(resp.cookie)
        if resp.rflags & C.LCB_RESP_F_FINAL:
            if resp.nrow:
                self.value = bytes(ffi.buffer(resp.row, resp.nrow))
            self._step(mres, True)
            self._done(mres, resp.rc,
                       resp.htresp.htstatus if resp.htresp else 0)
        else:
            # Simply parse the row
            try:
                row = PyCBC.json_decode(bytes(ffi.buffer(resp.row, resp.nrow)))
                self.rows.append(row)
            except:
                mres._add_err(sys.exc_info())

        self._step(mres, False)
예제 #19
0
    def _handle_response(self, mres, resp):
        result = self
        headers = result.headers

        if resp.headers:
            ix = 0
            while True:
                pp = resp.headers[ix]
                if pp == ffi.NULL:
                    break
                key = from_cstring(resp.headers[ix])
                value = from_cstring(resp.headers[ix + 1])
                headers[key] = value
                ix += 2

        result.rc = resp.rc
        result.htcode = resp.htstatus

        if resp.rc:
            mres._add_bad_rc(resp.rc)
        elif not self.success and not mres._quiet:
            try:
                raise PyCBC.exc_http(self.value, response=self)
            except PyCBC.default_exception:
                mres._add_err(sys.exc_info())

        if resp.nbody:
            buf = bytes(
                ffi.buffer(ffi.cast('const char*', resp.body), resp.nbody))
            tc = self._parent._tc
            try:
                result.http_data = tc.decode_value(buf, self._format)
            except:
                if not self._quiet:
                    mres._add_err(sys.exc_info())
                result.http_data = buf
예제 #20
0
 def __repr__(self):
     return PyCBC.result_reprfunc(self)
예제 #21
0
 def _do_json_decode(self, value):
     return PyCBC.json_decode(value)
 def _do_json_decode(self, value):
     return PyCBC.json_decode(value)
예제 #23
0
 def _chk_no_pipeline(self, msg='Pipeline active'):
     if self._pipeline_queue is not None:
         PyCBC.exc_pipeline(msg)
예제 #24
0
 def make_result(self, key, value):
     vr = PyCBC.sd_result_type()  # type: _SDResult
     vr.key = key
     vr._specs = value
     return vr
예제 #25
0
 def __repr__(self):
     return PyCBC.obsinfo_reprfunc(self)
예제 #26
0
 def __repr__(self):
     return PyCBC.result_reprfunc(self)
예제 #27
0
 def __repr__(self):
     return PyCBC.obsinfo_reprfunc(self)
예제 #28
0
def _get_helper(k):
    return PyCBC.get(k)
def _get_helper(k):
    return PyCBC.get(k)
예제 #30
0
 def _do_pickle_decode(self, value):
     return PyCBC.pickle_decode(value)
예제 #31
0
 def _add_exc_wrap(self, *args, **kw):
     try:
         PyCBC.exc_common(*args, **kw)
     except PyCBC.default_exception:
         self._add_err(sys.exc_info())
 def _do_pickle_decode(self, value):
     return PyCBC.pickle_decode(value)