#!/usr/bin/head -5
# -*- mode: shell-script -*-
# CGI Library for Shell Script
# Use this by source'ing.
# . ./cgilib-sh

PATH=/usr/local/sqlite3/bin:$PATH
_db=db/cgi.sq3
query() {
  sqlite3 -cmd '.timeout 3000' -cmd 'PRAGMA foreign_keys=on' $_db "$@"
}
_tag=`date +%s`.$$		# CGIパラメータのタグをEPOCH秒とPID値から生成
_exp='+1 hours'			# 1時間後
pdecode() {
  tr '%+' '= '| nkf -Ww -mQ
}
storeparam() {
  oifs="$IFS"			# シェルの単語区切り文字を保存
  IFS='&'
  { cat<<-EOF
	BEGIN;
	CREATE TABLE IF NOT EXISTS tags(id text PRIMARY KEY, expire TEXT);
	CREATE TABLE IF NOT EXISTS cgipars(
	  tag, name text, val text,
	  FOREIGN KEY(tag) REFERENCES tags(id) ON DELETE CASCADE
	);
	INSERT INTO tags
	  VALUES('$_tag', datetime('now', '$_exp', 'localtime'));
	DELETE FROM tags WHERE expire < datetime('now', 'localtime');
	EOF
    for unit in $1; do		# & で文字列を分割して unit に代入して繰り返す
      n=${unit%%=*}		# 入力名=値 の「入力名」を取り出す
      v=${unit#*=}		# 入力名=値 の「値」を取り出す
      # SQLでは文字列中のシングルクォート(')は2つ重ねてエスケープ(sed部分)
      n=`echo "$n" | pdecode | sed -e "s/'/''/g"`
      v=`echo "$v" | pdecode | sed -e "s/'/''/g"`
      cat<<-EOF
	REPLACE INTO cgipars VALUES('$_tag', '$n', '$v');
	EOF
    done
    echo "COMMIT;"
  } | query
  IFS="$oifs"			# IFS変数を元に戻す
}
getpar() {			# 指定したパラメータの値を改行区切りで返す
  query<<-EOF
	SELECT val FROM cgipars WHERE name = '$1' AND tag='$_tag';
	EOF
}
contenttype() {
  echo "Content-type: ${1:-text/html; charset=utf-8}"
  contenttype() {}		# 一度出力したら不要になる
}
htmlhead() {			# Content-type から HTML body要素開始まで
  contenttype; echo
  cat<<-EOF			# $1=タイトル
	<!DOCTYPE html>
	<html lang="ja"><head><title>$1</title></head>
	<body>
	<h1>$1</h1>
	EOF
}

case "$REQUEST_METHOD" in
  get|GET)			# GETの場合は環境変数から取得
    par="$QUERY_STRING" ;;
  post|POST)			# POSTなら $CONTENT_LENGTH だけ標準入力を読む
    par=`head -c $CONTENT_LENGTH` ;;
esac

storeparam "$par"		# 受け取ったパラメータをDBに格納
