reg.cgi

Cirrusのサンプルサーバ

先にSQLiteでテーブルを作っておく必要あり

CREATE TABLE registrations (

m_username VARCHAR COLLATE NOCASE,

m_identity VARCHAR,

m_updatetime DATETIME,

PRIMARY KEY (m_username)

);

CREATE INDEX registrations_updatetime ON registrations (m_updatetime ASC);

reg.cgi

dbFile = './registrations.db'

import cgi

import sqlite3

import xml.sax.saxutils

query = cgi.parse()

db = sqlite3.connect(dbFile)

### /reg.cgi?username=<自分の名前>&friends=<相手の名前(複数可)>&identity=<Cirrusで発行された長いID>

user = query.get('username', [None])[0]

identity = query.get('identity', [None])[0]

friends = query.get('friends', [])

print 'Content-type: text/plain\n\n<?xml version="1.0" encoding="utf-8"?>\n<result>'

### 自分の名前とIDをDBに追加or更新

if user:

try:

c = db.cursor()

c.execute("insert or replace into registrations values (?, ?, datetime('now'))", (user, identity))

print '\t<update>true</update>'

except:

print '\t<update>false</update>'

### 相手が1時間以内にDBにいたら、そのIDと名前を返す

### 相手のIDは複数の可能性がある(複数の場所でログインしている場合)

for f in friends:

print "\t<friend>\n\t\t<user>%s</user>" % (xml.sax.saxutils.escape(f), )

c = db.cursor()

c.execute("select m_username, m_identity from registrations where m_username = ? and m_updatetime > datetime('now', '-1 hour')", (f, ))

for result in c.fetchall():

eachIdent = result[1]

if not eachIdent:

eachIdent = ""

print "\t\t<identity>%s</identity>" % (xml.sax.saxutils.escape(eachIdent), )

if f != result[0]:

print "\t\t<registered>%s</registered>" % (xml.sax.saxutils.escape(result[0]), )

print "\t</friend>"

db.commit()

print "</result>"

こんなXMLを返す

<result>

<update>true</update>

<friend>

<user>探している相手の名前</user>

<identity>登録済みの相手のID</identity>

<registered>登録された相手の名前</registered>

<identity>登録済みの相手のID</identity>

<registered>登録された相手の名前</registered>

</friend>

<friend>

上と同様

</friend>

</result>