/*
* Copyright (c) 2004, PostgreSQL Global Development Group
* See the LICENSE file in the project root for more information.
*/
package org.postgresql.test.jdbc2;
import static org.junit.Assert.assertEquals;
import org.postgresql.PGConnection;
import org.postgresql.copy.CopyManager;
import org.postgresql.test.TestUtil;
import org.postgresql.test.util.BufferGenerator;
import org.postgresql.test.util.StrangeInputStream;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author amozhenin on 30.09.2015.
*/
public class CopyLargeFileTest {
private static final int FEED_COUNT = 10;
private Connection con;
private CopyManager copyAPI;
@Before
public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "pgjdbc_issue366_test_glossary",
"id SERIAL, text_id VARCHAR(1000) NOT NULL UNIQUE, name VARCHAR(10) NOT NULL UNIQUE");
TestUtil.createTable(con, "pgjdbc_issue366_test_data",
"id SERIAL,\n"
+ "data_text_id VARCHAR(1000) NOT NULL /*UNIQUE <-- it slows down inserts due to additional index */,\n"
+ "glossary_text_id VARCHAR(1000) NOT NULL /* REFERENCES pgjdbc_issue366_test_glossary(text_id) */,\n"
+ "value DOUBLE PRECISION NOT NULL");
feedTable();
BufferGenerator.main(new String[]{});
copyAPI = ((PGConnection) con).getCopyAPI();
}
private void feedTable() throws Exception {
PreparedStatement stmt = con.prepareStatement(
TestUtil.insertSQL("pgjdbc_issue366_test_glossary", "text_id, name", "?, ?"));
for (int i = 0; i < 26; i++) {
char ch = (char) ('A' + i); // black magic
insertData(stmt, "VERY_LONG_STRING_TO_REPRODUCE_ISSUE_366_" + ch + ch + ch,
"" + ch + ch + ch);
}
}
private void insertData(PreparedStatement stmt, String textId, String name) throws SQLException {
stmt.setString(1, textId);
stmt.setString(2, name);
stmt.executeUpdate();
}
@After
public void tearDown() throws Exception {
try {
TestUtil.dropTable(con, "pgjdbc_issue366_test_data");
TestUtil.dropTable(con, "pgjdbc_issue366_test_glossary");
new File("target/buffer.txt").delete();
} finally {
con.close();
}
}
@Test
public void testFeedTableSeveralTimesTest() throws Exception {
for (int i = 1; i <= FEED_COUNT; i++) {
feedTableAndCheckTableFeedIsOk(con);
cleanupTable(con);
}
}
private void feedTableAndCheckTableFeedIsOk(Connection conn) throws Exception {
InputStream in = null;
try {
in = new StrangeInputStream(new FileInputStream("target/buffer.txt"));
long size = copyAPI.copyIn(
"COPY pgjdbc_issue366_test_data(data_text_id, glossary_text_id, value) FROM STDIN", in);
assertEquals(BufferGenerator.ROW_COUNT, size);
} finally {
if (in != null) {
in.close();
}
}
}
private void cleanupTable(Connection conn) throws Exception {
CallableStatement stmt = null;
try {
stmt = conn.prepareCall("TRUNCATE pgjdbc_issue366_test_data;");
stmt.execute();
} finally {
if (stmt != null) {
stmt.close();
}
}
}
}