+ def insert(self, doc_or_docs):
+ if not self.database.db_name in self.database.connection.database_names():
+ self.database._create_database()
+ if not self.table_name in self.database.collection_names():
+ self._create_table()
+
+ if not type(doc_or_docs) in (list, tuple):
+ docs = [doc_or_docs]
+ else:
+ docs = doc_or_docs
+ for doc in docs:
+ if not '_id' in doc:
+ doc['_id'] = uuid.uuid4().hex
+ self._insert_document(doc)
+
+ if type(doc_or_docs) in (list, tuple):
+ return [d['_id'] for d in docs]
+ else:
+ return docs[0]['_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']})
+ for f in doc:
+ if f == '_id':
+ continue
+ if not f in fields:
+ self._create_field(f)
+ table_f = '%s$%s' % (self.table_name, f)
+ values = {
+ 'id': doc['_id'],
+ 'value': cPickle.dumps(doc[f]),
+ }
+ if type(doc[f]) in (int, float):
+ values['number'] = doc[f]
+ self.database.connection._insert(self.database.db_name, table_f, values)
+