package jtatest;

import bitronix.tm.TransactionManagerServices;
import bitronix.tm.resource.jdbc.PoolingDataSource;

import javax.transaction.UserTransaction;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;

public class Test {

    public static void main(String[] args) throws Exception {
        String who = "world";
        if (args.length > 0)
            who = args[0];

        PoolingDataSource derby1Ds = new PoolingDataSource();
        derby1Ds.setClassName("org.postgresql.xa.PGXADataSource");
        derby1Ds.setUniqueName("derby1");
        derby1Ds.setPoolSize(3);
        derby1Ds.getDriverProperties().setProperty("user", "postgres");
        derby1Ds.getDriverProperties().setProperty("databaseName", "postgres");
        derby1Ds.init();

        UserTransaction ut = TransactionManagerServices.getTransactionManager();
        ut.begin();
        try {
            Connection c = derby1Ds.getConnection();

            PreparedStatement stmt = c.prepareStatement("insert into messages(content) values (?)");
            stmt.setString(1, "hello, " + who + "!");
            stmt.executeUpdate();
            stmt.close();

            c.close();
            ut.commit();
        } catch (SQLException ex) {
            ex.printStackTrace();
            ut.rollback();
        }

        ut.begin();
        try {
            Connection c = derby1Ds.getConnection();

            PreparedStatement stmt = c.prepareStatement("select content from messages");
            ResultSet rs = stmt.executeQuery();
            while(rs.next())
                System.out.println(rs.getString(1));
            rs.close();
            stmt.close();

	    /* Run another query */
             stmt = c.prepareStatement("select content from messages");
             rs = stmt.executeQuery();
            while(rs.next())
                System.out.println(rs.getString(1));
            rs.close();
            stmt.close();

            c.close();
            ut.commit();
        } catch (SQLException ex) {
            ex.printStackTrace();
            ut.rollback();
        }

        derby1Ds.close();
    }
}
