Top > MyPage
 

Torqueに挑戦

Torqueに挑戦

Torqueのインストール

インストールといっても、ただダウンロードして、解凍するだけ。この3.1からは2種類のファイルになったので、どちらもダウンロードして解凍する。

genとついている方が、javaファイルなどを生成するためのもの。ついていない方が、先のjavaファイルなどが動くためのjarファイル群。

  • torque-3.1.tar.gz
  • torque-gen-3.1.tar.gz

Torqueのダウンロード

とりあえずTest

build.properties

まずはgenファイルを解凍したディレクトリでbuild.propertiesを編集。以下にコメントをのぞいたものを引用する。

torque.project = excel

torque.database = postgresql

torque.targetPackage = com.chikkun.webcomponent.torque

torque.addGetByNameMethod = true
torque.addIntakeRetrievable = false
torque.addSaveMethod = true
torque.addTimeStamp = true
torque.basePrefix = Base
torque.complexObjectModel = true
torque.useClasspath = false
torque.useManagers = false

torque.database.createUrl = jdbc:postgresql://127.0.0.1:5432/template1
torque.database.buildUrl = jdbc:postgresql://127.0.0.1:5432/excel
torque.database.url = jdbc:postgresql://127.0.0.1:5432/excel
torque.database.driver = org.postgresql.Driver
torque.database.user = postgres
torque.database.password =
torque.database.host = 127.0.0.1

torque.sameJavaName = false
#torque.java.dir = ./src
#torque.compile.src.dir =  ./src

schema.xml

次にデータベースの定義をexcel-table-schema.xml(最後がschema.xmlとなっていればOKらしい)に書き込む(ディレクトリはschema、もともとid-table-schema.xmlがサンプルでついてきている)。今回は実験なので、以下のような簡単なものを作成した。なかなかfile_idをserialにできなくて苦労した。idMethod="native"あたりがミソだったんだと思う。

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE database SYSTEM \
    "http://db.apache.org/torque/dtd/database_3_1.dtd">
<database name="excel">
  <table name="EXCEL_TABLE" idMethod="native">
<column name="FILE_ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="FILE_NAME" required="true" size="255" type="VARCHAR"/>
    <column name="BINARY_FILE" type="BINARY" required="true"/>
  </table>
</database>

また、上記のtype="BINARY"を"Binary"としていて、エラーが起こり、これを突き止めるのに数時間かかってしまった(やれやれ)。

Ant

これで、javaファイルやdatabaseを作成する準備完了。

ant -f build-torque.xml

でjavaのファイルが作成され、

ant -f build-torque.xml create-db

でデータベースが作成され(当然postgreSQLが動いてなきゃダメ)

ant -f build-torque.xml insert-sql

でテーブルが作成される。ちなみに作成されたSQL文は以下のよう。

-----------------------------------------------------------------------------
-- EXCEL_TABLE
-----------------------------------------------------------------------------
DROP TABLE EXCEL_TABLE;
DROP SEQUENCE EXCEL_TABLE_SEQ;

CREATE SEQUENCE EXCEL_TABLE_SEQ;

CREATE TABLE EXCEL_TABLE
(
FILE_ID integer DEFAULT nextval('EXCEL_TABLE_SEQ') NOT NULL,
                                    FILE_NAME varchar (255) NOT NULL,
                                    BINARY_FILE bytea NOT NULL,
    PRIMARY KEY (FILE_ID)
);
----------------------------------------------------------------------
-- EXCEL_TABLE                                                      
----------------------------------------------------------------------

また出来たjavaファイルをコンパイルするには以下のコマンド。

ant -f build-torque.xml compile

で一番最初に作ったjavaファイルがコンパイルされるはずだったのだけれど、当たり前と言えばそうなんだが、先ほどのgenじゃない方のtorqueの解凍場所にあるlibにあるjarファイルが必要らしく、それらをgenの方のlibにコピーしたら(他の方法が良かったのかも)、やっとこさでコンパイルできた。

postgresへのTorqueを使わないで登録および書き出し実験

