/* * Microsoft JDBC Driver for SQL Server * * Copyright(c) Microsoft Corporation All rights reserved. * * This program is made available under the terms of the MIT License. See the LICENSE file in the project root for more information. */ package com.microsoft.sqlserver.jdbc.bulkCopy; import java.sql.JDBCType; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.platform.runner.JUnitPlatform; import org.junit.runner.RunWith; import com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord; import com.microsoft.sqlserver.jdbc.SQLServerException; import com.microsoft.sqlserver.testframework.AbstractTest; import com.microsoft.sqlserver.testframework.DBConnection; import com.microsoft.sqlserver.testframework.DBStatement; import com.microsoft.sqlserver.testframework.DBTable; import com.microsoft.sqlserver.testframework.sqlType.SqlType; /** * Test bulkcopy decimal sacle and precision */ @RunWith(JUnitPlatform.class) @DisplayName("Test ISQLServerBulkRecord") public class BulkCopyISQLServerBulkRecordTest extends AbstractTest { static DBConnection con = null; static DBStatement stmt = null; static DBTable dstTable = null; /** * Create connection and statement */ @BeforeAll static void setUpConnection() { con = new DBConnection(connectionString); stmt = con.createStatement(); } @Test void testISQLServerBulkRecord() { dstTable = new DBTable(true); stmt.createTable(dstTable); BulkData Bdata = new BulkData(); BulkCopyTestWrapper bulkWrapper = new BulkCopyTestWrapper(connectionString); bulkWrapper.setUsingConnection((0 == ThreadLocalRandom.current().nextInt(2)) ? true : false); BulkCopyTestUtil.performBulkCopy(bulkWrapper, Bdata, dstTable); } /** * drop source table after testing bulk copy * * @throws SQLException */ @AfterAll static void tearConnection() throws SQLException { stmt.close(); con.close(); } class BulkData implements ISQLServerBulkRecord { private class ColumnMetadata { String columnName; int columnType; int precision; int scale; ColumnMetadata(String name, int type, int precision, int scale) { columnName = name; columnType = type; this.precision = precision; this.scale = scale; } } int totalColumn = 0; int counter = 0; int rowCount = 1; Map<Integer, ColumnMetadata> columnMetadata; List<Object[]> data; BulkData() { columnMetadata = new HashMap<Integer, ColumnMetadata>(); totalColumn = dstTable.totalColumns(); // add metadata for (int i = 0; i < totalColumn; i++) { SqlType sqlType = dstTable.getSqlType(i); int precision = sqlType.getPrecision(); if (JDBCType.TIMESTAMP == sqlType.getJdbctype()) { // TODO: update the test to use correct precision once bulkCopy is fixed precision = 50; } columnMetadata.put(i + 1, new ColumnMetadata(sqlType.getName(), sqlType.getJdbctype().getVendorTypeNumber(), precision, sqlType.getScale())); } // add data rowCount = DBTable.getTotalRows(); data = new ArrayList<Object[]>(rowCount); for (int i = 0; i < rowCount; i++) { Object[] CurrentRow = new Object[totalColumn]; for (int j = 0; j < totalColumn; j++) { SqlType sqlType = dstTable.getSqlType(j); if (JDBCType.BIT == sqlType.getJdbctype()) { CurrentRow[j] = ((0 == ThreadLocalRandom.current().nextInt(2)) ? Boolean.FALSE : Boolean.TRUE); } else { CurrentRow[j] = sqlType.createdata(); } } data.add(CurrentRow); } } /* * (non-Javadoc) * * @see com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord#getColumnOrdinals() */ @Override public Set<Integer> getColumnOrdinals() { return columnMetadata.keySet(); } /* * (non-Javadoc) * * @see com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord#getColumnName(int) */ @Override public String getColumnName(int column) { return columnMetadata.get(column).columnName; } /* * (non-Javadoc) * * @see com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord#getColumnType(int) */ @Override public int getColumnType(int column) { return columnMetadata.get(column).columnType; } /* * (non-Javadoc) * * @see com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord#getPrecision(int) */ @Override public int getPrecision(int column) { return columnMetadata.get(column).precision; } /* * (non-Javadoc) * * @see com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord#getScale(int) */ @Override public int getScale(int column) { return columnMetadata.get(column).scale; } /* * (non-Javadoc) * * @see com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord#isAutoIncrement(int) */ @Override public boolean isAutoIncrement(int column) { return false; } /* * (non-Javadoc) * * @see com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord#getRowData() */ @Override public Object[] getRowData() throws SQLServerException { return data.get(counter++); } /* * (non-Javadoc) * * @see com.microsoft.sqlserver.jdbc.ISQLServerBulkRecord#next() */ @Override public boolean next() throws SQLServerException { if (counter < rowCount) return true; return false; } /** * reset the counter when using the interface for validating the data */ public void reset() { counter = 0; } } }