Пример #1
0
  private void executeTableCreate(
      Connection connection, IDialectSpecifier dialectSpecifier, JsonObject dsDefinitionObject)
      throws SQLException {
    StringBuilder sql = new StringBuilder();
    String tableName = dsDefinitionObject.get(TABLE_NAME).getAsString();

    sql.append(CREATE_TABLE + tableName + " ("); // $NON-NLS-1$

    JsonArray columns = dsDefinitionObject.get(COLUMNS).getAsJsonArray();
    int i = 0;
    for (JsonElement jsonElement : columns) {
      if (jsonElement instanceof JsonObject) {
        if (i > 0 && i < columns.size()) {
          sql.append(", "); // $NON-NLS-1$
        }
        JsonObject jsonObject = (JsonObject) jsonElement;
        String name = jsonObject.get(COLUMN_NAME).getAsString();
        String type =
            dbUtils.specifyDataType(connection, jsonObject.get(COLUMN_TYPE).getAsString());
        String length = jsonObject.get(COLUMN_LENGTH).getAsString();
        boolean notNull = jsonObject.get(COLUMN_NOT_NULL).getAsBoolean();
        boolean primaryKey = jsonObject.get(COLUMN_PRIMARY_KEY).getAsBoolean();
        String defaultValue = jsonObject.get(COLUMN_DEFAULT_VALUE).getAsString();

        sql.append(name + " " + type); // $NON-NLS-1$
        if (DBSupportedTypesMap.VARCHAR.equals(type) || DBSupportedTypesMap.CHAR.equals(type)) {
          sql.append("(" + length + ") "); // $NON-NLS-1$ //$NON-NLS-2$
        } else {
          sql.append(" "); // $NON-NLS-1$
        }
        if (notNull) {
          sql.append(NOT_NULL);
        }
        if (primaryKey) {
          sql.append(PRIMARY_KEY);
        }
        if (defaultValue != null && !"".equals(defaultValue)) { // $NON-NLS-1$
          sql.append(DEFAULT + defaultValue + " "); // $NON-NLS-1$
        }
      }
      i++;
    }

    sql.append(")"); // $NON-NLS-1$
    String sqlExpression = sql.toString();
    try {
      logger.info(sqlExpression);
      executeUpdateSQL(connection, sqlExpression);
    } catch (SQLException e) {
      logger.error(sqlExpression);
      throw new SQLException(sqlExpression, e);
    }
  }
Пример #2
0
  private void executeTableUpdate(
      Connection connection, IDialectSpecifier dialectSpecifier, JsonObject dsDefinitionObject)
      throws SQLException {
    StringBuilder sql = new StringBuilder();
    String tableName = dsDefinitionObject.get(TABLE_NAME).getAsString().toUpperCase();

    Map<String, String> columnDefinitions = new HashMap<String, String>();
    ResultSet rsColumns =
        connection.getMetaData().getColumns(null, null, tableName, "%"); // $NON-NLS-1$
    while (rsColumns.next()) {
      String typeName = DBSupportedTypesMap.getTypeName(rsColumns.getInt(5));
      columnDefinitions.put(rsColumns.getString(4).toUpperCase(), typeName);
    }

    sql.append(ALTER_TABLE + tableName + " "); // $NON-NLS-1$

    JsonArray columns = dsDefinitionObject.get(COLUMNS).getAsJsonArray();
    int i = 0;
    StringBuffer addSql = new StringBuffer();
    addSql.append(dialectSpecifier.getAlterAddOpen());

    for (JsonElement jsonElement : columns) {

      if (jsonElement instanceof JsonObject) {
        JsonObject jsonObject = (JsonObject) jsonElement;
        String name = jsonObject.get(COLUMN_NAME).getAsString().toUpperCase();
        String type =
            dbUtils.specifyDataType(
                connection, jsonObject.get(COLUMN_TYPE).getAsString().toUpperCase());
        String length = jsonObject.get(COLUMN_LENGTH).getAsString();
        boolean notNull = jsonObject.get(COLUMN_NOT_NULL).getAsBoolean();
        boolean primaryKey = jsonObject.get(COLUMN_PRIMARY_KEY).getAsBoolean();
        String defaultValue = jsonObject.get(COLUMN_DEFAULT_VALUE).getAsString();

        if (!columnDefinitions.containsKey(name)) {
          if (i > 0) {
            addSql.append(", "); // $NON-NLS-1$
          }
          addSql.append(name + " " + type); // $NON-NLS-1$
          if (DBSupportedTypesMap.VARCHAR.equals(type) || DBSupportedTypesMap.CHAR.equals(type)) {
            addSql.append("(" + length + ") "); // $NON-NLS-1$ //$NON-NLS-2$
          } else {
            addSql.append(" "); // $NON-NLS-1$
          }
          if (notNull) {
            // sql.append("NOT NULL ");
            throw new SQLException(
                INCOMPATIBLE_CHANGE_OF_TABLE
                    + tableName
                    + AND_COLUMN
                    + name
                    + ADDING_NOT_NULL_COLUMN);
          }
          if (primaryKey) {
            // sql.append("PRIMARY KEY ");
            throw new SQLException(
                INCOMPATIBLE_CHANGE_OF_TABLE
                    + tableName
                    + AND_COLUMN
                    + name
                    + ADDING_PRIMARY_KEY_COLUMN);
          }
          if (defaultValue != null && !"".equals(defaultValue)) { // $NON-NLS-1$
            sql.append(DEFAULT + defaultValue + " "); // $NON-NLS-1$
          }
          i++;
        } else if (!columnDefinitions.get(name).equals(type)) {
          throw new SQLException(
              INCOMPATIBLE_CHANGE_OF_TABLE
                  + tableName
                  + AND_COLUMN
                  + name
                  + TYPE2
                  + columnDefinitions.get(name)
                  + CANNOT_BE_CHANGED_TO
                  + type);
        }
      }
    }

    // TODO Derby does not support multiple ADD in a single statement!

    if (i > 0) {
      addSql.append(dialectSpecifier.getAlterAddClose());
      sql.append(addSql.toString());
    }

    if (columnDefinitions.size() > columns.size()) {
      throw new SQLException(
          INCOMPATIBLE_CHANGE_OF_TABLE + tableName + DASH + AUTOMATIC_DROP_COLUMN_NOT_SUPPORTED);
    }

    if (i > 0) {
      String sqlExpression = sql.toString();
      try {
        logger.info(sqlExpression);
        executeUpdateSQL(connection, sqlExpression);
      } catch (SQLException e) {
        logger.error(sqlExpression);
        throw new SQLException(sqlExpression, e);
      }
    }
  }