Javaのmainメソッドで登録(test.xls)

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

/**
 * 単にそのままエクセルデータをデータベースに登録
 * @author chikkun
 * @version 0.1
 * TestTorque1.java
 *
 */
public class TestTorque1 {
    public static void main(String[] args) {
        File file = new File("test.xls");
        try {
            FileInputStream fis = new FileInputStream(file);
            //データベースへのコネクション
            Connection conn = null;
            Class.forName("org.postgresql.Driver");
            conn =
                DriverManager.getConnection(
                    "jdbc:postgresql:excel",
                    "postgres",
                    "");
            PreparedStatement ps =
                conn.prepareStatement(
"INSERT INTO EXCEL_TABLE (FILE_NAME,BINARY_FILE) VALUES (?, ?)");
            ps.setString(1, file.getName());
            Long tmp = new Long(file.length());
            ps.setBinaryStream(2, fis, tmp.intValue());
            ps.executeUpdate();
            ps.close();
            fis.close();
        } catch (FileNotFoundException e) {
            System.out.println("File error!!\n");
        } catch (Exception e) {
            System.out.println("error!!\n");
            e.printStackTrace();
        }
    }
}

とりあえず、登録できた。

登録したtest.xlsをtmp.xlsとして保存

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * 単にデータベースの中のファイルを保存
 * @author chikkun
 * @version 0.1
 * TestTorque2.java
 *
 */
public class TestTorque2 {
    public static void main(String[] args) {
        try {
            //データベースへのコネクション
            Connection conn = null;
            Class.forName("org.postgresql.Driver");
            conn =
                DriverManager.getConnection(
                    "jdbc:postgresql:excel",
                    "postgres",
                    "");
            PreparedStatement ps =
                conn.prepareStatement(
"SELECT BINARY_FILE FROM EXCEL_TABLE WHERE FILE_ID = ?");
            ps.setString(1, "1");
            ResultSet rs = ps.executeQuery();
            byte[] imgBytes = null;
            if (rs != null) {
                while (rs.next()) {
                    imgBytes = rs.getBytes(1);
                    // ここでこのデータを何らかの方法で使用します。
                }
                rs.close();
                ByteBuffer buffer = ByteBuffer.allocate(imgBytes.length);
                buffer = ByteBuffer.wrap(imgBytes);
                FileOutputStream fo = new FileOutputStream("tmp.xls");
                FileChannel oc = fo.getChannel();
                oc.write(buffer);
                oc.close();
                fo.close();
            }
            ps.close();
        } catch (FileNotFoundException e) {
            System.out.println("File error!!\n");
        } catch (Exception e) {
            System.out.println("error!!\n");
            e.printStackTrace();
        }

    }
}

一応、ファイルの取り出しに成功。

Torqueを使って、同じことを

その前に先ほど作成したjavaファイルやclassファイルは

C:\torque-gen-3.1\bin\classes

以下に作成されているので、これを今回の実験するディレクトリーにコピーしなきゃ。

まずはTorque.properties

コメントはカットしてある。

torque.applicationRoot = .

log4j.category.org.apache.torque = ALL, org.apache.torque
log4j.appender.org.apache.torque = org.apache.log4j.FileAppender
log4j.appender.org.apache.torque.file = \
    ${torque.applicationRoot}/logs/torque.log
log4j.appender.org.apache.torque.file = torque.log
log4j.appender.org.apache.torque.layout = org.apache.log4j.PatternLayout
log4j.appender.org.apache.torque.layout.conversionPattern = %d [%t] %-5p %c \
    - %m%n
log4j.appender.org.apache.torque.append = false

torque.defaults.pool.logInterval = 0

torque.defaults.pool.connectionWaitTimeout = 10

torque.defaults.pool.defaultMaxConnections = 80

torque.defaults.pool.maxExpiryTime = 3600

torque.defaults.connection.driver = org.postgresql.Driver

torque.defaults.connection.url = jdbc:postgresql://127.0.0.1:5432/excel

torque.defaults.connection.user = postgres
torque.defaults.connection.password = 

