it.dontesta.labs.liferay.portal.dao.db.SQLServerDB.java Source code

Java tutorial

Introduction

Here is the source code for it.dontesta.labs.liferay.portal.dao.db.SQLServerDB.java

Source

/**
 * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package it.dontesta.labs.liferay.portal.dao.db;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.liferay.portal.dao.db.BaseDB;
import com.liferay.portal.kernel.dao.db.DBType;
import com.liferay.portal.kernel.dao.db.Index;
import com.liferay.portal.kernel.dao.jdbc.DataAccess;
import com.liferay.portal.kernel.io.unsync.UnsyncBufferedReader;
import com.liferay.portal.kernel.io.unsync.UnsyncStringReader;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;

/**
 * @author Alexander Chow
 * @author Sandeep Soni
 * @author Ganesh Ram
 * @author Antonio Musarra
 */
public class SQLServerDB extends BaseDB {

    public SQLServerDB(int majorVersion, int minorVersion) {
        super(DBType.SQLSERVER, majorVersion, minorVersion);
    }

    @Override
    public String buildSQL(String template) throws IOException {
        template = convertTimestamp(template);
        template = replaceTemplate(template, getTemplate());

        template = reword(template);
        template = StringUtil.replace(template, "\ngo;\n", "\ngo\n");
        template = StringUtil.replace(template, new String[] { "\\\\", "\\'", "\\\"", "\\n", "\\r" },
                new String[] { "\\", "''", "\"", "\n", "\r" });

        return template;
    }

    @Override
    public List<Index> getIndexes(Connection con) throws SQLException {
        List<Index> indexes = new ArrayList<>();

        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            DatabaseMetaData databaseMetaData = con.getMetaData();

            if (databaseMetaData.getDatabaseMajorVersion() <= _SQL_SERVER_2000) {

                return indexes;
            }

            StringBundler sb = new StringBundler(6);

            sb.append("select sys.tables.name as table_name, ");
            sb.append("sys.indexes.name as index_name, is_unique from ");
            sb.append("sys.indexes inner join sys.tables on ");
            sb.append("sys.tables.object_id = sys.indexes.object_id where ");
            sb.append("sys.indexes.name like 'LIFERAY_%' or sys.indexes.name ");
            sb.append("like 'IX_%'");

            String sql = sb.toString();

            ps = con.prepareStatement(sql);

            rs = ps.executeQuery();

            while (rs.next()) {
                String indexName = rs.getString("index_name");
                String tableName = rs.getString("table_name");
                boolean unique = !rs.getBoolean("is_unique");

                indexes.add(new Index(indexName, tableName, unique));
            }
        } finally {
            DataAccess.cleanUp(ps, rs);
        }

        return indexes;
    }

    @Override
    public boolean isSupportsAlterColumnType() {
        return _SUPPORTS_ALTER_COLUMN_TYPE;
    }

    @Override
    protected String buildCreateFileContent(String sqlDir, String databaseName, int population) throws IOException {

        String suffix = getSuffix(population);

        StringBundler sb = new StringBundler(17);

        sb.append("drop database ");
        sb.append(databaseName);
        sb.append(";\n");
        sb.append("create database ");
        sb.append(databaseName);
        sb.append(";\n");
        sb.append("\n");
        sb.append("go\n");
        sb.append("\n");

        if (population != BARE) {
            sb.append("use ");
            sb.append(databaseName);
            sb.append(";\n\n");
            sb.append(getCreateTablesContent(sqlDir, suffix));
            sb.append("\n\n");
            sb.append(readFile(sqlDir + "/indexes/indexes-sql-server.sql"));
            sb.append("\n\n");
            sb.append(readFile(sqlDir + "/sequences/sequences-sql-server.sql"));
        }

        return sb.toString();
    }

    @Override
    protected String getServerName() {
        return "sql-server";
    }

    @Override
    protected String[] getTemplate() {
        return _SQL_SERVER;
    }

    @Override
    protected String reword(String data) throws IOException {
        try (UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader(new UnsyncStringReader(data))) {

            StringBundler sb = new StringBundler();

            String line = null;

            while ((line = unsyncBufferedReader.readLine()) != null) {
                if (line.startsWith(ALTER_COLUMN_NAME)) {
                    String[] template = buildColumnNameTokens(line);

                    line = StringUtil.replace(
                            "exec sp_rename '@table@.@old-column@', " + "'@new-column@', 'column';",
                            REWORD_TEMPLATE, template);
                } else if (line.startsWith(ALTER_COLUMN_TYPE)) {
                    String[] template = buildColumnTypeTokens(line);

                    line = StringUtil.replace("alter table @table@ alter column @old-column@ @type@;",
                            REWORD_TEMPLATE, template);
                } else if (line.startsWith(ALTER_TABLE_NAME)) {
                    String[] template = buildTableNameTokens(line);

                    line = StringUtil.replace("exec sp_rename '@old-table@', '@new-table@';", RENAME_TABLE_TEMPLATE,
                            template);
                } else if (line.contains(DROP_INDEX)) {
                    String[] tokens = StringUtil.split(line, ' ');

                    String tableName = tokens[4];

                    if (tableName.endsWith(StringPool.SEMICOLON)) {
                        tableName = tableName.substring(0, tableName.length() - 1);
                    }

                    line = StringUtil.replace("drop index @table@.@index@;", "@table@", tableName);
                    line = StringUtil.replace(line, "@index@", tokens[2]);
                }

                sb.append(line);
                sb.append("\n");
            }

            return sb.toString();
        }
    }

    private static final String[] _SQL_SERVER = { "--", "1", "0", "'19700101'", "GetDate()", " image", " image",
            " bit", " datetime", " float", " int", " bigint", " nvarchar(2000)", " nvarchar(max)", " nvarchar",
            "  identity(1,1)", "go" };

    private static final int _SQL_SERVER_2000 = 8;
    private static final boolean _SUPPORTS_ALTER_COLUMN_TYPE = false;
}