#!/usr/bin/env ruby # coding: utf-8 require 'sqlite3' require 'kconv' require 'cgi' # HTMLヘッダの出力 (まで) cgi = CGI.new(:accept_charset => "utf-8") print <<_EOF_ Content-type: text/html; charset=utf-8 Yaoya

yaoya DB

_EOF_ db = SQLite3::Database.new("tmpdb/fruits.sq3") # CREATE TABLE kudamono(id integer primary key autoincrement, item, at, memo); # 値入力フォームの初期値用の変数 fruit = at = memo = update = "" # ./kudamono.rb -edit 1 のように呼ばれたら入力フォームに初期値を入れる # -edit オプションは一覧表示のところで出している(※1) if ARGV[0] == "-edit" && ARGV[1] != nil id = ARGV[1] # 更新するレコードのid r = db.execute("select * from kudamono where id=#{id}") fruit, at, memo = r[0][1..-1] # 第2カラム以降すべて memo = CGI::unescapeHTML(memo.gsub("
", "")) #
は取り除く update = "\n" end # (1)入力フォーム出力 if update > "" printf("

id=%dのレコード更新

\n", id) else puts("

新規レコード入力

") end print <<_EOF_
品目:
単価:
メモ:

#{update}
_EOF_ if update > "" # update(更新値入力)ならここで出力終わり puts("\n") exit(0) end # (2)検索フォームの出力 print <<_EOF_

検索

品目検索:
メモ検索:

_EOF_ # フォーム出力終わり # (1)と(2)のどちらの[OK]が押されたかはCGI変数 mode で判断する # 一覧表示の前に,前回のCGI入力があったら先に登録する name = cgi['fruit'] at = cgi['at'].to_i memo = cgi['memo'] mode = cgi['mode'] # この値が newなら登録, searchなら検索 update = cgi['update'] # この値が "" でなければ更新(update) id = cgi['id'] rm = cgi['rm'] # [削除]ボタンが押された場合に代入される # 品目が入力してあったなら実際にinsertにて登録 または updateで更新 if mode=="new" && name && (name=name.strip) > "" # これが呼ばれた時点で新規書き込みがあればinsert memo = CGI::escapeHTML(memo.chomp) # 記号をエスケープする memo.gsub!(/\r?\n/, "
\n") # 改行に
を足す if id && id > "" # id指定があるなら既存レコード更新 sql = "update kudamono set item=?, at=?, memo=? where id=#{id}" else # id指定がないなら新規レコード登録 sql = "insert into kudamono(item, at, memo) values (?, ?, ?)" end db.execute(sql, name.toutf8, at, memo.toutf8) # 新規書き込み登録/update ここまで elsif rm && rm > "" # 削除ボタンを押したとき cgi.keys.each do |k| # keysで変数一覧. rm_#{id} があるはず next unless /rm_(\d+)/ =~ k # CGI変数名が rm_X でなければスキップ n = $1 db.execute("delete from kudamono where id=#{n}") end end def mktable(heading, result) # select の結果を表形式で一覧表示するメソッド h = "ID品目単価メモ" n = -1 printf("

%s

\n", heading) puts('
') puts('') result.each do |row| puts(h) if (n+=1)%10 == 0 # 10行に1回見出し行を出す # row[0]とrow[1]の間に削除マークのcheckboxを挿入する id = row[0].to_i rmmk = "" row.insert(1, rmmk) # Arrayのinsertメソッドでずらし挿入できる # ↑で品目が row[2] にずれ込む。 # row[2]を修正リンクに変更する(※1) row[2] = "" + row[2] + "" # これで品目の部分が # りんご # のようになる。これは「./kudamono.rb -edit 1」と起動する。 # CGIプログラムへの引数は ? で区切り, # 引数間の区切りの空白は + に置き換えて表す。 printf("\n", row.join("
%s
")) end puts('
') puts('
') end # 検索キーワード指定時の処理 if mode=="search" kwd1 = cgi['kwd1']; kwd2 = cgi['kwd2'] if kwd1 > "" h = sprintf("

品名検索結果: キーワード:[%s]", kwd1) r = db.execute("select * from kudamono where item like '%#{kwd1}%'") mktable(h, r) end if kwd2 > "" h = sprintf("

メモ検索結果: キーワード:[%s]", kwd2) r = db.execute("select * from kudamono where memo like '%#{kwd2}%'") mktable(h, r) end else # (3)一覧表示(検索語指定がなかった場合) res = db.execute("select * from kudamono") mktable("レコード一覧", res) end print <<_EOF_ _EOF_