pvl/verkko/db.py
author Tero Marttila <terom@paivola.fi>
Thu, 18 Oct 2012 23:06:23 +0300
changeset 16 51509b5ce1c0
parent 14 02c21749cb4f
child 17 29f0cf9220e0
permissions -rw-r--r--
request per session, move to postgres, rename columns, fixup state/name/error handling in updates
import sqlalchemy
from sqlalchemy import *

import logging; log = logging.getLogger('pvl.verkko.db')

# schema
metadata = MetaData()

# TODO: count, completely separate dhcp_events?
dhcp_hosts = Table('dhcp_hosts', metadata,
    Column('id',         Integer,    primary_key=True),

    # unique
    Column('ip',            String,     nullable=False),
    Column('mac',           String,     nullable=False),
    Column('gw',            String,     nullable=False),
    
    # updated
    Column('first_seen',    DateTime,   nullable=False),
    Column('last_seen',     DateTime,   nullable=False),
    
    # scalar; updated
    Column('name',          String,     nullable=True),
    Column('state',         String,     nullable=True),
    Column('error',         String,     nullable=True),
    
    # counters
    Column('count',         Integer,    default=1),

    UniqueConstraint('ip', 'mac', 'gw'),
)

# for ORM models
from sqlalchemy.orm import mapper, sessionmaker

Session = sessionmaker()

class Database (object) :
    """
        Our underlying database.
    """
    
    # XXX: alias Tables in?
    dhcp_hosts = dhcp_hosts

    def __init__ (self, database) :
        """
            database        - sqlalchemy connection URI
        """

        self.engine = create_engine(database, 
            echo    = (log.isEnabledFor(logging.DEBUG)),
        )

    # ORM
    def session (self) :
        return Session(bind=self.engine)
   
    # SQL
    def select (self, query) :
        return self.engine.execute(query)

    def get (self, query) :
        """
            Fetch a single row.
            
            XXX: returning None if not found
        """

        return self.select(query).fetchone()