From 70d866018d3fc56e960d0f7746a5a6d33f8aadd8 Mon Sep 17 00:00:00 2001 From: drewlll2ll Date: Wed, 22 Jan 2014 11:08:16 -0500 Subject: [PATCH 1/3] Fixed incompatibilities w/ cassandra 2.0 --- cqlengine/columns.py | 14 ++++++++++++-- cqlengine/statements.py | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/cqlengine/columns.py b/cqlengine/columns.py index 11a9f60d..2ee93ecd 100644 --- a/cqlengine/columns.py +++ b/cqlengine/columns.py @@ -5,6 +5,7 @@ from datetime import date import re from uuid import uuid1, uuid4 from cql.query import cql_quote +from cql.cqltypes import DateType from cqlengine.exceptions import ValidationError @@ -209,7 +210,11 @@ class Bytes(Column): def to_database(self, value): val = super(Bytes, self).to_database(value) if val is None: return - return val.encode('hex') + return '0x' + val.encode('hex') + + def to_python(self, value): + #return value[2:].decode('hex') + return value class Ascii(Column): @@ -326,7 +331,10 @@ class DateTime(Column): return value elif isinstance(value, date): return datetime(*(value.timetuple()[:6])) - return datetime.utcfromtimestamp(value) + try: + return datetime.utcfromtimestamp(value) + except TypeError: + return datetime.utcfromtimestamp(DateType.deserialize(value)) def to_database(self, value): value = super(DateTime, self).to_database(value) @@ -352,6 +360,8 @@ class Date(Column): return value.date() elif isinstance(value, date): return value + else: + value = DateType.deserialize(value) return datetime.utcfromtimestamp(value).date() diff --git a/cqlengine/statements.py b/cqlengine/statements.py index 45f3fabe..014939ba 100644 --- a/cqlengine/statements.py +++ b/cqlengine/statements.py @@ -5,6 +5,25 @@ from cqlengine.operators import BaseWhereOperator, InOperator class StatementException(Exception): pass +# Monkey patch cql_quote to allow raw hex values +import cql.query + + +def cql_quote_replacement(term): + if isinstance(term, basestring) and term.startswith('0x'): + if isinstance(term, unicode): + return term.encode('utf8') + else: + return term + elif isinstance(term, unicode): + return "'%s'" % cql.query.__escape_quotes(term.encode('utf8')) + elif isinstance(term, (str, bool)): + return "'%s'" % cql.query.__escape_quotes(str(term)) + else: + return str(term) +cql.query.cql_quote = cql_quote_replacement + + class ValueQuoter(object): def __init__(self, value): From c533ae61996447fdc035c9a9561a3a26e546a3ed Mon Sep 17 00:00:00 2001 From: drewlll2ll Date: Wed, 22 Jan 2014 11:32:59 -0500 Subject: [PATCH 2/3] Fixed Date column --- cqlengine/columns.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cqlengine/columns.py b/cqlengine/columns.py index 2ee93ecd..7365d2b2 100644 --- a/cqlengine/columns.py +++ b/cqlengine/columns.py @@ -353,17 +353,16 @@ class DateTime(Column): class Date(Column): db_type = 'timestamp' - def to_python(self, value): if value is None: return if isinstance(value, datetime): return value.date() elif isinstance(value, date): return value - else: - value = DateType.deserialize(value) - - return datetime.utcfromtimestamp(value).date() + try: + return datetime.utcfromtimestamp(value).date() + except TypeError: + return datetime.utcfromtimestamp(DateType.deserialize(value)).date() def to_database(self, value): value = super(Date, self).to_database(value) From a2a532aa5aac0c6156d14eed64afedfec082d1aa Mon Sep 17 00:00:00 2001 From: drewlll2ll Date: Wed, 22 Jan 2014 12:11:03 -0500 Subject: [PATCH 3/3] Updated get_fields to be 2.0 compatible --- cqlengine/management.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cqlengine/management.py b/cqlengine/management.py index 6d41489e..0eb3bdf3 100644 --- a/cqlengine/management.py +++ b/cqlengine/management.py @@ -228,13 +228,19 @@ def get_fields(model): col_family = model.column_family_name(include_keyspace=False) with connection_manager() as con: - query = "SELECT column_name, validator FROM system.schema_columns \ + query = "SELECT * FROM system.schema_columns \ WHERE keyspace_name = :ks_name AND columnfamily_name = :col_family" logger.debug("get_fields %s %s", ks_name, col_family) tmp = con.execute(query, {'ks_name': ks_name, 'col_family': col_family}, ONE) - return [Field(x[0], x[1]) for x in tmp.results] + + column_indices = [tmp.columns.index('column_name'), tmp.columns.index('validator')] + try: + type_index = tmp.columns.index('type') + return [Field(x[column_indices[0]], x[column_indices[1]]) for x in tmp.results if x[type_index] == 'regular'] + except ValueError: + return [Field(x[column_indices[0]], x[column_indices[1]]) for x in tmp.results] # convert to Field named tuples