def get_more(collection_name, num_to_return, cursor_id): """Get a **getMore** message. """ data = __ZERO data += bson._make_c_string(collection_name) data += struct.pack("<i", num_to_return) data += struct.pack("<q", cursor_id) return __pack_message(2005, data)
def insert(col, doc_or_docs): try: doc_or_docs.fromkeys doc_or_docs = [doc_or_docs] except AttributeError: pass doc_data = "".join(BSON.from_dict(doc) for doc in doc_or_docs) colname = _make_c_string(col) return "%s%s%s" % (_ZERO, colname, doc_data)
def query(col, spec, fields, skip, limit): data = [ _ZERO, _make_c_string(col), struct.pack('<ii', skip, limit), BSON.from_dict(spec or {}), ] if fields: data.append(BSON.from_dict(dict.fromkeys(fields, 1))) return "".join(data)
def update(col, spec, doc, upsert, multi): colname = _make_c_string(col) flags = 0 if upsert: flags |= 1 << 0 if multi: flags |= 1 << 1 fmt = '<i%dsi' % len(colname) part = struct.pack(fmt, 0, colname, flags) return "%s%s%s" % (part, BSON.from_dict(spec), BSON.from_dict(doc))
def subscribe(self, col, spec): """Subscribe to updates of document in col identified by spec.""" data = [ "\x00\x00\x00\x00", _make_c_string("%s@%s" % (self._pubsub_id, col)), struct.pack('<ii', 0, 0), BSON.from_dict(spec), ] msg = "".join(data) yield self._put_request(OP_SUBSCRIBE, msg) yield response('')
def query(options, collection_name, num_to_skip, num_to_return, query, field_selector=None): """Get a **query** message. """ data = struct.pack("<I", options) data += bson._make_c_string(collection_name) data += struct.pack("<i", num_to_skip) data += struct.pack("<i", num_to_return) data += bson.BSON.from_dict(query) if field_selector is not None: data += bson.BSON.from_dict(field_selector) return __pack_message(2004, data)
def insert(collection_name, docs, check_keys, safe): """Get an **insert** message. """ data = __ZERO data += bson._make_c_string(collection_name) data += "".join([bson.BSON.from_dict(doc, check_keys) for doc in docs]) if safe: (_, insert_message) = __pack_message(2002, data) (request_id, error_message) = __last_error() return (request_id, insert_message + error_message) else: return __pack_message(2002, data)
def delete(collection_name, spec, safe): """Get a **delete** message. """ data = __ZERO data += bson._make_c_string(collection_name) data += __ZERO data += bson.BSON.from_dict(spec) if safe: (_, remove_message) = __pack_message(2006, data) (request_id, error_message) = __last_error() return (request_id, remove_message + error_message) else: return __pack_message(2006, data)
def insert(collection_name, docs, check_keys, safe): """Get an **insert** message. """ data = __ZERO data += bson._make_c_string(collection_name) bson_data = "".join([bson.BSON.from_dict(doc, check_keys) for doc in docs]) if not bson_data: raise InvalidOperation("cannot do an empty bulk insert") data += bson_data if safe: (_, insert_message) = __pack_message(2002, data) (request_id, error_message) = __last_error() return (request_id, insert_message + error_message) else: return __pack_message(2002, data)
def wait(self, collection=''): """Wait for events to be published on subscribed docs in collection. If no collection is given, the proxy will notify for all subscribed docs across collections. """ data = "\x00\x00\x00\x00%s%s" % ( _make_c_string(collection), self._pubsub_id, ) yield self._put_request(OP_WAIT, data) doclen = struct.unpack('<i', (yield bytes(4)))[0] rawdoc = yield bytes(doclen) objs = [] while rawdoc: obj, rawdoc = _bson_to_dict(rawdoc) objs.append(obj) yield response(objs)
def update(collection_name, upsert, multi, spec, doc, safe): """Get an **update** message. """ options = 0 if upsert: options += 1 if multi: options += 2 data = __ZERO data += bson._make_c_string(collection_name) data += struct.pack("<i", options) data += bson.BSON.from_dict(spec) data += bson.BSON.from_dict(doc) if safe: (_, update_message) = __pack_message(2001, data) (request_id, error_message) = __last_error() return (request_id, update_message + error_message) else: return __pack_message(2001, data)
def delete(col, spec): colname = _make_c_string(col) return "%s%s%s%s" % (_ZERO, colname, _ZERO, BSON.from_dict(spec))
def get_more(col, limit, id): data = _ZERO data += _make_c_string(col) data += struct.pack('<iq', limit, id) return data