torque.database.default=excel
torque.database.excel.adapter=postgresql

torque.dsfactory.excel.factory=org.apache.torque.dsfactory.TorqueDataSourceFactory
torque.dsfactory.excel.pool.defaultMaxConnections=10
torque.dsfactory.excel.pool.maxExpiryTime=3600
torque.dsfactory.excel.pool.connectionWaitTimeout=10
torque.dsfactory.excel.connection.driver = org.postgresql.Driver
torque.dsfactory.excel.connection.url = \
    jdbc:postgresql://127.0.0.1:5432/excel
torque.dsfactory.excel.connection.user = postgres
torque.dsfactory.excel.connection.password = 

torque.manager.useCache = true

Torqueを使って、登録実験

なんとか、うまくいった。以下がそのソース。

package com.chikkun.webcomponent.torque;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
public class TestTorque3 {

    public static void main(String[] args) {
              //必ずTorqueを使うときは必要
        String path = "Torque.properties";
        try {
            Torque.init(path);
        } catch (TorqueException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        ExcelTable et = new ExcelTable();

              byte[] data = null;

              try {
                      FileInputStream in = new FileInputStream("test.xls");
                              FileChannel channel = in.getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect((int)channel.size());
                              channel.read(buf);

                              buf.flip();
                              data = new byte[buf.capacity()];
                              buf.get(data);

                              channel.close();
              } catch (FileNotFoundException e1) {
                      // TODO Auto-generated catch block
                      e1.printStackTrace();
              } catch (IOException e1) {
                      // TODO Auto-generated catch block
                      e1.printStackTrace();
              }

        et.setFileName("test.xml");
              et.setBinaryFile(data);
     //       System.out.println(et.getFileId());
              try {
                      et.save();
              } catch (Exception e2) {
                      // TODO Auto-generated catch block
                      e2.printStackTrace();
              }
    }
}

Torqueを使って、読み出してファイルへ

以下がそのソース

package com.chikkun.webcomponent.torque;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.List;

import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
import org.apache.torque.util.Criteria;

public class ExcelTorque4 {

      public static void main(String[] args) {
              String path = "Torque.properties";
              try {
                      //必ずTorqueを使うときは必要
                      Torque.init(path);
              } catch (TorqueException e) {
                      // TODO 自動生成された catch ブロック
                      e.printStackTrace();
              }
        //select文発行の時に必要
        //andやorの時は
        //            Criteria criteria = new Criteria("SOME_TABLE");
// criteria.add("SOME_DATA", 10, Criteria.GREATER_EQUALS);
// Criteria.Criterion criterion = criteria.getNewCriterion(
        //                    "SOME_DATA", 
        //                    new Integer(10), Criteria.LESS_EQUALS
        //            );
        //            criteria.and(criterion);
              Criteria c = new Criteria();
              c.add(ExcelTablePeer.FILE_ID, 1);
              List results = null;
              try {
                      results = ExcelTablePeer.doSelect(c);
              } catch (TorqueException e) {
                      // TODO Auto-generated catch block
                      System.out.println("hello");
                      e.printStackTrace();
              }
              ExcelTable et = null;
              //今回は必ず帰ってくるのが1つなので必要ないが・・・
              for (int i = 0; i < results.size(); i++) {
                      et = (ExcelTable) results.get(i);
              }
              byte[] imgBytes = et.getBinaryFile();

              ByteBuffer buffer = ByteBuffer.allocate(imgBytes.length);
              buffer = ByteBuffer.wrap(imgBytes);
              try {
FileOutputStream fo = new FileOutputStream("tmp2.xls");
                      FileChannel oc = fo.getChannel();
                      oc.write(buffer);
                      oc.close();
                      fo.close();
              } catch (FileNotFoundException e1) {
                      // TODO Auto-generated catch block
                      e1.printStackTrace();
              } catch (IOException e1) {
                      // TODO Auto-generated catch block
                      e1.printStackTrace();
              }
      }
}

[2004-05-04 19:24]