で、おとなしくSqlToolを使って、バイナリーデータ(カスタムアバターの画像データ)をアップグレードにも、持ってくる。
http://www.hsqldb.org/doc/guide/ch08.html
にあれこれ、英語で書いてあるんだけど、いや~苦労したわ。初めは日本語サイトないかあれこれ探したが、結局、ここを頑張って読むのが一番の近道だった・・・
version 4.6のdbファイルをサーバーモードで起動して、SqlToolでログイン。
sql> \d CUSTOM_AVATAR
name datatype width no-nulls
------------ --------- ---------- --------
ID INTEGER 11 *
NAME VARCHAR 32766
CREATED_DATE TIMESTAMP 6 *
MIME_TYPE VARCHAR 32766 *
WIDTH INTEGER 11 *
HEIGHT INTEGER 11 *
DATA BINARY 2147483647 *
USERNAME VARCHAR 32766 *
sql> select ID,NAME,USERNAME from CUSTOM_AVATAR;
ID NAME USERNAME
-- ------------------------------------ --------
1 6fc5b0bd97e5759d431d2f4dee4471b8.jpg user1
2 twitter.jpg user2
3 自画像.JPG admin
4 約束された勝利の剣.jpg user3
4 rows
まずは、Exampleどおりに実行。
sql> select DATA from CUSTOM_AVATAR where ID = 1;
sql> f8d737 ~省略~ 3e9e9347ffd9
sql> \bd /tmp/6fc5b0bd97e5759d431d2f4dee4471b8.jpg
Error at 'stdin' line 9:
"\bd 6fc5b0bd97e5759d431d2f4dee4471b8.jpg"
Failed to load/dump binary data to file '6fc5b0bd97e5759d431d2f4dee4471b8.jpg'
ふがっ!できない。なんでだよ~と。\?
のヘルプ画面を見て、再チャレンジ。
sql> \b
sql> select DATA from CUSTOM_AVATAR where ID = 1;
Read 1705 bytes from field 'DATA' (type BINARY) into binary buffer
sql> \bd 6fc5b0bd97e5759d431d2f4dee4471b8.jpg
Saved 1705 bytes to '6fc5b0bd97e5759d431d2f4dee4471b8.jpg'
sql>
このやろう!\b
が必要なら、必要って例にも書いておいけよ!
みると、homeディレクトリにdumpファイルができていました。多分sqltoolを実行したディレクトリが基準なんでしょうね。で、日本語でファイル名指定すると、文字化けして出力されてしまった。文字コードなんだろ?めんどいのでここはおとなしく、ASCII文字に名前変更。
これをアップグレードしたDBにINSERTします。Subsonicを停止して、アップグレードしたversion 4.7のdbファイルをサーバーモードで起動して、SqlToolでログイン。で、よっこいしょ。
sql> \bl admin.jpg
Loaded 1573 bytes into Binary buffer
sql> insert into CUSTOM_AVATAR (ID, NAME, CREATED_DATE, MIME_TYPE, WIDTH, HEIGHT, DATA, USERNAME) values ('1', 'admin.jpg', '2012-10-09 18:36:31.009', 'image/jpeg', '48', '64', ?, 'admin');
SQL Error at 'stdin' line 5:
"insert into CUSTOM_AVATAR (ID, NAME, CREATED_DATE, MIME_TYPE, WIDTH, HEIGHT, DATA, USERNAME) values ('1', 'admin.jpg', '2012-10-09 18:36:31.009', 'image/jpeg', '48', '64', ?, 'admin')"
Assert failed: S0000 Direct execute with param count > 0java.lang.Exception
at org.hsqldb.Trace.getStackTrace(Unknown Source)
at org.hsqldb.Trace.doAssert(Unknown Source)
at org.hsqldb.DatabaseCommandInterpreter.executePart(Unknown Source)
at org.hsqldb.DatabaseCommandInterpreter.execute(Unknown Source)
at org.hsqldb.Session.sqlExecuteDirectNoPreChecks(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
at org.hsqldb.ServerConnection.run(Unknown Source)
at java.lang.Thread.run(Thread.java:679)
in statement [insert into CUSTOM_AVATAR (ID, NAME, CREATED_DATE, MIME_TYPE, WIDTH, HEIGHT, DATA, USERNAME) values ('1', 'admin.jpg', '2012-10-09 18:36:31.009', 'image/jpeg', '48', '64', ?, 'admin')]
( ゚д゚)あ?!ってすいません。今度は自分が悪かった。\bp
がいる。\bp
入力して、Enterね。そして、insert文。
sql> \bl admin.jpg
Loaded 1573 bytes into Binary buffer
sql> \bp
sql> insert into CUSTOM_AVATAR values ('1', 'admin.jpg', '2012-10-09 18:36:31.009', 'image/jpeg', '48', '64', ?, 'admin');
1 row updated
sql>
sql> commit;
上手く言ったε-(´∀`*)ホッ。\q
で終了。shutdownコマンドはいらない。で、Subsonicを起動して、確認。
無事、表示された。ほー。BINARY型のデータ持ってるのは、あとはSYSTEM_AVATARぐらい。これはデフォルトで入ってるデータなので移行の必要なし。他のテーブルは、subsonic.scriptのDMLだけ差し替えれば、いけるでしょ。次回、あたりちゃんとまとめよう。