/**
  * Re-creates the full text index for this database. Calling this method is usually not needed, as
  * the index is kept up-to-date automatically.
  *
  * @param conn the connection
  */
 public static void reindex(Connection conn) throws SQLException {
   init(conn);
   removeAllTriggers(conn, TRIGGER_PREFIX);
   removeIndexFiles(conn);
   Statement stat = conn.createStatement();
   ResultSet rs = stat.executeQuery("SELECT * FROM " + SCHEMA + ".INDEXES");
   while (rs.next()) {
     String schema = rs.getString("SCHEMA");
     String table = rs.getString("TABLE");
     createTrigger(conn, schema, table);
     indexExistingRows(conn, schema, table);
   }
 }
 /**
  * Get the path of the Lucene index for this database.
  *
  * @param conn the database connection
  * @return the path
  */
 protected static String getIndexPath(Connection conn) throws SQLException {
   Statement stat = conn.createStatement();
   ResultSet rs = stat.executeQuery("CALL DATABASE_PATH()");
   rs.next();
   String path = rs.getString(1);
   if (path == null) {
     throw throwException("Fulltext search for in-memory databases is not supported.");
   }
   int index = path.lastIndexOf(':');
   // position 1 means a windows drive letter is used, ignore that
   if (index > 1) {
     path = path.substring(index + 1);
   }
   rs.close();
   return path;
 }
 /**
  * Add the existing data to the index.
  *
  * @param conn the database connection
  * @param schema the schema name
  * @param table the table name
  */
 protected static void indexExistingRows(Connection conn, String schema, String table)
     throws SQLException {
   FullTextLucene2.FullTextTrigger existing = new FullTextLucene2.FullTextTrigger();
   existing.init(conn, schema, null, table, false, Trigger.INSERT);
   String sql =
       "SELECT * FROM "
           + StringUtils.quoteIdentifier(schema)
           + "."
           + StringUtils.quoteIdentifier(table);
   ResultSet rs = conn.createStatement().executeQuery(sql);
   int columnCount = rs.getMetaData().getColumnCount();
   while (rs.next()) {
     Object[] row = new Object[columnCount];
     for (int i = 0; i < columnCount; i++) {
       row[i] = rs.getObject(i + 1);
     }
     // existing.fire(conn, null, row);
     existing.insert(row, false);
   }
   existing.commitIndex();
 }
 /** INTERNAL */
 public void init(
     Connection conn,
     String schemaName,
     String triggerName,
     String tableName,
     boolean before,
     int type)
     throws SQLException {
   this.schema = schemaName;
   this.table = tableName;
   this.indexPath = getIndexPath(conn);
   this.indexAccess = getIndexAccess(conn);
   ArrayList<String> keyList = New.arrayList();
   DatabaseMetaData meta = conn.getMetaData();
   ResultSet rs =
       meta.getColumns(
           null, escapeMetaDataPattern(schemaName), escapeMetaDataPattern(tableName), null);
   ArrayList<String> columnList = New.arrayList();
   while (rs.next()) {
     columnList.add(rs.getString("COLUMN_NAME"));
   }
   columnTypes = new int[columnList.size()];
   columns = new String[columnList.size()];
   columnList.toArray(columns);
   rs =
       meta.getColumns(
           null, escapeMetaDataPattern(schemaName), escapeMetaDataPattern(tableName), null);
   for (int i = 0; rs.next(); i++) {
     columnTypes[i] = rs.getInt("DATA_TYPE");
   }
   if (keyList.size() == 0) {
     rs = meta.getPrimaryKeys(null, escapeMetaDataPattern(schemaName), tableName);
     while (rs.next()) {
       keyList.add(rs.getString("COLUMN_NAME"));
     }
   }
   if (keyList.size() == 0) {
     throw throwException("No primary key for table " + tableName);
   }
   ArrayList<String> indexList = New.arrayList();
   PreparedStatement prep =
       conn.prepareStatement(
           "SELECT COLUMNS FROM " + SCHEMA + ".INDEXES WHERE SCHEMA=? AND TABLE=?");
   prep.setString(1, schemaName);
   prep.setString(2, tableName);
   rs = prep.executeQuery();
   if (rs.next()) {
     String cols = rs.getString(1);
     if (cols != null) {
       for (String s : StringUtils.arraySplit(cols, ',', true)) {
         indexList.add(s);
       }
     }
   }
   if (indexList.size() == 0) {
     indexList.addAll(columnList);
   }
   keys = new int[keyList.size()];
   setColumns(keys, keyList, columnList);
   indexColumns = new int[indexList.size()];
   setColumns(indexColumns, indexList, columnList);
 }