From bdcde818dc0b7979cbd9410d3a1757c5fbd1176f Mon Sep 17 00:00:00 2001 From: Tyler Hobbs Date: Fri, 28 Feb 2014 15:30:24 -0600 Subject: [PATCH] Move encoders from decoder.py to encoder.py --- cassandra/decoder.py | 96 ------------------------------------------- cassandra/encoder.py | 98 ++++++++++++++++++++++++++++++++++++++++++++ cassandra/query.py | 4 +- 3 files changed, 100 insertions(+), 98 deletions(-) create mode 100644 cassandra/encoder.py diff --git a/cassandra/decoder.py b/cassandra/decoder.py index 0c4072eb..48db204e 100644 --- a/cassandra/decoder.py +++ b/cassandra/decoder.py @@ -1,12 +1,6 @@ -from binascii import hexlify -import calendar -from collections import namedtuple -import datetime import logging import re import socket -import sys -import types from uuid import UUID try: @@ -752,93 +746,3 @@ def write_inet(f, addrtuple): write_byte(f, len(addrbytes)) f.write(addrbytes) write_int(f, port) - - -def cql_quote(term): - if isinstance(term, unicode): - return "'%s'" % term.encode('utf8').replace("'", "''") - elif isinstance(term, (str, bool)): - return "'%s'" % str(term).replace("'", "''") - else: - return str(term) - - -def cql_encode_none(val): - return 'NULL' - - -def cql_encode_unicode(val): - return cql_quote(val.encode('utf-8')) - - -def cql_encode_str(val): - return cql_quote(val) - - -if sys.version_info >= (2, 7): - def cql_encode_bytes(val): - return '0x' + hexlify(val) -else: - # python 2.6 requires string or read-only buffer for hexlify - def cql_encode_bytes(val): # noqa - return '0x' + hexlify(buffer(val)) - - -def cql_encode_object(val): - return str(val) - - -def cql_encode_datetime(val): - timestamp = calendar.timegm(val.utctimetuple()) - return str(long(timestamp * 1e3 + getattr(val, 'microsecond', 0) / 1e3)) - - -def cql_encode_date(val): - return "'%s'" % val.strftime('%Y-%m-%d-0000') - - -def cql_encode_sequence(val): - return '( %s )' % ' , '.join(cql_encoders.get(type(v), cql_encode_object)(v) - for v in val) - - -def cql_encode_map_collection(val): - return '{ %s }' % ' , '.join( - '%s : %s' % ( - cql_encode_all_types(k), - cql_encode_all_types(v)) - for k, v in val.iteritems()) - - -def cql_encode_list_collection(val): - return '[ %s ]' % ' , '.join(map(cql_encode_all_types, val)) - - -def cql_encode_set_collection(val): - return '{ %s }' % ' , '.join(map(cql_encode_all_types, val)) - - -def cql_encode_all_types(val): - return cql_encoders.get(type(val), cql_encode_object)(val) - - -cql_encoders = { - float: cql_encode_object, - buffer: cql_encode_bytes, - bytearray: cql_encode_bytes, - str: cql_encode_str, - unicode: cql_encode_unicode, - types.NoneType: cql_encode_none, - int: cql_encode_object, - long: cql_encode_object, - UUID: cql_encode_object, - datetime.datetime: cql_encode_datetime, - datetime.date: cql_encode_date, - dict: cql_encode_map_collection, - OrderedDict: cql_encode_map_collection, - list: cql_encode_list_collection, - tuple: cql_encode_list_collection, - set: cql_encode_set_collection, - frozenset: cql_encode_set_collection, - types.GeneratorType: cql_encode_list_collection -} diff --git a/cassandra/encoder.py b/cassandra/encoder.py new file mode 100644 index 00000000..ae1873a1 --- /dev/null +++ b/cassandra/encoder.py @@ -0,0 +1,98 @@ +from binascii import hexlify +import calendar +import datetime +import sys +import types +from uuid import UUID + +from cassandra.util import OrderedDict + + +def cql_quote(term): + if isinstance(term, unicode): + return "'%s'" % term.encode('utf8').replace("'", "''") + elif isinstance(term, (str, bool)): + return "'%s'" % str(term).replace("'", "''") + else: + return str(term) + + +def cql_encode_none(val): + return 'NULL' + + +def cql_encode_unicode(val): + return cql_quote(val.encode('utf-8')) + + +def cql_encode_str(val): + return cql_quote(val) + + +if sys.version_info >= (2, 7): + def cql_encode_bytes(val): + return '0x' + hexlify(val) +else: + # python 2.6 requires string or read-only buffer for hexlify + def cql_encode_bytes(val): # noqa + return '0x' + hexlify(buffer(val)) + + +def cql_encode_object(val): + return str(val) + + +def cql_encode_datetime(val): + timestamp = calendar.timegm(val.utctimetuple()) + return str(long(timestamp * 1e3 + getattr(val, 'microsecond', 0) / 1e3)) + + +def cql_encode_date(val): + return "'%s'" % val.strftime('%Y-%m-%d-0000') + + +def cql_encode_sequence(val): + return '( %s )' % ' , '.join(cql_encoders.get(type(v), cql_encode_object)(v) + for v in val) + + +def cql_encode_map_collection(val): + return '{ %s }' % ' , '.join( + '%s : %s' % ( + cql_encode_all_types(k), + cql_encode_all_types(v)) + for k, v in val.iteritems()) + + +def cql_encode_list_collection(val): + return '[ %s ]' % ' , '.join(map(cql_encode_all_types, val)) + + +def cql_encode_set_collection(val): + return '{ %s }' % ' , '.join(map(cql_encode_all_types, val)) + + +def cql_encode_all_types(val): + return cql_encoders.get(type(val), cql_encode_object)(val) + + +cql_encoders = { + float: cql_encode_object, + buffer: cql_encode_bytes, + bytearray: cql_encode_bytes, + str: cql_encode_str, + unicode: cql_encode_unicode, + types.NoneType: cql_encode_none, + int: cql_encode_object, + long: cql_encode_object, + UUID: cql_encode_object, + datetime.datetime: cql_encode_datetime, + datetime.date: cql_encode_date, + dict: cql_encode_map_collection, + OrderedDict: cql_encode_map_collection, + list: cql_encode_list_collection, + tuple: cql_encode_list_collection, + set: cql_encode_set_collection, + frozenset: cql_encode_set_collection, + types.GeneratorType: cql_encode_list_collection +} diff --git a/cassandra/query.py b/cassandra/query.py index 130c1437..a9be1fee 100644 --- a/cassandra/query.py +++ b/cassandra/query.py @@ -10,8 +10,8 @@ import time from cassandra import ConsistencyLevel, OperationTimedOut from cassandra.cqltypes import unix_time_from_uuid1 -from cassandra.decoder import (cql_encoders, cql_encode_object, - cql_encode_sequence, named_tuple_factory) +from cassandra.encoder import (cql_encoders, cql_encode_object, + cql_encode_sequence) import logging log = logging.getLogger(__name__)