有馬総一郎のブログ

(彼氏の事情)

2013年04月02日 01:40:00 JST - 3 minute read - Subsonic

CUSTOM_AVATARの画像データをエクスポートして、新しいDBにインポートする

で、おとなしく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だけ差し替えれば、いけるでしょ。次回、あたりちゃんとまとめよう。