Source code for store
# -*- coding: utf-8 -*-
#
# Cormoran is a fast and lightweight persistence framework.
# Copyright (C) 2012 Jaime Gil de Sagredo Luna <jaimegildesagredo@gmail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from cormoran.persistent import Persistent
from cormoran.fields import IntegerField
from cormoran.resultset import ResultSet
[docs]class Store(object):
"""The :class:`Store` class."""
def __init__(self, persistence):
self.persistence = persistence
self.new = list()
self.dirty = list()
self.deleted = list()
[docs] def add(self, persistent):
"""Adds the :class:`persistent.Persistent` subclass object to
this :class:`Store`.
"""
if not isinstance(persistent, Persistent):
raise TypeError()
if persistent.__cormoran_persisted__:
if persistent not in self.dirty:
self.dirty.append(persistent)
else:
if persistent not in self.new:
self.new.append(persistent)
def delete(self, persistent):
if not isinstance(persistent, Persistent):
raise TypeError()
if persistent in self.new:
self.new.remove(persistent)
elif persistent not in self.deleted:
self.deleted.append(persistent)
def find(self, persistent_cls):
if not issubclass(persistent_cls, Persistent):
raise TypeError()
self.flush()
return ResultSet(self.persistence, persistent_cls)
def flush(self):
self.persistence.begin_transaction()
for persistent in self.new:
_id = self.persistence.insert(persistent)
for name, field in persistent.__cormoran_pk__.iteritems():
if isinstance(field, IntegerField):
setattr(persistent, name, getattr(persistent, name) or _id)
persistent.__cormoran_persisted__ = True
for persistent in self.dirty:
self.persistence.update(persistent)
for persistent in self.deleted:
self.persistence.delete(persistent)
def commit(self):
self.flush()
self.persistence.commit_transaction()
self.new = list()
self.dirty = list()
self.deleted = list()