]> source.dussan.org Git - jackcess.git/commitdiff
Make Database.escapeIdentifier public; add methods to TableBuilder and ColumnBuilder...
authorJames Ahlborn <jtahlborn@yahoo.com>
Fri, 16 Jul 2010 04:19:59 +0000 (04:19 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Fri, 16 Jul 2010 04:19:59 +0000 (04:19 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@474 f203690c-595d-4dc9-a70b-905162fa7fd2

src/changes/changes.xml
src/java/com/healthmarketscience/jackcess/ColumnBuilder.java
src/java/com/healthmarketscience/jackcess/Database.java
src/java/com/healthmarketscience/jackcess/ImportUtil.java
src/java/com/healthmarketscience/jackcess/TableBuilder.java
test/src/java/com/healthmarketscience/jackcess/CursorTest.java
test/src/java/com/healthmarketscience/jackcess/DatabaseTest.java
test/src/java/com/healthmarketscience/jackcess/ErrorHandlerTest.java
test/src/java/com/healthmarketscience/jackcess/ExportTest.java
test/src/java/com/healthmarketscience/jackcess/IndexCodesTest.java

index 1772db549acbe2c08c3466997b8a4016134a863b..9a89d0a53c3e61b73625ca651cb4968f9ed39146 100644 (file)
         Fix some places where table/columns names were not being handled
         case-insensitively.
       </action>
+      <action dev="jahlborn" type="fix" issue="3029500">
+        Make Database.escapeIdentifier public; add methods to TableBuilder and
+        ColumnBuilder to optionally escape names.
+      </action>
     </release>
     <release version="1.2.0" date="2010-04-18">
       <action dev="bhamail" type="update" issue="1451628">
index 97fca0ab3b92f18cbd59b5f6abc7d47c7d4c796d..06e7356f1c75c5e132b6f435ed44dfb3e1f53477 100644 (file)
@@ -155,6 +155,15 @@ public class ColumnBuilder {
     return this;
   }
 
+  /**
+   * Escapes the new column's name using {@link Database#escapeIdentifier}.
+   */
+  public ColumnBuilder escapeName()
+  {
+    _name = Database.escapeIdentifier(_name);
+    return this;
+  }
+
   /**
    * Creates a new Column with the currently configured attributes.
    */
index d6786ba3bffedb24239f52821a7574011a8ab56c..b445141a459b71ade392b8bc07012f2ea6a44333 100644 (file)
@@ -1178,7 +1178,7 @@ public class Database
   /**
    * @return A table or column name escaped for Access
    */
-  static String escape(String s) {
+  public static String escapeIdentifier(String s) {
     if (isReservedWord(s)) {
       return ESCAPE_PREFIX + s; 
     }
index 8aa7ed603ea352088819dde079a3e9970abd5553..d13a7af18edbe16fdc66245c9e31f19bcdd59439 100644 (file)
@@ -90,7 +90,7 @@ public class ImportUtil
   {
     ResultSetMetaData md = source.getMetaData();
 
-    name = Database.escape(name);
+    name = Database.escapeIdentifier(name);
     Table table = null;
     if(!useExistingTable || ((table = db.getTable(name)) == null)) {
       
@@ -98,7 +98,7 @@ public class ImportUtil
       List<Column> columns = new LinkedList<Column>();
       for (int i = 1; i <= md.getColumnCount(); i++) {
         Column column = new Column();
-        column.setName(Database.escape(md.getColumnName(i)));
+        column.setName(Database.escapeIdentifier(md.getColumnName(i)));
         int lengthInUnits = md.getColumnDisplaySize(i);
         column.setSQLType(md.getColumnType(i), lengthInUnits);
         DataType type = column.getType();
@@ -269,7 +269,7 @@ public class ImportUtil
     }
 
     try {
-      name = Database.escape(name);
+      name = Database.escapeIdentifier(name);
       Table table = null;
       if(!useExistingTable || ((table = db.getTable(name)) == null)) {
 
@@ -277,8 +277,8 @@ public class ImportUtil
         String[] columnNames = line.split(delim);
       
         for (int i = 0; i < columnNames.length; i++) {
-          columns.add(new ColumnBuilder(Database.escape(columnNames[i]), 
-                                        DataType.TEXT)
+          columns.add(new ColumnBuilder(columnNames[i], DataType.TEXT)
+                      .escapeName()
                       .setLength((short)DataType.TEXT.getMaxSize())
                       .toColumn());
         }
index d7225d80a35864608fee34ac2eebdc31c3a5abe2..13ff1dfc74d3d0df9db4eab25c341b4383c0b16b 100644 (file)
@@ -42,19 +42,58 @@ public class TableBuilder {
   private String _name;
   /** columns for the new table */
   private List<Column> _columns = new ArrayList<Column>();
-  
+  /** whether or not table/columns names are automatically escaped */
+  private boolean _escapeIdentifiers;
+
   public TableBuilder(String name) {
+    this(name, false);
+  }
+  
+  public TableBuilder(String name, boolean escapeIdentifiers) {
     _name = name;
+    _escapeIdentifiers = escapeIdentifiers;
+    if(_escapeIdentifiers) {
+      _name = Database.escapeIdentifier(_name);
+    }
   }
 
+
   /**
    * Adds a Column to the new table.
    */
   public TableBuilder addColumn(Column column) {
+    if(_escapeIdentifiers) {
+      column.setName(Database.escapeIdentifier(column.getName()));
+    }
     _columns.add(column);
     return this;
   }
 
+  /**
+   * Adds a Column to the new table.
+   */
+  public TableBuilder addColumn(ColumnBuilder columnBuilder) {
+    return addColumn(columnBuilder.toColumn());
+  }
+
+  /**
+   * Sets whether or not subsequently added columns will have their names
+   * automatically escaped
+   */
+  public TableBuilder setEscapeIdentifiers(boolean escapeIdentifiers) {
+    _escapeIdentifiers = escapeIdentifiers;
+    return this;
+  }
+
+  /**
+   * Escapes the new table's name using {@link Database#escapeIdentifier}.
+   */
+  public TableBuilder escapeName()
+  {
+    _name = Database.escapeIdentifier(_name);
+    return this;
+  }
+
   /**
    * Creates a new Table in the given Database with the currently configured
    * attributes.
index 12b4d44727954eb604f125a04d250d1a68a5c41e..4fda31aa57de1fff22dd8c18929252cc0cd27a51 100644 (file)
@@ -75,8 +75,8 @@ public class CursorTest extends TestCase {
     Database db = create(fileFormat);
 
     Table table = new TableBuilder("test")
-      .addColumn(new ColumnBuilder("id", DataType.LONG).toColumn())
-      .addColumn(new ColumnBuilder("value", DataType.TEXT).toColumn())
+      .addColumn(new ColumnBuilder("id", DataType.LONG))
+      .addColumn(new ColumnBuilder("value", DataType.TEXT))
       .toTable(db);
 
     for(Map<String,Object> row : createTestTableData()) {
index 7052e410fa968a34bd403fb4c7bdf41111efa6bc..4601cfaa9eb4296d9f902722ec352f377304f11e 100644 (file)
@@ -132,8 +132,8 @@ public class DatabaseTest extends TestCase {
 
       try {
         new TableBuilder("test")
-          .addColumn(new ColumnBuilder("A", DataType.TEXT).toColumn())
-          .addColumn(new ColumnBuilder("a", DataType.MEMO).toColumn())
+          .addColumn(new ColumnBuilder("A", DataType.TEXT))
+          .addColumn(new ColumnBuilder("a", DataType.MEMO))
           .toTable(db);
         fail("created table with duplicate column names?");
       } catch(IllegalArgumentException e) {
@@ -143,7 +143,7 @@ public class DatabaseTest extends TestCase {
       try {
         new TableBuilder("test")
           .addColumn(new ColumnBuilder("A", DataType.TEXT)
-                     .setLengthInUnits(352).toColumn())
+                     .setLengthInUnits(352))
           .toTable(db);
         fail("created table with invalid column length?");
       } catch(IllegalArgumentException e) {
@@ -152,8 +152,7 @@ public class DatabaseTest extends TestCase {
 
       try {
         new TableBuilder("test")
-          .addColumn(new ColumnBuilder("A_" + createString(70), DataType.TEXT)
-                     .toColumn())
+          .addColumn(new ColumnBuilder("A_" + createString(70), DataType.TEXT))
           .toTable(db);
         fail("created table with too long column name?");
       } catch(IllegalArgumentException e) {
@@ -161,13 +160,13 @@ public class DatabaseTest extends TestCase {
       }
 
       new TableBuilder("test")
-        .addColumn(new ColumnBuilder("A", DataType.TEXT).toColumn())
+        .addColumn(new ColumnBuilder("A", DataType.TEXT))
         .toTable(db);
 
 
       try {
         new TableBuilder("Test")
-          .addColumn(new ColumnBuilder("A", DataType.TEXT).toColumn())
+          .addColumn(new ColumnBuilder("A", DataType.TEXT))
           .toTable(db);
         fail("create duplicate tables?");
       } catch(IllegalArgumentException e) {
@@ -419,9 +418,9 @@ public class DatabaseTest extends TestCase {
 
       Table table =
       new TableBuilder("test")
-        .addColumn(new ColumnBuilder("A", DataType.TEXT).toColumn())
-        .addColumn(new ColumnBuilder("B", DataType.MEMO).toColumn())
-        .addColumn(new ColumnBuilder("C", DataType.OLE).toColumn())
+        .addColumn(new ColumnBuilder("A", DataType.TEXT))
+        .addColumn(new ColumnBuilder("B", DataType.MEMO))
+        .addColumn(new ColumnBuilder("C", DataType.OLE))
         .toTable(db);
 
       String testStr = "This is a test";
@@ -456,9 +455,7 @@ public class DatabaseTest extends TestCase {
 
       for (int i = 0; i < numColumns; i++)
       {
-        Column column = new ColumnBuilder("column_" + i, DataType.MEMO)
-          .toColumn();
-        bigTableBuilder.addColumn(column);
+        bigTableBuilder.addColumn(new ColumnBuilder("column_" + i, DataType.MEMO));
       }
 
       Table bigTable = bigTableBuilder.toTable(db);
@@ -566,7 +563,7 @@ public class DatabaseTest extends TestCase {
       Database db = create(fileFormat);
 
       Table table = new TableBuilder("test")
-        .addColumn(new ColumnBuilder("A", DataType.MONEY).toColumn())
+        .addColumn(new ColumnBuilder("A", DataType.MONEY))
         .toTable(db);
 
       table.addRow(new BigDecimal("-2341234.03450"));
@@ -602,7 +599,7 @@ public class DatabaseTest extends TestCase {
       Database db = create(fileFormat);
 
       Table table = new TableBuilder("test")
-        .addColumn(new ColumnBuilder("A", DataType.GUID).toColumn())
+        .addColumn(new ColumnBuilder("A", DataType.GUID))
         .toTable(db);
 
       table.addRow("{32A59F01-AA34-3E29-453F-4523453CD2E6}");
@@ -648,7 +645,7 @@ public class DatabaseTest extends TestCase {
       Table table = new TableBuilder("test")
         .addColumn(col)
         .addColumn(new ColumnBuilder("B", DataType.NUMERIC)
-                   .setScale(8).setPrecision(28).toColumn())
+                   .setScale(8).setPrecision(28))
         .toTable(db);
 
       table.addRow(new BigDecimal("-1234.03450"),
@@ -776,9 +773,9 @@ public class DatabaseTest extends TestCase {
     for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
       Database db = create(fileFormat);
       Table newTable = new TableBuilder("NewTable")
-        .addColumn(new ColumnBuilder("a").setSQLType(Types.INTEGER).toColumn())
-        .addColumn(new ColumnBuilder("b").setSQLType(Types.LONGVARCHAR).toColumn())
-        .addColumn(new ColumnBuilder("c").setSQLType(Types.VARCHAR).toColumn())
+        .addColumn(new ColumnBuilder("a").setSQLType(Types.INTEGER))
+        .addColumn(new ColumnBuilder("b").setSQLType(Types.LONGVARCHAR))
+        .addColumn(new ColumnBuilder("c").setSQLType(Types.VARCHAR))
         .toTable(db);
 
       String lval = createString(2000); // "--2000 chars long text--";
@@ -868,8 +865,8 @@ public class DatabaseTest extends TestCase {
 
       Table table = new TableBuilder("test")
         .addColumn(new ColumnBuilder("a", DataType.LONG)
-                  .setAutoNumber(true).toColumn())
-        .addColumn(new ColumnBuilder("b", DataType.TEXT).toColumn())
+                  .setAutoNumber(true))
+        .addColumn(new ColumnBuilder("b", DataType.TEXT))
         .toTable(db);
 
       doTestAutoNumber(table);
@@ -929,9 +926,8 @@ public class DatabaseTest extends TestCase {
       Database db = create(fileFormat);
 
       Table table = new TableBuilder("test")
-        .addColumn(new ColumnBuilder("name", DataType.TEXT).toColumn())
-        .addColumn(new ColumnBuilder("date", DataType.SHORT_DATE_TIME)
-                   .toColumn())
+        .addColumn(new ColumnBuilder("name", DataType.TEXT))
+        .addColumn(new ColumnBuilder("date", DataType.SHORT_DATE_TIME))
         .toTable(db);
 
       // since jackcess does not really store millis, shave them off before
@@ -1025,11 +1021,11 @@ public class DatabaseTest extends TestCase {
       Database db = create(fileFormat);
 
       Table t = new TableBuilder("test")
-        .addColumn(new ColumnBuilder("name", DataType.TEXT).toColumn())
+        .addColumn(new ColumnBuilder("name", DataType.TEXT))
         .addColumn(new ColumnBuilder("id", DataType.LONG)
-                   .setAutoNumber(true).toColumn())
+                   .setAutoNumber(true))
         .addColumn(new ColumnBuilder("data", DataType.TEXT)
-                   .setLength(JetFormat.TEXT_FIELD_MAX_LENGTH).toColumn())
+                   .setLength(JetFormat.TEXT_FIELD_MAX_LENGTH))
         .toTable(db);
 
       for(int i = 0; i < 10; ++i) {
@@ -1145,15 +1141,15 @@ public class DatabaseTest extends TestCase {
   
   static void createTestTable(Database db) throws Exception {
     new TableBuilder("test")
-      .addColumn(new ColumnBuilder("A", DataType.TEXT).toColumn())
-      .addColumn(new ColumnBuilder("B", DataType.TEXT).toColumn())
-      .addColumn(new ColumnBuilder("C", DataType.TEXT).toColumn())
-      .addColumn(new ColumnBuilder("D", DataType.LONG).toColumn())
-      .addColumn(new ColumnBuilder("E", DataType.BYTE).toColumn())
-      .addColumn(new ColumnBuilder("F", DataType.DOUBLE).toColumn())
-      .addColumn(new ColumnBuilder("G", DataType.FLOAT).toColumn())
-      .addColumn(new ColumnBuilder("H", DataType.INT).toColumn())
-      .addColumn(new ColumnBuilder("I", DataType.SHORT_DATE_TIME).toColumn())
+      .addColumn(new ColumnBuilder("A", DataType.TEXT))
+      .addColumn(new ColumnBuilder("B", DataType.TEXT))
+      .addColumn(new ColumnBuilder("C", DataType.TEXT))
+      .addColumn(new ColumnBuilder("D", DataType.LONG))
+      .addColumn(new ColumnBuilder("E", DataType.BYTE))
+      .addColumn(new ColumnBuilder("F", DataType.DOUBLE))
+      .addColumn(new ColumnBuilder("G", DataType.FLOAT))
+      .addColumn(new ColumnBuilder("H", DataType.INT))
+      .addColumn(new ColumnBuilder("I", DataType.SHORT_DATE_TIME))
       .toTable(db);
   }
     
index 488f6bdff1371e846ee3feff56c791d952340e37..afffdd5dc5f1436223b4ba5692b4a023f936693d 100644 (file)
@@ -55,8 +55,8 @@ public class ErrorHandlerTest extends TestCase
 
       Table table =
         new TableBuilder("test")
-        .addColumn(new ColumnBuilder("col", DataType.TEXT).toColumn())
-        .addColumn(new ColumnBuilder("val", DataType.LONG).toColumn())
+        .addColumn(new ColumnBuilder("col", DataType.TEXT))
+        .addColumn(new ColumnBuilder("val", DataType.LONG))
         .toTable(db);
 
       table.addRow("row1", 1);
index a0528f472a52c6fc0c2bdcb7c91249a29a766fc5..062cc8a70d3e0669568188e2ffa7f7729d1d6692 100644 (file)
@@ -59,12 +59,12 @@ public class ExportTest extends TestCase
       Database db = create(fileFormat);
 
       Table t = new TableBuilder("test")
-        .addColumn(new ColumnBuilder("col1", DataType.TEXT).toColumn())
-        .addColumn(new ColumnBuilder("col2", DataType.LONG).toColumn())
-        .addColumn(new ColumnBuilder("col3", DataType.DOUBLE).toColumn())
-        .addColumn(new ColumnBuilder("col4", DataType.OLE).toColumn())
-        .addColumn(new ColumnBuilder("col5", DataType.BOOLEAN).toColumn())
-        .addColumn(new ColumnBuilder("col6", DataType.SHORT_DATE_TIME).toColumn())
+        .addColumn(new ColumnBuilder("col1", DataType.TEXT))
+        .addColumn(new ColumnBuilder("col2", DataType.LONG))
+        .addColumn(new ColumnBuilder("col3", DataType.DOUBLE))
+        .addColumn(new ColumnBuilder("col4", DataType.OLE))
+        .addColumn(new ColumnBuilder("col5", DataType.BOOLEAN))
+        .addColumn(new ColumnBuilder("col6", DataType.SHORT_DATE_TIME))
         .toTable(db);
 
       t.addRow("some text||some more", 13, 13.25, createString(30).getBytes(), true, df.parse("19801231 00:00:00"));
index 7e0d722f7ea4d5bddbe4853e34aa467f51e0b822..53370a4a4db3e9531adda7544054cb1ac60d0631 100644 (file)
@@ -146,8 +146,8 @@ public class IndexCodesTest extends TestCase {
     Database db = create(Database.FileFormat.V2000, true);
 
     Table t = new TableBuilder("test")
-      .addColumn(new ColumnBuilder("row", DataType.TEXT).toColumn())
-      .addColumn(new ColumnBuilder("data", DataType.TEXT).toColumn())
+      .addColumn(new ColumnBuilder("row", DataType.TEXT))
+      .addColumn(new ColumnBuilder("data", DataType.TEXT))
       .toTable(db);
     
     for(int i = 0; i < 256; ++i) {
@@ -179,8 +179,8 @@ public class IndexCodesTest extends TestCase {
     Database db = create(Database.FileFormat.V2000, true);
 
 //     Table t = new TableBuilder("Table1")
-//       .addColumn(new ColumnBuilder("key", DataType.TEXT).toColumn())
-//       .addColumn(new ColumnBuilder("data", DataType.TEXT).toColumn())
+//       .addColumn(new ColumnBuilder("key", DataType.TEXT))
+//       .addColumn(new ColumnBuilder("data", DataType.TEXT))
 //       .toTable(db);
 
 //     for(int i = 0; i <= 0xFFFF; ++i) {
@@ -195,8 +195,8 @@ public class IndexCodesTest extends TestCase {
 //     }
 
     Table t = new TableBuilder("Table5")
-      .addColumn(new ColumnBuilder("name", DataType.TEXT).toColumn())
-      .addColumn(new ColumnBuilder("data", DataType.TEXT).toColumn())
+      .addColumn(new ColumnBuilder("name", DataType.TEXT))
+      .addColumn(new ColumnBuilder("data", DataType.TEXT))
       .toTable(db);
 
     char c = (char)0x3041;   // crazy 7F 02 ... A0
@@ -218,13 +218,13 @@ public class IndexCodesTest extends TestCase {
     addCombos(t, 0, "", cs, 5);
 
 //     t = new TableBuilder("Table2")
-//       .addColumn(new ColumnBuilder("data", DataType.TEXT).toColumn())
+//       .addColumn(new ColumnBuilder("data", DataType.TEXT))
 //       .toTable(db);
     
 //     writeChars(0x0000, t);
 
 //     t = new TableBuilder("Table3")
-//       .addColumn(new ColumnBuilder("data", DataType.TEXT).toColumn())
+//       .addColumn(new ColumnBuilder("data", DataType.TEXT))
 //       .toTable(db);
     
 //     writeChars(0x0400, t);