夏休み明けです。
脳みそは旅行先に置いてきちまった感じの儒艮です。取りに行くつもりは当分のところありません(笑)

さてさて夏休みはさておき。何なんですかあのnullとかいうやつ。

データベースでnullになってるところ、HTMLでテーブル表示させると
何か変な表示になりますonly IE!

仕方がないから値がnullのとこは改行(\n)や半角スペースに変換して
表示させようと思ったらどっちも失敗。なぜか全角スペース
にしたらオッケー。意味わからんわ(これはどっちかというとブラウザやHTMLの問題かもしれないけど)!

しかしこれで安心かと思いきや…

まずいのさ。

更新は検索結果から、更新したい書籍データの横にある更新ボタンから。
更新フォームにジャンプして、入力フォームにはあらかじめ元のデータが
入力されてるようになっているわけですが。
nullは検索結果画面で全角スペースに変換されてるから、更新フォームには
何も入力されてないように見えて該当するフォームにはバッチリ全角スペースが入力されてるわけです。

何も知らないユーザーがこのまま更新続行したら、該当するレコードが全角スペースという文字に変更されちまいます。

まあ、それでも問題ないっちゃないんですが、ユーザーとしてはそこは特に書くことないからって空白=nullにしといたつもりが、
データベースとしてはnullじゃなくて全角スペースという文字として扱っている…というのは気持ち悪い。
ので、更新フォームの入力値も変換。
入力値がなかったり全角スペースだったら、nullにしてねっと…結局戻してるじゃんorz
面倒!!

ていうか…
データベースの方でデフォルト値決めちゃったりしたほうが早かったか?これ。

削除フラグというのは、DBでdelete処理されたレコードをきれいさっぱり消さずに、「消しました」というマークをつけておくときのそのマークのこと。

とはいっても、テーブルにboolean型の列を付け足して、デフォルトにfalse、delete処理されたものはtrueにupdateするようにします。消しません。

検索の際はwhere句でtrueの行は表示しないようにすれば、あたかも消えたように見える。


これって…消す(物理的削除)のではなく、シ カ ト(論理削除)か!!!


面倒に見えますが、間違って消したときにも復旧が楽(体感済)。


さて、その方法ですが…

PostgreSQLのcreate ruleコマンドを使用するんだとか。


create rule ルールの名前 as on delete to テーブル名

do instead

update テーブル名 set 削除フラグ列 = true where 列名 = old.列名;


これでOK。

このテーブルについてはdelete処理した時は削除フラグ列をupdate処理してくれよ~

というルールを作ってやっているようです。

ためしにdeleteを実行したら、行は消されず削除フラグ列の値がtrueになるだけ。

す、すげ~!

やっぱ復活させたいなら、update文でfalseにすればいいわけ。


もっとJavaのほうで面倒なコード書くのかとか考えてたのですが、psqlで以上の

処理を行えば終了。意外と簡単でよかった…

Javaのほうのselect文は少し書きかえるようだけど。


ペタしてね

昨日うまく変数が渡せていなかったのは、" できちんと囲ってなかったせいでした。ちゃんちゃん。

ちなみにサーブレットをCSVに返信させる魔法のコードはこれ。

response.setContentType("application/octet-stream;charset=Shift_JIS");

response.setHeader("Content-Dispsition","attachment;filename=hoge.csv");

なあんにも考えず、この2行をサーブレットの頭に付けたらできます。いやっほい♪

しかし問題発生。サーバー経由でクライアントからダウンロードしようとしたら、エラー。

「Internet Explorerではドメイン名-ファイル名をダウンロードできません。このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直して下さい。」

…後でやり直しても自分でコード何とかしないとダウンロードできないわけで。

スタンドアロンだと問題なくダウンロード出来たから、どうやらサーバーとクライアント間の通信に原因がありそう。

そう、このシステム、SSL通信使ってるんだ…!

こんなときは、さっきのコードの下に以下の2行を追加。

response.setHeader("Pragma","public");
response.setHeader("Catch-Control","public");

これで無事クライアントからもダウンロードできました。

最近問題がサクサク解決していくので、愉快。