Merge pull request #153 from figpope/cass2.0-fix
Added Cassandra 2.0 Compatability
This commit is contained in:
@@ -5,6 +5,7 @@ from datetime import date
|
|||||||
import re
|
import re
|
||||||
from uuid import uuid1, uuid4
|
from uuid import uuid1, uuid4
|
||||||
from cql.query import cql_quote
|
from cql.query import cql_quote
|
||||||
|
from cql.cqltypes import DateType
|
||||||
|
|
||||||
from cqlengine.exceptions import ValidationError
|
from cqlengine.exceptions import ValidationError
|
||||||
|
|
||||||
@@ -209,7 +210,11 @@ class Bytes(Column):
|
|||||||
def to_database(self, value):
|
def to_database(self, value):
|
||||||
val = super(Bytes, self).to_database(value)
|
val = super(Bytes, self).to_database(value)
|
||||||
if val is None: return
|
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):
|
class Ascii(Column):
|
||||||
@@ -326,7 +331,10 @@ class DateTime(Column):
|
|||||||
return value
|
return value
|
||||||
elif isinstance(value, date):
|
elif isinstance(value, date):
|
||||||
return datetime(*(value.timetuple()[:6]))
|
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):
|
def to_database(self, value):
|
||||||
value = super(DateTime, self).to_database(value)
|
value = super(DateTime, self).to_database(value)
|
||||||
@@ -345,15 +353,16 @@ class DateTime(Column):
|
|||||||
class Date(Column):
|
class Date(Column):
|
||||||
db_type = 'timestamp'
|
db_type = 'timestamp'
|
||||||
|
|
||||||
|
|
||||||
def to_python(self, value):
|
def to_python(self, value):
|
||||||
if value is None: return
|
if value is None: return
|
||||||
if isinstance(value, datetime):
|
if isinstance(value, datetime):
|
||||||
return value.date()
|
return value.date()
|
||||||
elif isinstance(value, date):
|
elif isinstance(value, date):
|
||||||
return value
|
return value
|
||||||
|
try:
|
||||||
return datetime.utcfromtimestamp(value).date()
|
return datetime.utcfromtimestamp(value).date()
|
||||||
|
except TypeError:
|
||||||
|
return datetime.utcfromtimestamp(DateType.deserialize(value)).date()
|
||||||
|
|
||||||
def to_database(self, value):
|
def to_database(self, value):
|
||||||
value = super(Date, self).to_database(value)
|
value = super(Date, self).to_database(value)
|
||||||
|
|||||||
@@ -231,13 +231,19 @@ def get_fields(model):
|
|||||||
col_family = model.column_family_name(include_keyspace=False)
|
col_family = model.column_family_name(include_keyspace=False)
|
||||||
|
|
||||||
with connection_manager() as con:
|
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"
|
WHERE keyspace_name = :ks_name AND columnfamily_name = :col_family"
|
||||||
|
|
||||||
logger.debug("get_fields %s %s", ks_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)
|
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
|
# convert to Field named tuples
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,25 @@ from cqlengine.operators import BaseWhereOperator, InOperator
|
|||||||
class StatementException(Exception): pass
|
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):
|
class ValueQuoter(object):
|
||||||
|
|
||||||
def __init__(self, value):
|
def __init__(self, value):
|
||||||
|
|||||||
Reference in New Issue
Block a user