Spaces:
Running
Running
#!/usr/bin/python -OOOO | |
# vim: set fileencoding=utf8 shiftwidth=4 tabstop=4 textwidth=80 foldmethod=marker : | |
# Copyright (c) 2010, Kou Man Tong. All rights reserved. | |
# For licensing, see LICENSE file included in the package. | |
""" | |
BSON serialization and deserialization logic. | |
Specifications taken from: http://bsonspec.org/#/specification | |
The following types are unsupported, because for data exchange purposes, they're | |
over-engineered: | |
0x06 (Undefined) | |
0x0b (Regex - Exactly which flavor do you want? Better let higher level | |
programmers make that decision.) | |
0x0c (DBPointer) | |
0x0d (JavaScript code) | |
0x0e (Symbol) | |
0x0f (JS w/ scope) | |
0x11 (MongoDB-specific timestamp) | |
For binaries, only the default 0x0 type is supported. | |
""" | |
from .codec import * | |
from .objectid import ObjectId | |
__all__ = ["loads", "dumps"] | |
def dumps(obj, generator=None, on_unknown=None): | |
""" | |
Given a dict, outputs a BSON string. | |
generator is an optional function which accepts the dictionary/array being | |
encoded, the current DFS traversal stack, and outputs an iterator indicating | |
the correct encoding order for keys. | |
""" | |
if isinstance(obj, BSONCoding): | |
return encode_object(obj, [], | |
generator_func=generator, on_unknown=on_unknown) | |
return encode_document(obj, [], | |
generator_func=generator, on_unknown=on_unknown) | |
def loads(data): | |
""" | |
Given a BSON string, outputs a dict. | |
""" | |
return decode_document(data, 0)[1] | |
def patch_socket(): | |
""" | |
Patches the Python socket class such that sockets can send and receive BSON | |
objects atomically. | |
This adds the following functions to socket: | |
recvbytes(bytes_needed, sock_buf = None) - reads bytes_needed bytes | |
atomically. Returns None if socket closed. | |
recvobj() - reads a BSON document from the socket atomically and returns | |
the deserialized dictionary. Returns None if socket closed. | |
sendobj(obj) - sends a BSON document to the socket atomically. | |
""" | |
from socket import socket | |
from .network import recvbytes, recvobj, sendobj | |
socket.recvbytes = recvbytes | |
socket.recvobj = recvobj | |
socket.sendobj = sendobj | |