]> source.dussan.org Git - jackcess.git/commitdiff
add unit test for new copyTable behavior
authorJames Ahlborn <jtahlborn@yahoo.com>
Mon, 13 Nov 2006 14:58:29 +0000 (14:58 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Mon, 13 Nov 2006 14:58:29 +0000 (14:58 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@136 f203690c-595d-4dc9-a70b-905162fa7fd2

src/java/com/healthmarketscience/jackcess/DataType.java
src/java/com/healthmarketscience/jackcess/Database.java
test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java
test/src/java/com/healthmarketscience/jackcess/ImportTest.java

index dcc18d7d5c26bb9229bc81baf6e29a608153b013..a19f374c71b706bdbd9acc0358c8d9bfec766115 100644 (file)
@@ -187,6 +187,12 @@ public enum DataType {
     return _variableLength;
   }
 
+  public boolean isTrueVariableLength() {
+    // some "var len" fields do not really have a variable length,
+    // e.g. NUMERIC
+    return (isVariableLength() && (getMinSize() != getMaxSize()));
+  }
+  
   public boolean isLongValue() {
     return _longValue;
   }
index 30a835ba659889bb4f078cc82b7e0ef54a12d7cd..43bee10673fe9a38c4fcd4f36e832b615afe5196 100644 (file)
@@ -639,7 +639,10 @@ public class Database
       int lengthInUnits = md.getColumnDisplaySize(i);
       column.setSQLType(md.getColumnType(i), lengthInUnits);
       DataType type = column.getType();
-      if(type.isVariableLength()) {
+      // we check for isTrueVariableLength here to avoid setting the length
+      // for a NUMERIC column, which pretends to be var-len, even though it
+      // isn't
+      if(type.isTrueVariableLength() && !type.isLongValue()) {
         column.setLengthInUnits((short)lengthInUnits);
       }
       if(type.getHasScalePrecision()) {
index 51d9220c27f53c60d6552d66c526369765d3041c..92cbb47c92ba720b2e40f8ce5b77c0db00a36d49 100644 (file)
@@ -81,7 +81,7 @@ public class DatabaseTest extends TestCase {
     col = new Column();
     col.setName("A");
     col.setType(DataType.TEXT);
-    col.setLength((short)(352 * 2));
+    col.setLength((short)(352 * DataType.TEXT.getUnitSize()));
     columns.add(col);
     
     try {
@@ -295,7 +295,6 @@ public class DatabaseTest extends TestCase {
     assertEquals("Standard", row.get("PROJ_INFO_CAL_NAME"));
     assertEquals("Project1", row.get("PROJ_PROP_TITLE"));
     byte[] foundBinaryData = (byte[])row.get("RESERVED_BINARY_DATA");
-    System.out.println("FOO found len " + foundBinaryData.length);
     byte[] expectedBinaryData =
       toByteArray(new File("test/data/test2BinData.dat"));
     assertTrue(Arrays.equals(expectedBinaryData, foundBinaryData));
index 2caf825c3f6e2260eb5cf4e0632294c8bf61d404..c3cb5aa411cc6798876060464a32a240996b6e88 100644 (file)
@@ -2,13 +2,19 @@
 
 package com.healthmarketscience.jackcess;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.healthmarketscience.jackcess.Database;
-
 import java.io.File;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.List;
+
 import junit.framework.TestCase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /** 
  *  @author Rob Di Marco
@@ -42,4 +48,114 @@ public class ImportTest extends TestCase
                   "\\t");
   }
 
+  public void testCopySqlHeaders() throws Exception
+  {
+    TestResultSet rs = new TestResultSet();
+
+    rs.addColumn(Types.INTEGER, "col1");
+    rs.addColumn(Types.VARCHAR, "col2", 60, 0, 0);
+    rs.addColumn(Types.VARCHAR, "col3", 500, 0, 0);
+    rs.addColumn(Types.BINARY, "col4", 128, 0, 0);
+    rs.addColumn(Types.BINARY, "col5", 512, 0, 0);
+    rs.addColumn(Types.NUMERIC, "col6", 0, 7, 15);
+
+    Database db = create();
+    db.copyTable("Test1", (ResultSet)Proxy.newProxyInstance(
+                     Thread.currentThread().getContextClassLoader(),
+                     new Class[]{ResultSet.class},
+                     rs));
+
+    Table t = db.getTable("Test1");
+    List<Column> columns = t.getColumns();
+    assertEquals(6, columns.size());
+
+    Column c = columns.get(0);
+    assertEquals("col1", c.getName());
+    assertEquals(DataType.LONG, c.getType());
+
+    c = columns.get(1);
+    assertEquals("col2", c.getName());
+    assertEquals(DataType.TEXT, c.getType());
+    assertEquals(120, c.getLength());
+
+    c = columns.get(2);
+    assertEquals("col3", c.getName());
+    assertEquals(DataType.MEMO, c.getType());
+    assertEquals(0, c.getLength());
+
+    c = columns.get(3);
+    assertEquals("col4", c.getName());
+    assertEquals(DataType.BINARY, c.getType());
+    assertEquals(128, c.getLength());
+    
+    c = columns.get(4);
+    assertEquals("col5", c.getName());
+    assertEquals(DataType.OLE, c.getType());
+    assertEquals(0, c.getLength());
+    
+    c = columns.get(5);
+    assertEquals("col6", c.getName());
+    assertEquals(DataType.NUMERIC, c.getType());
+    assertEquals(17, c.getLength());
+    assertEquals(7, c.getScale());
+    assertEquals(15, c.getPrecision());
+    
+  }
+
+
+  private static class TestResultSet implements InvocationHandler
+  {
+    private List<Integer> _types = new ArrayList<Integer>();
+    private List<String> _names = new ArrayList<String>();
+    private List<Integer> _displaySizes = new ArrayList<Integer>();
+    private List<Integer> _scales = new ArrayList<Integer>();
+    private List<Integer> _precisions = new ArrayList<Integer>();
+    
+    public Object invoke(Object proxy, Method method, Object[] args)
+    {
+      String methodName = method.getName();
+      if(methodName.equals("getMetaData")) {
+        return Proxy.newProxyInstance(
+            Thread.currentThread().getContextClassLoader(),
+            new Class[]{ResultSetMetaData.class},
+            this);
+      } else if(methodName.equals("next")) {
+        return Boolean.FALSE;
+      } else if(methodName.equals("getColumnCount")) {
+        return _types.size();
+      } else if(methodName.equals("getColumnName")) {
+        return getValue(_names, args[0]);
+      } else if(methodName.equals("getColumnDisplaySize")) {
+        return getValue(_displaySizes, args[0]);
+      } else if(methodName.equals("getColumnType")) {
+        return getValue(_types, args[0]);
+      } else if(methodName.equals("getScale")) {
+        return getValue(_scales, args[0]);
+      } else if(methodName.equals("getPrecision")) {
+        return getValue(_precisions, args[0]);
+      } else {
+        throw new UnsupportedOperationException(methodName);
+      }
+    }
+
+    public void addColumn(int type, String name)
+    {
+      addColumn(type, name, 0, 0, 0);
+    }
+
+    public void addColumn(int type, String name, int displaySize,
+                          int scale, int precision)
+    {
+      _types.add(type);
+      _names.add(name);
+      _displaySizes.add(displaySize);
+      _scales.add(scale);
+      _precisions.add(precision);
+    }
+
+    public <T> T getValue(List<T> values, Object index) {
+      return values.get((Integer)index - 1);
+    }
+  }
+  
 }