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.











