Aug 262006
 

Data driven applications are a good concept to keep in mind when design an application, especially when that application needs to have new bits added to it on a regular basis. My idea for using Python to listen for FreshPorts events is a case in point.

I’ve decided to go with a table like this:

create table listen_for
(
    id           serial not null,
    name         text   not null,
    script_name  text   not null,
    primary key (id)
);

create unique index listen_for_name_idx on listen_for (name);

The table contents looks like this:

freshports.org=# select * from listen_for;
 id |      name      |      script_name
----+----------------+-----------------------
  1 | port_updated   | listen_port
  2 | ports_moved    | listen_ports_moved
  3 | ports_updating | listen_ports_updating
  4 | vuxml          | listen_vuxml
(4 rows)

freshports.org=#

The script from previous posts now looks like this:

#!/usr/bin/env python
#
# This program listens for events on the database and processes them
#

#
# configuration items
#
DSN = 'dbname=freshports.org user=dan'


import sys, psycopg, select

print "Opening connection using dns:", DSN
conn = psycopg.connect(DSN)
conn.autocommit(1)

curs = conn.cursor()

curs.execute("SELECT id, name, script_name FROM listen_for ORDER BY id");
listens_for = curs.fetchall()

for listen in listens_for:
  curs.execute("LISTEN %s" % listen[1])

print "Waiting for 'NOTIFY test'"
while 1:
  select.select([curs],[],[])==([],[],[])
  curs.execute("SELECT 1")
  notifies = curs.notifies()
  for n in notifies:
    # in real life, do something with each...
    print n[0]

This is pretty easy. I won’t have to alter this script much, if at all, when adding a new notification to the system. I may just have to HUP it or restart it.

Website Pin Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google StumbleUpon Premium Responsive