#!/usr/bin/env python
"""A demo of the Durus object database.

Updated 2007-09-12 by Mike Orr.  Public domain.
"""
import os
from durus.connection import Connection
from durus.file_storage import FileStorage
from durus.persistent import Persistent
from durus.persistent_dict import PersistentDict
from common import PFlintstone, ReportModel, Report

DB = "flintstones.durus"  # Relative to current working directory.

### Set up the database.

if os.path.exists(DB):
    os.remove(DB)

storage = FileStorage(DB)
connection = Connection(storage)
root = connection.get_root()

# Create the tables.
flintstones = root.setdefault("flintstones", PersistentDict())

### Add data.

def add_flintstone(name, sex, pastime):
    flintstones[name] = PFlintstone(name, sex, pastime)

add_flintstone("Fred", "M", "bowling")
add_flintstone("Barney", "M", "being a buddy")
add_flintstone("Bam-Bam", "M", "clubbing things")
add_flintstone("Dino", "M", "eating")
add_flintstone("Wilma", "F", "[Wilma's pastime]")
add_flintstone("Betty", "F", "[Bettty's pastime]")
add_flintstone("Pebbles", "F", "crawling")
connection.commit()

### Helper class for report

class Model(ReportModel):
    def exists(self, who):
        return who in flintstones

    def get_women_names(self):
        names = (x.name for x in flintstones.itervalues() if x.sex == "F")
        return sorted(names)

    def get_roster(self):
        return sorted(flintstones.itervalues())
        
    def get_bam_bam_pastime(self):
        return flintstones["Bam-Bam"].pastime

    def count_sex(self, sex):
        """Could use a fancy itertools recipe but this is more straightforward.
        """
        ret = 0
        for somebody in flintstones.itervalues():
            if somebody.sex == sex:
                ret += 1
        return ret
        
    def sex_change_fred(self):
        flintstones["Fred"].sex = "F"
        # Not committing.

    def sex_change_all_men(self):
        for somebody in flintstones.itervalues():
            somebody.sex = "F"
        # Not committing.

    def sex_change_undo(self):
        connection.abort()

### Main routine.

def main():
    model = Model()
    report = Report(model)
    report.main()

if __name__ == "__main__":  main()

