S2JDBC-GENでバージョン管理をしない with SVN

前回の

S2JDBC-Genでデータのバージョン管理をしないようにする

だとSVNに入れたときに不都合がでたので、少し修正です。

問題点

migrateフォルダの中を消していましたが、svnで管理すると.svnフォルダができますので、整合性があわなくなります。。。そこで少しだけ違う方法で.svnフォルダを消さなくて済むようにしてみました。

前提

├─db
│  │  ddl-info.txt
│  │  
│  └─migrate
│      └─0001
│          ├─create
│          └─drop

一回だけgen-ddlした状態から0000を削除した状態でsvnにコミットします。すでに何回かgen-ddlしてしまった場合にはdbフォルダ以下すべて消してから作り直してください。

(重要)このときにはまだデフォルトのs2jdbc-gen-build.xmlを使ってください!

準備

ddl-info.txtをコピーしてddl-info.txt_baseを作ります。

├─db
│  │  ddl-info.txt
│  │  ddl-info.txt_base
│  │  
│  └─migrate
│      └─0001
│          ├─create
│          └─drop

これはあとで利用するのですが、初期状態のddl-info.txtを保存しておきます。中身は1と書いてあるテキストファイルになります。

gen-ddlの流れ

  1. gen-ddl(0002フォルダにddlを作成する)
  2. 0002フォルダの中身を0001フォルダに上書きする
  3. 0002フォルダを削除する
  4. ddl-info.txtをddl-info.txt_baseで上書きする

これでいけます。0002を作成してからコピーして、バージョン番号を1に戻してあげます。基本的にはこれで差分があるファイルだけsvnでわかるので逆に便利かもしれません。。。

(重要)欠点として、テーブルごと削除した場合には消えませんので手で作業する必要はあります。

実際の処理

  <target name="gen-ddl">
    <gen-ddl ...(略)...
    />
    <gen-test ...(略)...
    />
    <gen-condition ...(略)...
    />
    <gen-names ...(略)...
    />
    <gen-service ...(略)...
    />
    <gen-comment ...(略)...
    />
    <gen-trigger ...(略)...
    />
    <delete dir="db/migrate/0000"/>
    <copy todir="db/migrate/0001">
      <fileset dir="db/migrate/0002"/>
    </copy>
    <delete dir="db/migrate/0002"/>
    <copy file="db/ddl-info.txt_base" tofile="db/ddl-info.txt" overwrite="true" />
  </target>

gen-serviceの後ろから追加しています。

  1. gen-comment:データベースからコメント文のSQLを作成する自作タスク
  2. gen-trigger:030-sequenceフォルダのSQLからトリガーを生成する自作タスク
  3. delete:必要ないけれど一応0000を削除
  4. copy:0002の内容を0001に上書きします
  5. delete:0002のフォルダを削除する
  6. copy:ddl-info.txtをddl-info.txt_baseで上書きする

migrate時

  <target name="migrate">
    <clean-database
      rootpackagename="${rootpackagename}"
      entitypackagename="${entitypackagename}"
      javafiledestdir="${javafiledestdir}"
      javafileencoding="${javafileencoding}"
      env="${env}"
      jdbcmanagername="${jdbcmanagername}"
      classpathref="classpath"
    />
    <migrate
      classpathdir="${classpathdir}"
      statementDelimiter="/"
      rootpackagename="${rootpackagename}"
      entitypackagename="${entitypackagename}"
      env="${env}"
      jdbcmanagername="${jdbcmanagername}"
      classpathref="classpath"
    />
    <exec-sql
      classpathref="classpath">
        <sqlFileList dir="db">
          <file name="dropschema.sql"/>
        </sqlFileList>
    </exe-sql>
  </target>

(重要)このままだとテーブルが削除されませんので、自分で全て削除する自作タスクを呼んで掃除してからmigrateする必要があります。

最後には「DROP TABLE SCHEMA_INFO」と書いたSQLを実行してSCHEMA_INFOテーブルを削除しています。この作業はなくても動きますが、邪魔な場合には削除してくださいね。

ここまでの作業を行うと、S2JDBCを利用していないプロジェクトでもS2JDBC-Genを利用してデータベースの構成管理がSVNでできるようになります!

感想

これでやっとS2JDBC-Genの検証完了かな〜。少し複数人数で運用をしてみてからまた感想などを書きたいと思います。年末ぐらいまではTeedaを触っているので、年明けぐらいからSAStrutsでも勉強しようかな。。。

でもEthnaも触りたいんだよね〜。Ecipseのプラグインを作ってDoltengみたいなツール作ってみたいけれど、そこまでやると時間足りないかな。。。