Move encoders from decoder.py to encoder.py

This commit is contained in:
Tyler Hobbs
2014-02-28 15:30:24 -06:00
parent fde2fcc3b3
commit bdcde818dc
3 changed files with 100 additions and 98 deletions

View File

@@ -1,12 +1,6 @@
from binascii import hexlify
import calendar
from collections import namedtuple
import datetime
import logging import logging
import re import re
import socket import socket
import sys
import types
from uuid import UUID from uuid import UUID
try: try:
@@ -752,93 +746,3 @@ def write_inet(f, addrtuple):
write_byte(f, len(addrbytes)) write_byte(f, len(addrbytes))
f.write(addrbytes) f.write(addrbytes)
write_int(f, port) 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
}

98
cassandra/encoder.py Normal file
View File

@@ -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
}

View File

@@ -10,8 +10,8 @@ import time
from cassandra import ConsistencyLevel, OperationTimedOut from cassandra import ConsistencyLevel, OperationTimedOut
from cassandra.cqltypes import unix_time_from_uuid1 from cassandra.cqltypes import unix_time_from_uuid1
from cassandra.decoder import (cql_encoders, cql_encode_object, from cassandra.encoder import (cql_encoders, cql_encode_object,
cql_encode_sequence, named_tuple_factory) cql_encode_sequence)
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)