elif type(field) is dict:
return "(%s)" % self._get_sql_query(db_name, field)
else:
- return "'%s'" % str(field)
+ return "'%s'" % str(field).replace("'", "''")
def _get_sql_query(self, db_name, query):
sql = "SELECT "
for k, v in values.iteritems():
keys.append(k)
if type(v) in (str, unicode):
- vals.append("'%s'" % v)
+ vals.append("'%s'" % v.replace("'", "''"))
else:
vals.append(str(v))
sql = "INSERT INTO `%s`.`%s`(%s) VALUES (%s)" % (db_name, table_name, ",".join(keys), ",".join(vals))
def _create_table(self):
fields = [
- {'name': 'id', 'type': 'char', 'size': 32, 'primary': True},
+ {'name': 'id', 'type': 'char', 'size': 512, 'primary': True},
]
return self.database.connection._create_table(self.database.db_name, '%s$_id' % self.table_name, fields)
def _create_field(self, field_name):
fields = [
- {'name': 'id', 'type': 'char', 'size': 32, 'primary': True},
+ {'name': 'id', 'type': 'char', 'size': 512, 'primary': True},
{'name': 'value', 'type': 'text', 'null': False},
{'name': 'number', 'type': 'float'},
]
else:
docs = doc_or_docs
for doc in docs:
- if not '_id' in doc:
- doc['_id'] = uuid.uuid4().hex
+ if not u'_id' in doc:
+ doc[u'_id'] = uuid.uuid4().hex
self._insert_document(doc)
if type(doc_or_docs) in (list, tuple):
- return [d['_id'] for d in docs]
+ return [d[u'_id'] for d in docs]
else:
- return docs[0]['_id']
+ return docs[0][u'_id']
def _insert_document(self, doc):
table_id = '%s$_id' % self.table_name
fields = self._get_fields()
- self.database.connection._insert(self.database.db_name, table_id, {'id': doc['_id']})
+ coded_id = cPickle.dumps(doc['_id'])
+ self.database.connection._insert(self.database.db_name, table_id, {'id': coded_id})
for f in doc:
if f == '_id':
continue
self._create_field(f)
table_f = '%s$%s' % (self.table_name, f)
values = {
- 'id': doc['_id'],
+ 'id': coded_id,
'value': cPickle.dumps(doc[f]),
}
if type(doc[f]) in (int, float):
query['where'] = []
for k, v in self.spec.iteritems():
table_f = '%s$%s' % (self.collection.table_name, k)
- if type(v) in (int, float):
+ if k == u'_id':
+ query['where'].append(((table_id, 'id'), '=', cPickle.dumps(v)))
+ elif type(v) in (int, float):
field_q = self._get_cursor_field(table_id, table_f, field_name='number')
query['where'].append((field_q, '=', v))
else:
raise StopIteration
else:
document = {}
- if '_id' in self.fields:
- document['_id'] = res[0]
- fields_without_id = filter(lambda x: x != '_id', self.fields)
+ if u'_id' in self.fields:
+ document[u'_id'] = cPickle.loads(res[0])
+ fields_without_id = filter(lambda x: x != u'_id', self.fields)
for i in xrange(len(fields_without_id)):
if not res[i + 1] is None:
document[fields_without_id[i]] = cPickle.loads(res[i + 1])