diff --git a/src/main/java/ru/fusionsoft/dbgit/adapters/IDBAdapter.java b/src/main/java/ru/fusionsoft/dbgit/adapters/IDBAdapter.java index e820187..c59b3da 100644 --- a/src/main/java/ru/fusionsoft/dbgit/adapters/IDBAdapter.java +++ b/src/main/java/ru/fusionsoft/dbgit/adapters/IDBAdapter.java @@ -56,7 +56,7 @@ public interface IDBAdapter { /** * * @param stream Stream for output sql command - * @param isExec - Execute action sql command or only write command to stream + * @param isExecSql - Execute action sql command or only write command to stream */ public void setDumpSqlCommand(OutputStream stream, Boolean isExecSql); diff --git a/src/main/java/ru/fusionsoft/dbgit/command/CmdAdd.java b/src/main/java/ru/fusionsoft/dbgit/command/CmdAdd.java index 416b162..f6103d9 100644 --- a/src/main/java/ru/fusionsoft/dbgit/command/CmdAdd.java +++ b/src/main/java/ru/fusionsoft/dbgit/command/CmdAdd.java @@ -10,13 +10,13 @@ import org.apache.commons.cli.Options; import org.apache.commons.csv.CSVPrinter; -import ru.fusionsoft.dbgit.core.DBGit; import ru.fusionsoft.dbgit.core.DBGitConfig; import ru.fusionsoft.dbgit.core.DBGitIndex; import ru.fusionsoft.dbgit.core.DBGitPath; import ru.fusionsoft.dbgit.core.ExceptionDBGit; import ru.fusionsoft.dbgit.core.GitMetaDataManager; import ru.fusionsoft.dbgit.data_table.RowData; +import ru.fusionsoft.dbgit.data_table.TreeMapRowData; import ru.fusionsoft.dbgit.meta.IMapMetaObject; import ru.fusionsoft.dbgit.meta.IMetaObject; import ru.fusionsoft.dbgit.meta.MetaTable; @@ -96,27 +96,32 @@ public void execute(CommandLine cmdLine) throws Exception { if (obj instanceof MetaTable && maskAdd.match(obj.getName().replace(".tbl", ".csv"))) { MetaTableData tblData = new MetaTableData(((MetaTable) obj).getTable()); - tblData.setName(obj.getName().replace(".tbl", ".csv")); - File file = new File(DBGitPath.getFullPath(null)+"/"+obj.getFileName().replace(".tbl", ".csv")); - DBGitPath.createDir(file.getParent()); - - FileOutputStream out = new FileOutputStream(file.getAbsolutePath()); - CSVPrinter csvPrinter = new CSVPrinter(new OutputStreamWriter(out), tblData.getCSVFormat()); gmdm.setCurrentPortion(DBGitConfig.getInstance().getInteger("core", "CURRENT_PORTION", 0)); boolean isFirstPortion = true; if (cmdLine.hasOption("c")) isFirstPortion = (DBGitConfig.getInstance().getInteger("core", "CURRENT_PORTION", 0) == 0); - + + int fileNumber = 0; while (gmdm.loadNextPortion((MetaTable) obj)) { + String csvExtension = "." + fileNumber + ".csv"; + + tblData.setName(obj.getName().replace(".tbl", csvExtension)); + tblData.setMapRows(new TreeMapRowData()); + + File file = new File(DBGitPath.getFullPath(null)+"/"+obj.getFileName().replace(".tbl", csvExtension)); + DBGitPath.createDir(file.getParent()); + FileOutputStream out = new FileOutputStream(file.getAbsolutePath()); + CSVPrinter csvPrinter = new CSVPrinter(new OutputStreamWriter(out), tblData.getCSVFormat()); + ConsoleWriter.println(getLang().getValue("general", "add", "writing").toString(), 2); try { //gmdm.getCurrent().serialize(out); - Integer count = 0; + int count = 0; Set fields = null; - for (RowData rd : gmdm.getCurrent().getmapRows().values()) { + for (RowData rd : gmdm.getCurrent().getMapRows().values()) { if (count == 0 && isFirstPortion) { fields = rd.getData().keySet(); csvPrinter.printRecord(fields); @@ -127,19 +132,19 @@ public void execute(CommandLine cmdLine) throws Exception { count++; } - - + tblData.getMapRows().putAll(gmdm.getCurrent().getMapRows()); } catch (Exception e) { e.printStackTrace(); throw new ExceptionDBGit(e); } + + csvPrinter.close(); + out.close(); + fileNumber++; + tblData.addToGit(); + index.addItem(tblData); + isFirstPortion = true; } - - csvPrinter.close(); - out.close(); - - tblData.addToGit(); - index.addItem(tblData); } } } diff --git a/src/main/java/ru/fusionsoft/dbgit/command/CmdMerge.java b/src/main/java/ru/fusionsoft/dbgit/command/CmdMerge.java index b9ffa6d..113efae 100644 --- a/src/main/java/ru/fusionsoft/dbgit/command/CmdMerge.java +++ b/src/main/java/ru/fusionsoft/dbgit/command/CmdMerge.java @@ -1,13 +1,13 @@ package ru.fusionsoft.dbgit.command; -import java.util.HashSet; -import java.util.Set; - import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; - import ru.fusionsoft.dbgit.core.DBGit; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public class CmdMerge implements IDBGitCommand { private Options opts = new Options(); @@ -35,11 +35,8 @@ public Options getOptions() { @Override public void execute(CommandLine cmdLine) throws Exception { String[] args = cmdLine.getArgs(); - - Set branches = new HashSet(); - - for (String arg : args) - branches.add(arg); + + Set branches = new HashSet<>(Arrays.asList(args)); DBGit.getInstance().gitMerge(branches); diff --git a/src/main/java/ru/fusionsoft/dbgit/command/CmdRestore.java b/src/main/java/ru/fusionsoft/dbgit/command/CmdRestore.java index 53706aa..55b1c98 100644 --- a/src/main/java/ru/fusionsoft/dbgit/command/CmdRestore.java +++ b/src/main/java/ru/fusionsoft/dbgit/command/CmdRestore.java @@ -1,24 +1,10 @@ package ru.fusionsoft.dbgit.command; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Map; - import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; - import ru.fusionsoft.dbgit.adapters.AdapterFactory; import ru.fusionsoft.dbgit.adapters.IDBAdapter; -import ru.fusionsoft.dbgit.core.DBGitIndex; -import ru.fusionsoft.dbgit.core.DBGitPath; -import ru.fusionsoft.dbgit.core.ExceptionDBGit; -import ru.fusionsoft.dbgit.core.ExceptionDBGitObjectNotFound; -import ru.fusionsoft.dbgit.core.ExceptionDBGitRunTime; -import ru.fusionsoft.dbgit.core.GitMetaDataManager; -import ru.fusionsoft.dbgit.core.ItemIndex; +import ru.fusionsoft.dbgit.core.*; import ru.fusionsoft.dbgit.meta.IMapMetaObject; import ru.fusionsoft.dbgit.meta.IMetaObject; import ru.fusionsoft.dbgit.meta.MetaObjectFactory; @@ -26,6 +12,11 @@ import ru.fusionsoft.dbgit.utils.ConsoleWriter; import ru.fusionsoft.dbgit.utils.LoggerUtil; +import java.io.File; +import java.io.FileOutputStream; +import java.text.SimpleDateFormat; +import java.util.Date; + public class CmdRestore implements IDBGitCommand { private Options opts = new Options(); @@ -52,7 +43,6 @@ public Options getOptions() { @Override public void execute(CommandLine cmdLine) throws Exception { - try { AdapterFactory.createAdapter(); } catch (NullPointerException e) { @@ -128,17 +118,14 @@ public void execute(CommandLine cmdLine) throws Exception { ConsoleWriter.println(getLang().getValue("general", "restore", "seekingToRestore")); for (IMetaObject obj : fileObjs.values()) { - Boolean isRestore = false; + boolean isRestore; try { IMetaObject dbObj = MetaObjectFactory.createMetaObject(obj.getName()); gmdm.loadFromDB(dbObj); isRestore = !dbObj.getHash().equals(obj.getHash()); - } catch (ExceptionDBGit e) { - isRestore = true; - e.printStackTrace(); - } catch (ExceptionDBGitRunTime e) { + } catch (ExceptionDBGit | ExceptionDBGitRunTime e) { isRestore = true; e.printStackTrace(); } @@ -159,12 +146,12 @@ public void execute(CommandLine cmdLine) throws Exception { ConsoleWriter.println(getLang().getValue("general", "restore", "restoring")); } gmdm.restoreDataBase(updateObjs); - + } finally { if (fop != null) { fop.flush(); fop.close(); - } + } if (scriptOutputStream != null) { scriptOutputStream.flush(); scriptOutputStream.close(); diff --git a/src/main/java/ru/fusionsoft/dbgit/core/DBGit.java b/src/main/java/ru/fusionsoft/dbgit/core/DBGit.java index 38944ce..945efb1 100644 --- a/src/main/java/ru/fusionsoft/dbgit/core/DBGit.java +++ b/src/main/java/ru/fusionsoft/dbgit/core/DBGit.java @@ -255,8 +255,7 @@ public void gitCheckout(String branch, String commit, boolean isNewBranch) throw checkout = checkout.setStartPoint(commit); else { if (git.branchList().setListMode(ListMode.REMOTE).call().stream() - .filter(ref -> ref.getName().equals("refs/remotes/origin/" + branch)) - .count() > 0) + .anyMatch(ref -> ref.getName().equals("refs/remotes/origin/" + branch))) checkout = checkout.setStartPoint("remotes/origin/" + branch); } diff --git a/src/main/java/ru/fusionsoft/dbgit/core/DBGitConfig.java b/src/main/java/ru/fusionsoft/dbgit/core/DBGitConfig.java index fa91a7f..a5f8a71 100644 --- a/src/main/java/ru/fusionsoft/dbgit/core/DBGitConfig.java +++ b/src/main/java/ru/fusionsoft/dbgit/core/DBGitConfig.java @@ -1,11 +1,10 @@ package ru.fusionsoft.dbgit.core; -import java.io.File; - import org.ini4j.Ini; - import ru.fusionsoft.dbgit.utils.ConsoleWriter; +import java.io.File; + public class DBGitConfig { private static DBGitConfig config = null; @@ -20,19 +19,20 @@ private DBGitConfig() throws Exception { ini = new Ini(file); } - String path = new File(DBGitConfig.class.getProtectionDomain().getCodeSource().getLocation() - .toURI()).getAbsolutePath(); + StringBuilder path = new StringBuilder(new File( + DBGitConfig.class.getProtectionDomain().getCodeSource().getLocation().toURI() + ).getAbsolutePath()); while (!new File(path + "/dbgitconfig").exists()) { - path += "/.."; + path.append("/.."); } if (new File(path + "/bin/dbgitconfig").exists()) - path = path + "/bin/dbgitconfig"; + path.append("/bin/dbgitconfig"); else - path = path + "/dbgitconfig"; + path.append("/dbgitconfig"); - File fileGlobal = new File(path); + File fileGlobal = new File(path.toString()); if (fileGlobal.exists()) iniGlobal = new Ini(fileGlobal); } diff --git a/src/main/java/ru/fusionsoft/dbgit/core/DBGitLang.java b/src/main/java/ru/fusionsoft/dbgit/core/DBGitLang.java index c329ed5..b89d2fb 100644 --- a/src/main/java/ru/fusionsoft/dbgit/core/DBGitLang.java +++ b/src/main/java/ru/fusionsoft/dbgit/core/DBGitLang.java @@ -14,11 +14,12 @@ public class DBGitLang { @SuppressWarnings("unchecked") private DBGitLang() { try { - String path = new File(DBGitLang.class.getProtectionDomain().getCodeSource().getLocation() - .toURI()).getAbsolutePath(); + StringBuilder path = new StringBuilder(new File( + DBGitLang.class.getProtectionDomain().getCodeSource().getLocation().toURI() + ).getAbsolutePath()); while (!new File(path + "/lang").exists()) - path += "/.."; + path.append("/.."); mapValue = (Map) new Yaml().load(new FileInputStream(new File(path + "/lang/" + diff --git a/src/main/java/ru/fusionsoft/dbgit/core/GitMetaDataManager.java b/src/main/java/ru/fusionsoft/dbgit/core/GitMetaDataManager.java index 085d9cc..2cada78 100644 --- a/src/main/java/ru/fusionsoft/dbgit/core/GitMetaDataManager.java +++ b/src/main/java/ru/fusionsoft/dbgit/core/GitMetaDataManager.java @@ -1,34 +1,17 @@ package ru.fusionsoft.dbgit.core; -import java.io.IOException; +import ru.fusionsoft.dbgit.adapters.AdapterFactory; +import ru.fusionsoft.dbgit.adapters.IDBAdapter; +import ru.fusionsoft.dbgit.dbobjects.*; +import ru.fusionsoft.dbgit.meta.*; +import ru.fusionsoft.dbgit.utils.ConsoleWriter; + import java.sql.SQLException; import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; -import ru.fusionsoft.dbgit.adapters.AdapterFactory; -import ru.fusionsoft.dbgit.adapters.IDBAdapter; -import ru.fusionsoft.dbgit.dbobjects.DBOptionsObject; -import ru.fusionsoft.dbgit.dbobjects.DBSQLObject; -import ru.fusionsoft.dbgit.dbobjects.DBSchema; -import ru.fusionsoft.dbgit.dbobjects.DBSequence; -import ru.fusionsoft.dbgit.dbobjects.DBTable; -import ru.fusionsoft.dbgit.meta.DBGitMetaType; -import ru.fusionsoft.dbgit.meta.IMapMetaObject; -import ru.fusionsoft.dbgit.meta.IMetaObject; -import ru.fusionsoft.dbgit.meta.MetaObjOptions; -import ru.fusionsoft.dbgit.meta.MetaObjectFactory; -import ru.fusionsoft.dbgit.meta.MetaSequence; -import ru.fusionsoft.dbgit.meta.MetaSql; -import ru.fusionsoft.dbgit.meta.MetaTable; -import ru.fusionsoft.dbgit.meta.MetaTableData; -import ru.fusionsoft.dbgit.meta.TreeMapMetaObject; -import ru.fusionsoft.dbgit.utils.ConsoleWriter; - /** *
Manager of meta description objects.
*
Менеджер объектов метаописания.
@@ -129,11 +112,11 @@ public boolean loadNextPortion(MetaTable tbl) throws ExceptionDBGit { ConsoleWriter.println(DBGitLang.getInstance().getValue("general", "add", "loading") + " " + currentPortionIndex, 2); currentPortion = new MetaTableData(tbl.getTable()); - if (currentPortion != null && currentPortion.getmapRows() != null) - currentPortion.getmapRows().clear(); + if (currentPortion != null && currentPortion.getMapRows() != null) + currentPortion.getMapRows().clear(); currentPortion.loadPortionFromDB(currentPortionIndex); - ConsoleWriter.println(DBGitLang.getInstance().getValue("general", "add", "size") + " " + currentPortion.getmapRows().size(), 2); + ConsoleWriter.println(DBGitLang.getInstance().getValue("general", "add", "size") + " " + currentPortion.getMapRows().size(), 2); currentPortionIndex++; try { @@ -142,7 +125,7 @@ public boolean loadNextPortion(MetaTable tbl) throws ExceptionDBGit { throw new ExceptionDBGit(e); } - return currentPortion.getmapRows().size() > 0 ? true : false; + return currentPortion.getMapRows().size() > 0; } public MetaTableData getCurrent() { diff --git a/src/main/java/ru/fusionsoft/dbgit/data_table/RowData.java b/src/main/java/ru/fusionsoft/dbgit/data_table/RowData.java index 3cf2155..74d8474 100644 --- a/src/main/java/ru/fusionsoft/dbgit/data_table/RowData.java +++ b/src/main/java/ru/fusionsoft/dbgit/data_table/RowData.java @@ -87,7 +87,7 @@ public String calcRowKey(List idColumns) throws Exception { if (idColumns.size() > 0) { StringBuilder keyBuilder = new StringBuilder(); for (String nmId : idColumns) { - keyBuilder.append(data.get(nmId).convertToString()+"_"); + keyBuilder.append(data.get(nmId).convertToString() + "_"); } return keyBuilder.toString(); } else { diff --git a/src/main/java/ru/fusionsoft/dbgit/meta/MetaObjectFactory.java b/src/main/java/ru/fusionsoft/dbgit/meta/MetaObjectFactory.java index f607fe7..d853b4b 100644 --- a/src/main/java/ru/fusionsoft/dbgit/meta/MetaObjectFactory.java +++ b/src/main/java/ru/fusionsoft/dbgit/meta/MetaObjectFactory.java @@ -58,7 +58,7 @@ public static NameMeta parseMetaName(String name) throws ExceptionDBGit { String tmp = name.substring(pos+1); String[] partName = tmp.split("\\."); nm.setName(partName[0]); - nm.setType(DBGitMetaType.valueByCode(partName[1])); + nm.setType(DBGitMetaType.valueByCode(partName[partName.length - 1])); return nm; } catch(Exception e) { diff --git a/src/main/java/ru/fusionsoft/dbgit/meta/MetaTableData.java b/src/main/java/ru/fusionsoft/dbgit/meta/MetaTableData.java index f9766d3..caaece0 100644 --- a/src/main/java/ru/fusionsoft/dbgit/meta/MetaTableData.java +++ b/src/main/java/ru/fusionsoft/dbgit/meta/MetaTableData.java @@ -67,7 +67,7 @@ public DBTable getTable() { return table; } - public TreeMap getmapRows() { + public TreeMap getMapRows() { return mapRows; } diff --git a/src/main/java/ru/fusionsoft/dbgit/oracle/DBAdapterOracle.java b/src/main/java/ru/fusionsoft/dbgit/oracle/DBAdapterOracle.java index 7cd0f05..777c3b7 100644 --- a/src/main/java/ru/fusionsoft/dbgit/oracle/DBAdapterOracle.java +++ b/src/main/java/ru/fusionsoft/dbgit/oracle/DBAdapterOracle.java @@ -1,1028 +1,1028 @@ -package ru.fusionsoft.dbgit.oracle; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; -import java.util.Set; - -import ru.fusionsoft.dbgit.adapters.DBAdapter; -import ru.fusionsoft.dbgit.adapters.IDBAdapter; -import ru.fusionsoft.dbgit.adapters.IDBAdapterRestoreMetaData; -import ru.fusionsoft.dbgit.adapters.IFactoryDBAdapterRestoteMetaData; -import ru.fusionsoft.dbgit.adapters.IFactoryDBBackupAdapter; -import ru.fusionsoft.dbgit.adapters.IFactoryDBConvertAdapter; -import ru.fusionsoft.dbgit.core.DBGitConfig; -import ru.fusionsoft.dbgit.core.DBGitLang; -import ru.fusionsoft.dbgit.core.ExceptionDBGit; -import ru.fusionsoft.dbgit.core.ExceptionDBGitRunTime; -import ru.fusionsoft.dbgit.core.db.DbType; -import ru.fusionsoft.dbgit.core.db.FieldType; -import ru.fusionsoft.dbgit.data_table.BooleanData; -import ru.fusionsoft.dbgit.data_table.DateData; -import ru.fusionsoft.dbgit.data_table.FactoryCellData; -import ru.fusionsoft.dbgit.data_table.LongData; -import ru.fusionsoft.dbgit.data_table.MapFileData; -import ru.fusionsoft.dbgit.data_table.StringData; -import ru.fusionsoft.dbgit.data_table.TextFileData; -import ru.fusionsoft.dbgit.dbobjects.DBConstraint; -import ru.fusionsoft.dbgit.dbobjects.DBFunction; -import ru.fusionsoft.dbgit.dbobjects.DBIndex; -import ru.fusionsoft.dbgit.dbobjects.DBPackage; -import ru.fusionsoft.dbgit.dbobjects.DBProcedure; -import ru.fusionsoft.dbgit.dbobjects.DBRole; -import ru.fusionsoft.dbgit.dbobjects.DBSchema; -import ru.fusionsoft.dbgit.dbobjects.DBSequence; -import ru.fusionsoft.dbgit.dbobjects.DBTable; -import ru.fusionsoft.dbgit.dbobjects.DBTableData; -import ru.fusionsoft.dbgit.dbobjects.DBTableField; -import ru.fusionsoft.dbgit.dbobjects.DBTableRow; -import ru.fusionsoft.dbgit.dbobjects.DBTableSpace; -import ru.fusionsoft.dbgit.dbobjects.DBTrigger; -import ru.fusionsoft.dbgit.dbobjects.DBUser; -import ru.fusionsoft.dbgit.dbobjects.DBView; -import ru.fusionsoft.dbgit.meta.IMapMetaObject; -import ru.fusionsoft.dbgit.meta.IMetaObject; -import ru.fusionsoft.dbgit.oracle.FactoryDBAdapterRestoreOracle; -import ru.fusionsoft.dbgit.statement.StatementLogging; -import ru.fusionsoft.dbgit.utils.ConsoleWriter; -import ru.fusionsoft.dbgit.utils.LoggerUtil; -import org.slf4j.Logger; - - -public class DBAdapterOracle extends DBAdapter { - private Logger logger = LoggerUtil.getLogger(this.getClass()); - private FactoryDBAdapterRestoreOracle restoreFactory = new FactoryDBAdapterRestoreOracle(); - private FactoryDbConvertAdapterOracle convertFactory = new FactoryDbConvertAdapterOracle(); - private FactoryDBBackupAdapterOracle backupFactory = new FactoryDBBackupAdapterOracle(); - - private String s; - - @Override - public IFactoryDBAdapterRestoteMetaData getFactoryRestore() { - return restoreFactory; - } - - @Override - public void startUpdateDB() { - // TODO Auto-generated method stub - - } - - @Override - public void endUpdateDB() { - // TODO Auto-generated method stub - - } - - @Override - public IMapMetaObject loadCustomMetaObjects() { - return null; - } - - @Override - public Map getSchemes() { - Map listScheme = new HashMap(); - try { - String query = "SELECT DISTINCT OWNER\n" + - "FROM DBA_OBJECTS WHERE OWNER != 'PUBLIC' AND OWNER != 'SYSTEM'\n" + - "AND OWNER != 'SYS' AND OWNER != 'APPQOSSYS' AND OWNER != 'OUTLN' \n" + - "AND OWNER != 'DIP' AND OWNER != 'DBSNMP' AND OWNER != 'ORACLE_OCM'\n" + - "ORDER BY OWNER"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("OWNER"); - DBSchema scheme = new DBSchema(name); - rowToProperties(rs, scheme.getOptions()); - listScheme.put(name, scheme); - } - stmt.close(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "schemes").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "schemes").toString(), e); - } - - return listScheme; - } - - @Override - public Map getTableSpaces() { - Map listTableSpace = new HashMap(); - try { - String query = "SELECT owner,\n" + - " segment_name,\n" + - " partition_name,\n" + - " segment_type,\n" + - " bytes \n" + - " FROM dba_segments \n" + - " WHERE OWNER != 'PUBLIC' AND OWNER != 'SYSTEM'\n" + - "AND OWNER != 'SYS' AND OWNER != 'APPQOSSYS' AND OWNER != 'OUTLN' \n" + - "AND OWNER != 'DIP' AND OWNER != 'DBSNMP' AND OWNER != 'ORACLE_OCM' and segment_name not like 'SYS%'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("segment_name"); - DBTableSpace dbTableSpace = new DBTableSpace(name); - rowToProperties(rs, dbTableSpace.getOptions()); - listTableSpace.put(name, dbTableSpace); - } - stmt.close(); - }catch(Exception e) { - logger.error(e.getMessage()); - throw new ExceptionDBGitRunTime(e.getMessage()); - } - return listTableSpace; - } - - @Override - public Map getSequences(String schema) { - Map listSequence = new HashMap(); - try { - Connection connect = getConnection(); - //variant 1 from DBA_OBJECTS - /*String query = - "SELECT ROWNUM AS NUM, OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_TYPE, STATUS,\n" + - "(select dbms_metadata.get_ddl('SEQUENCE', O.OBJECT_NAME) AS DDL from dual) AS DDL\n" + - "FROM DBA_OBJECTS O WHERE OBJECT_TYPE = 'SEQUENCE' AND OWNER = :schema";*/ - - //variant 2 from DBA_SEQUENCES - String query = - "SELECT S.SEQUENCE_NAME, (SELECT dbms_metadata.get_ddl('SEQUENCE', S.SEQUENCE_NAME, S.SEQUENCE_OWNER) from dual) AS DDL,\n" + - "order_flag, increment_by, last_number, min_value, max_value, cache_size \n" + - "FROM DBA_SEQUENCES S WHERE S.SEQUENCE_OWNER = '" + schema + "'"; - - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - while(rs.next()){ - String nameSeq = rs.getString("SEQUENCE_NAME"); - DBSequence sequence = new DBSequence(); - sequence.setName(nameSeq); - sequence.setSchema(schema); - sequence.setValue(0L); - rowToProperties(rs, sequence.getOptions()); - listSequence.put(nameSeq, sequence); - } - stmt.close(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "sequences").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "sequences").toString(), e); - } - return listSequence; - } - - @Override - public DBSequence getSequence(String schema, String name) { - try { - Connection connect = getConnection(); - String query = - "SELECT S.SEQUENCE_NAME, (SELECT dbms_metadata.get_ddl('SEQUENCE', S.SEQUENCE_NAME, S.SEQUENCE_OWNER) from dual) AS DDL, \n" + - "order_flag, increment_by, last_number, min_value, max_value, cache_size \n" + - "FROM DBA_SEQUENCES S WHERE S.SEQUENCE_OWNER = '" + schema + "' AND S.SEQUENCE_NAME = '" + name + "'"; - - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - DBSequence sequence = null; - while (rs.next()) { - String nameSeq = rs.getString("SEQUENCE_NAME"); - sequence = new DBSequence(); - sequence.setName(nameSeq); - sequence.setSchema(schema); - sequence.setValue(0L); - rowToProperties(rs, sequence.getOptions()); - } - stmt.close(); - return sequence; - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "sequences").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "sequences").toString(), e); - } - } - - @Override - public Map getTables(String schema) { - Map listTable = new HashMap(); - try { - String query = "SELECT T.TABLE_NAME, T.OWNER, (SELECT dbms_metadata.get_ddl('TABLE', T.TABLE_NAME, T.OWNER) from dual) AS DDL\n" + - "FROM DBA_TABLES T WHERE upper(OWNER) = upper('" + schema + "') and nested = 'NO' and (iot_type <> 'IOT_OVERFLOW' or iot_type is null)"; - Connection connect = getConnection(); - - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - while(rs.next()){ - String nameTable = rs.getString("TABLE_NAME"); - DBTable table = new DBTable(nameTable); - table.setSchema(schema); - rowToProperties(rs, table.getOptions()); - listTable.put(nameTable, table); - } - stmt.close(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); - } - return listTable; - } - - @Override - public DBTable getTable(String schema, String name) { - try { - String query = "SELECT T.TABLE_NAME, T.OWNER, (SELECT dbms_metadata.get_ddl('TABLE', T.TABLE_NAME, T.OWNER) from dual) AS DDL\n" + - "FROM DBA_TABLES T WHERE upper(T.OWNER) = upper('" + schema + "') AND upper(T.TABLE_NAME) = upper('" + name + "')"; - Connection connect = getConnection(); - - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - DBTable table = null; - - while(rs.next()) { - String nameTable = rs.getString("TABLE_NAME"); - table = new DBTable(nameTable); - table.setSchema(schema); - rowToProperties(rs, table.getOptions()); - } - - stmt.close(); - return table; - - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); - } - } - - @Override - public Map getTableFields(String schema, String nameTable) { - try { - Map listField = new HashMap(); - - String query1 = - "SELECT column_name FROM all_constraints cons, all_cons_columns cols\n"+ - "WHERE upper(cols.table_name) = upper('" + nameTable + "')\n"+ - "AND cons.constraint_type = 'P'\n" + - "AND cons.constraint_name = cols.constraint_name\n" + - "AND cons.owner = cols.owner"; - Connection connect = getConnection(); - - Statement stmt = connect.createStatement(); - ResultSet rs1 = stmt.executeQuery(query1); - - String s = ""; - - while (rs1.next()) - s = rs1.getString("COLUMN_NAME").toLowerCase(); - - String query = - "SELECT case \r\n" + - " when lower(data_type) in ('number', 'numeric', 'dec', 'decimal', 'pls_integer') then 'number'\r\n" + - " when lower(data_type) in ('varchar2', 'varchar', 'char', 'nchar', 'nvarchar2') then 'string'\r\n" + - " when substr(lower(data_type), 1, instr(data_type, '(') - 1) in ('date', 'timestamp') then 'date'\r\n" + - " when lower(data_type) in ('date', 'timestamp') then 'date'\r\n" + - " when lower(data_type) in ('clob') then 'text'\r\n" + - " when lower(data_type) in ('blob') then 'binary'" + - " else 'native'\r\n" + - " end type, " + - " case when lower(data_type) in ('char', 'nchar') then 1 else 0 end fixed, " + - " ROWNUM AS NUM, TC.* FROM DBA_TAB_COLS TC \n" + - "WHERE lower(table_name) = lower('" + nameTable + "') AND lower(OWNER) = lower('" + schema + "') ORDER BY column_id"; - - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - DBTableField field = new DBTableField(); - field.setName(rs.getString("COLUMN_NAME").toLowerCase()); - if (rs.getString("COLUMN_NAME").toLowerCase().equals(s)) { - field.setIsPrimaryKey(true); - } - String typeSQL = getFieldType(rs); - field.setTypeSQL(typeSQL); - field.setIsNullable( !typeSQL.toLowerCase().contains("not null")); - field.setTypeUniversal(FieldType.fromString(rs.getString("TYPE"))); - field.setLength(rs.getInt("DATA_LENGTH")); - field.setScale(rs.getInt("DATA_SCALE")); - field.setPrecision(rs.getInt("DATA_PRECISION")); - field.setFixed(rs.getBoolean("fixed")); - field.setOrder(rs.getInt("column_id")); - listField.put(field.getName(), field); - } - - stmt.close(); - - return listField; - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); - } - } - - protected String getFieldType(ResultSet rs) { - try { - StringBuilder type = new StringBuilder(); - type.append(rs.getString("DATA_TYPE")); - - Integer max_length = rs.getInt("CHAR_LENGTH"); - if (!rs.wasNull() && !rs.getString("DATA_TYPE").contains("(")) { - type.append("("+max_length.toString()+")"); - } - - if (rs.getString("NULLABLE").equals("N")){ - type.append(" NOT NULL"); - } - - return type.toString(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); - } - } - - @Override - public Map getIndexes(String schema, String nameTable) { - Map indexes = new HashMap<>(); - try { - String query = "SELECT ind.index_name, (select dbms_metadata.get_ddl('INDEX', ind.INDEX_NAME, owner) AS DDL from dual) AS DDL\n" + - "FROM all_indexes ind\n" + - "WHERE upper(table_name) = upper('" + nameTable + "') AND upper(owner) = upper('" + schema + "')"; - - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - while(rs.next()){ - DBIndex index = new DBIndex(); - index.setName(rs.getString("INDEX_NAME")); - index.setSchema(schema); - rowToProperties(rs, index.getOptions()); - indexes.put(index.getName(), index); - } - stmt.close(); - - return indexes; - - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "indexes").toString()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "indexes").toString(), e); - } - } - - @Override - public Map getConstraints(String schema, String nameTable) { - Map constraints = new HashMap<>(); - try { - String query = "SELECT cons.constraint_type, cons.CONSTRAINT_NAME, (select dbms_metadata.get_ddl('CONSTRAINT', cons.constraint_name, owner) AS DDL from dual) AS DDL\n" + - "FROM all_constraints cons\n" + - "WHERE upper(owner) = upper('" + schema + "') and upper(table_name) = upper('" + nameTable + "') and constraint_name not like 'SYS%' and cons.constraint_type = 'P'"; - - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - while(rs.next()){ - DBConstraint con = new DBConstraint(); - con.setName(rs.getString("CONSTRAINT_NAME")); - //This is DDL? - con.setConstraintType(rs.getString("CONSTRAINT_TYPE")); - con.setSchema(schema); - rowToProperties(rs, con.getOptions()); - constraints.put(con.getName(), con); - } - stmt.close(); - - return constraints; - - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "constraints").toString()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "constraints").toString(), e); - } - } - - @Override - public Map getViews(String schema) { - Map listView = new HashMap(); - try { - String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('VIEW', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + - "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'VIEW'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - DBView view = new DBView(rs.getString("OBJECT_NAME")); - view.setSchema(rs.getString("OWNER")); - view.setOwner(rs.getString("OWNER")); - rowToProperties(rs, view.getOptions()); - listView.put(rs.getString("OBJECT_NAME"), view); - } - stmt.close(); - return listView; - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views") + ": " + e.getMessage()); - } - } - - @Override - public DBView getView(String schema, String name) { - DBView view = new DBView(name); - view.setSchema(schema); - try { - String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('VIEW', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + - "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'VIEW' and f.object_name = '" + name + "'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - view.setOwner(schema); - - while (rs.next()) { - view.setOwner(rs.getString("OWNER")); - rowToProperties(rs, view.getOptions()); - } - stmt.close(); - return view; - - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "views").toString() + ": "+ e.getMessage()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views").toString() + ": "+ e.getMessage()); - } - } - - public Map getTriggers(String schema) { - Map listTrigger = new HashMap(); - try { - String query = "SELECT tr.owner, tr.trigger_name, tr.trigger_type, tr.table_name," + - " (select dbms_metadata.get_ddl('TRIGGER', tr.trigger_name, tr.owner) AS DDL from dual) AS DDL\n" + - "FROM all_triggers tr\n" + - "WHERE owner = '"+ schema +"'"; - - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("TRIGGER_NAME"); - String sql = rs.getString("DDL"); - DBTrigger trigger = new DBTrigger(name); - trigger.setSchema(schema); - //what means owner? oracle/postgres or owner like database user/schema - trigger.setOwner("oracle"); - rowToProperties(rs, trigger.getOptions()); - listTrigger.put(name, trigger); - } - stmt.close(); - return listTrigger; - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "triggers").toString(), e); - } - } - - public DBTrigger getTrigger(String schema, String name) { - DBTrigger trigger = null; - try { - String query = "SELECT tr.owner, tr.trigger_name, tr.trigger_type, tr.table_name, (select dbms_metadata.get_ddl('TRIGGER', tr.trigger_name, tr.owner) AS DDL from dual) AS DDL\n" + - "FROM all_triggers tr\n" + - "WHERE owner = '" + schema + "' and trigger_name = '" + name + "'"; - - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - while(rs.next()){ - trigger = new DBTrigger(name); - trigger.setSchema(schema); - //what means owner? oracle/postgres or owner like database user/schema - trigger.setOwner("oracle"); - rowToProperties(rs, trigger.getOptions()); - } - stmt.close(); - return trigger; - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "triggers").toString(), e); - } - } - - @Override - public Map getPackages(String schema) { - Map listPackage = new HashMap(); - try { - String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('PACKAGE', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + - "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'PACKAGE'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("OBJECT_NAME"); - String owner = rs.getString("OWNER"); - //String args = rs.getString("arguments"); - DBPackage pack = new DBPackage(name); - pack.setSchema(schema); - pack.setOwner(owner); - rowToProperties(rs,pack.getOptions()); - //pack.setArguments(args); - listPackage.put(name, pack); - } - stmt.close(); - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "pkg").toString(), e); - } - return listPackage; - } - - @Override - public DBPackage getPackage(String schema, String name) { - try { - String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('PACKAGE', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + - "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'PACKAGE' and f.object_name = '" + name + "'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - DBPackage pack = null; - while (rs.next()) { - pack = new DBPackage(name); - String owner = rs.getString("OWNER"); - //String args = rs.getString("arguments"); - pack.setSchema(schema); - pack.setOwner(owner); - //pack.setArguments(args); - rowToProperties(rs,pack.getOptions()); - } - stmt.close(); - - return pack; - - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views").toString(), e); - } - } - - @Override - public Map getProcedures(String schema) { - Map listProcedure = new HashMap(); - try { - String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('PROCEDURE', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + - "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'PROCEDURE'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("OBJECT_NAME"); - String owner = rs.getString("OWNER"); - //String args = rs.getString("arguments"); - DBProcedure proc = new DBProcedure(name); - proc.setSchema(schema); - proc.setOwner(owner); - proc.setName(name); - rowToProperties(rs,proc.getOptions()); - //proc.setArguments(args); - listProcedure.put(name, proc); - } - stmt.close(); - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "prc").toString(), e); - } - return listProcedure; - } - - @Override - public DBProcedure getProcedure(String schema, String name) { - try { - String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('PROCEDURE', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + - "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'PROCEDURE' and f.object_name = '" + name + "'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - DBProcedure proc = null; - - while (rs.next()) { - proc = new DBProcedure(rs.getString("OBJECT_NAME")); - String owner = rs.getString("OWNER"); - //String args = rs.getString("arguments"); - proc.setSchema(schema); - proc.setOwner(owner); - //proc.setArguments(args); - rowToProperties(rs,proc.getOptions()); - } - stmt.close(); - - return proc; - - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "prc").toString(), e); - } - } - - @Override - public Map getFunctions(String schema) { - Map listFunction = new HashMap(); - try { - String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('FUNCTION', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + - "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'FUNCTION'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("OBJECT_NAME"); - String sql = rs.getString("DDL"); - String owner = rs.getString("OWNER"); - //String args = rs.getString("arguments"); - DBFunction func = new DBFunction(name); - func.setSchema(schema); - func.setOwner(owner); - rowToProperties(rs,func.getOptions()); - //func.setArguments(args); - listFunction.put(name, func); - } - stmt.close(); - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "fnc").toString(), e); - } - return listFunction; - } - - @Override - public DBFunction getFunction(String schema, String name) { - try { - String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('FUNCTION', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + - "FROM all_objects f WHERE f.owner = '" + schema +"' and " + - "f.object_type = 'FUNCTION' and f.object_name = '" + name +"'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - DBFunction func = null; - - while (rs.next()) { - func = new DBFunction(rs.getString("OBJECT_NAME")); - String owner = rs.getString("OWNER"); - //String args = rs.getString("arguments"); - func.setSchema(schema); - func.setOwner(owner); - //func.setArguments(args); - rowToProperties(rs,func.getOptions()); - } - stmt.close(); - - return func; - - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "fnc").toString(), e); - } - } - - @Override - public DBTableData getTableDataPortion(String schema, String nameTable, int portionIndex, int tryNumber) { - DBTableData data = new DBTableData(); - - try { - int portionSize = DBGitConfig.getInstance().getInteger("core", "PORTION_SIZE", DBGitConfig.getInstance().getIntegerGlobal("core", "PORTION_SIZE", 1000)); - - int begin = 1 + portionSize*portionIndex; - int end = portionSize + portionSize*portionIndex; - - Statement st = getConnection().createStatement(); - ResultSet rs = st.executeQuery(" SELECT * FROM \r\n" + - " (SELECT f.*, ROW_NUMBER() OVER (ORDER BY rowid) DBGIT_ROW_NUM FROM " + schema + "." + nameTable + " f)\r\n" + - " WHERE DBGIT_ROW_NUM BETWEEN " + begin + " and " + end); - data.setResultSet(rs); - return data; - } catch(Exception e) { - ConsoleWriter.println("Connection lost!"); - logger.error(lang.getValue("errors", "adapter", "tableData").toString(), e); - - try { - if (tryNumber <= DBGitConfig.getInstance().getInteger("core", "TRY_COUNT", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_COUNT", 1000))) { - try { - TimeUnit.SECONDS.sleep(DBGitConfig.getInstance().getInteger("core", "TRY_DELAY", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_DELAY", 1000))); - } catch (InterruptedException e1) { - throw new ExceptionDBGitRunTime(e1.getMessage()); - } - ConsoleWriter.println("Error while getting portion of data, try " + tryNumber); - return getTableDataPortion(schema, nameTable, portionIndex, tryNumber++); - } - } catch (Exception e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - - try { - getConnection().rollback(); - } catch (Exception e2) { - logger.error(lang.getValue("errors", "adapter", "rollback").toString(), e2); - } - throw new ExceptionDBGitRunTime(e.getMessage()); - } - } - - @Override - public DBTableData getTableData(String schema, String nameTable) { - String tableName = schema + "." + nameTable; - try { - DBTableData data = new DBTableData(); - - int maxRowsCount = DBGitConfig.getInstance().getInteger("core", "MAX_ROW_COUNT_FETCH", DBGitConfig.getInstance().getIntegerGlobal("core", "MAX_ROW_COUNT_FETCH", MAX_ROW_COUNT_FETCH)); - - if (DBGitConfig.getInstance().getBoolean("core", "LIMIT_FETCH", DBGitConfig.getInstance().getBooleanGlobal("core", "LIMIT_FETCH", true))) { - Statement st = getConnection().createStatement(); - String query = "select COALESCE(count(*), 0) row_count from ( select 1 from "+ - tableName+" where ROWNUM <= " + (maxRowsCount + 1) + " ) tbl"; - ResultSet rs = st.executeQuery(query); - rs.next(); - if (rs.getInt("row_count") > maxRowsCount) { - data.setErrorFlag(DBTableData.ERROR_LIMIT_ROWS); - return data; - } - } - Statement st = getConnection().createStatement(); - ResultSet rs = st.executeQuery("select * from "+tableName); - data.setResultSet(rs); - return data; - - } catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tableData").toString(), e); - try { - getConnection().rollback(); - } catch (Exception e2) { - logger.error(lang.getValue("errors", "adapter", "rollback").toString(), e2); - } - throw new ExceptionDBGitRunTime(e.getMessage()); - } - } -/* - @Override - public DBTableRow getTableRow(String schema, String nameTable, Object id) { - // TODO Auto-generated method stub - return null; - } -*/ - @Override - public Map getUsers() { - Map listUser = new HashMap(); - try { - String query = "SELECT USERNAME FROM DBA_USERS WHERE USERNAME != 'PUBLIC' AND USERNAME != 'SYSTEM'\n" + - "AND USERNAME != 'SYS' AND USERNAME != 'APPQOSSYS' AND USERNAME != 'OUTLN' \n" + - "AND USERNAME != 'DIP' AND USERNAME != 'DBSNMP' AND USERNAME != 'ORACLE_OCM' ORDER BY USERNAME"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString(1); - DBUser user = new DBUser(name); - listUser.put(name, user); - } - stmt.close(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "users") + ": " +e.getMessage()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "users") + ": " + e.getMessage()); - } - return listUser; - } - - @Override - public Map getRoles() { - Map listRole = new HashMap(); - try { - String query = "SELECT R.GRANTEE, \n" + - "R.GRANTED_ROLE, R.ADMIN_OPTION, R.DEFAULT_ROLE FROM DBA_ROLE_PRIVS R \n" + - "WHERE R.GRANTEE = (SELECT USERNAME FROM DBA_USERS WHERE USERNAME = R.GRANTEE AND\n" + - "USERNAME != 'PUBLIC' AND USERNAME != 'SYSTEM'\n" + - "AND USERNAME != 'SYS' AND USERNAME != 'APPQOSSYS' AND USERNAME != 'OUTLN' \n" + - "AND USERNAME != 'DIP' AND USERNAME != 'DBSNMP' AND USERNAME != 'ORACLE_OCM')"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("GRANTED_ROLE"); - DBRole role = new DBRole(name); - rowToProperties(rs, role.getOptions()); - listRole.put(name, role); - } - stmt.close(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "roles") + ": " + e.getMessage()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "roles") + ": " + e.getMessage()); - } - return listRole; - } - - @Override - public boolean userHasRightsToGetDdlOfOtherUsers() { - try { - String userName = getConnection().getSchema(); - - if (userName.equalsIgnoreCase("SYS")) - return true; - - PreparedStatement stmt = getConnection().prepareStatement - ("SELECT count(1) cnt FROM DBA_ROLE_PRIVS WHERE GRANTEE = ? and GRANTED_ROLE = 'SELECT_CATALOG_ROLE'"); - stmt.setString(1, userName); - ResultSet resultSet = stmt.executeQuery(); - resultSet.next(); - - if (resultSet.getInt(1) == 0) { - return false; - } else { - return true; - } - } catch (SQLException e) { - logger.error(e.getMessage()); - return false; - } - } - - @Override - public IFactoryDBBackupAdapter getBackupAdapterFactory() { - return backupFactory; - } - - @Override - public DbType getDbType() { - return DbType.ORACLE; - } - - @Override - public String getDbVersion() { - try { - PreparedStatement stmt = getConnection().prepareStatement("SELECT version FROM V$INSTANCE"); - ResultSet resultSet = stmt.executeQuery(); - resultSet.next(); - - String result = resultSet.getString("version"); - resultSet.close(); - stmt.close(); - - return result; - } catch (SQLException e) { - return ""; - } - } - - @Override - public void createSchemaIfNeed(String schemaName) throws ExceptionDBGit { - try { - Statement st = connect.createStatement(); - ResultSet rs = st.executeQuery("select count(*) cnt from all_users where USERNAME = '" + schemaName.toUpperCase() + "'"); - rs.next(); - if (rs.getInt("cnt") == 0) { - StatementLogging stLog = new StatementLogging(connect, getStreamOutputSqlCommand(), isExecSql()); - stLog.execute("create USER \"" + schemaName.toUpperCase() + "\"\r\n" + - "IDENTIFIED BY \"" + schemaName.toUpperCase() + "\"\r\n" + - "DEFAULT TABLESPACE \"SYSTEM\"\r\n" + - "TEMPORARY TABLESPACE \"TEMP\"\r\n" + - "ACCOUNT UNLOCK"); - - stLog.execute("ALTER USER \"" + schemaName.toUpperCase() + "\" QUOTA UNLIMITED ON SYSTEM"); - stLog.close(); - } - - rs.close(); - st.close(); - } catch (SQLException e) { - throw new ExceptionDBGit(lang.getValue("errors", "adapter", "createSchema") + ": " + e.getLocalizedMessage()); - } - - } - - @Override - public boolean isReservedWord(String word) { - Set reservedWords = new HashSet<>(); - - reservedWords.add("ACCESS"); - reservedWords.add("ADD"); - reservedWords.add("ALL"); - reservedWords.add("ALTER"); - reservedWords.add("AND"); - reservedWords.add("ANY"); - reservedWords.add("AS"); - reservedWords.add("ASC"); - reservedWords.add("AUDIT"); - reservedWords.add("BETWEEN"); - reservedWords.add("BY"); - reservedWords.add("CHAR"); - reservedWords.add("CHECK"); - reservedWords.add("CLUSTER"); - reservedWords.add("COLUMN"); - reservedWords.add("COMMENT"); - reservedWords.add("COMPRESS"); - reservedWords.add("CONNECT"); - reservedWords.add("CREATE"); - reservedWords.add("CURRENT"); - reservedWords.add("DATE"); - reservedWords.add("DECIMAL"); - reservedWords.add("DEFAULT"); - reservedWords.add("DELETE"); - reservedWords.add("DESC"); - reservedWords.add("DISTINCT"); - reservedWords.add("DROP"); - reservedWords.add("ELSE"); - reservedWords.add("EXCLUSIVE"); - reservedWords.add("EXISTS"); - reservedWords.add("FILE"); - reservedWords.add("FLOAT"); - reservedWords.add("FOR"); - reservedWords.add("FROM"); - reservedWords.add("GRANT"); - reservedWords.add("GROUP"); - reservedWords.add("HAVING"); - reservedWords.add("IDENTIFIED"); - reservedWords.add("IMMEDIATE"); - reservedWords.add("IN"); - reservedWords.add("INCREMENT"); - reservedWords.add("INDEX"); - reservedWords.add("INITIAL"); - reservedWords.add("INSERT"); - reservedWords.add("INTEGER"); - reservedWords.add("INTERSECT"); - reservedWords.add("INTO"); - reservedWords.add("IS"); - reservedWords.add("LEVEL"); - reservedWords.add("LIKE"); - reservedWords.add("LOCK"); - reservedWords.add("LONG"); - reservedWords.add("MAXEXTENTS"); - reservedWords.add("MINUS"); - reservedWords.add("MLSLABEL"); - reservedWords.add("MODE"); - reservedWords.add("MODIFY"); - reservedWords.add("NOAUDIT"); - reservedWords.add("NOCOMPRESS"); - reservedWords.add("NOT"); - reservedWords.add("NOWAIT"); - reservedWords.add("NULL"); - reservedWords.add("NUMBER"); - reservedWords.add("OF"); - reservedWords.add("OFFLINE"); - reservedWords.add("ON"); - reservedWords.add("ONLINE"); - reservedWords.add("OPTION"); - reservedWords.add("OR"); - reservedWords.add("ORDER"); - reservedWords.add("PCTFREE"); - reservedWords.add("PRIOR"); - reservedWords.add("PRIVILEGES"); - reservedWords.add("PUBLIC"); - reservedWords.add("RAW"); - reservedWords.add("RENAME"); - reservedWords.add("RESOURCE"); - reservedWords.add("REVOKE"); - reservedWords.add("ROW"); - reservedWords.add("ROWID"); - reservedWords.add("ROWNUM"); - reservedWords.add("ROWS"); - reservedWords.add("SELECT"); - reservedWords.add("SESSION"); - reservedWords.add("SET"); - reservedWords.add("SHARE"); - reservedWords.add("SIZE"); - reservedWords.add("SMALLINT"); - reservedWords.add("START"); - reservedWords.add("SUCCESSFUL"); - reservedWords.add("SYNONYM"); - reservedWords.add("SYSDATE"); - reservedWords.add("TABLE"); - reservedWords.add("THEN"); - reservedWords.add("TO"); - reservedWords.add("TRIGGER"); - reservedWords.add("UID"); - reservedWords.add("UNION"); - reservedWords.add("UNIQUE"); - reservedWords.add("UPDATE"); - reservedWords.add("USER"); - reservedWords.add("VALIDATE"); - reservedWords.add("VALUES"); - reservedWords.add("VARCHAR"); - reservedWords.add("VARCHAR2"); - reservedWords.add("VIEW"); - reservedWords.add("WHENEVER"); - reservedWords.add("WHERE"); - reservedWords.add("WITH"); - - return reservedWords.contains(word.toUpperCase()); - } - - @Override - public IFactoryDBConvertAdapter getConvertAdapterFactory() { - return convertFactory; - } - - - @Override - public void createRoleIfNeed(String roleName) throws ExceptionDBGit { - - } - - @Override - public String getDefaultScheme() throws ExceptionDBGit { - try { - return getConnection().getSchema(); - } catch (SQLException e) { - throw new ExceptionDBGit(lang.getValue("errors", "adapter", "getSchema") + ": " + e.getLocalizedMessage()); - } - } -} +package ru.fusionsoft.dbgit.oracle; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; +import java.util.Set; + +import ru.fusionsoft.dbgit.adapters.DBAdapter; +import ru.fusionsoft.dbgit.adapters.IDBAdapter; +import ru.fusionsoft.dbgit.adapters.IDBAdapterRestoreMetaData; +import ru.fusionsoft.dbgit.adapters.IFactoryDBAdapterRestoteMetaData; +import ru.fusionsoft.dbgit.adapters.IFactoryDBBackupAdapter; +import ru.fusionsoft.dbgit.adapters.IFactoryDBConvertAdapter; +import ru.fusionsoft.dbgit.core.DBGitConfig; +import ru.fusionsoft.dbgit.core.DBGitLang; +import ru.fusionsoft.dbgit.core.ExceptionDBGit; +import ru.fusionsoft.dbgit.core.ExceptionDBGitRunTime; +import ru.fusionsoft.dbgit.core.db.DbType; +import ru.fusionsoft.dbgit.core.db.FieldType; +import ru.fusionsoft.dbgit.data_table.BooleanData; +import ru.fusionsoft.dbgit.data_table.DateData; +import ru.fusionsoft.dbgit.data_table.FactoryCellData; +import ru.fusionsoft.dbgit.data_table.LongData; +import ru.fusionsoft.dbgit.data_table.MapFileData; +import ru.fusionsoft.dbgit.data_table.StringData; +import ru.fusionsoft.dbgit.data_table.TextFileData; +import ru.fusionsoft.dbgit.dbobjects.DBConstraint; +import ru.fusionsoft.dbgit.dbobjects.DBFunction; +import ru.fusionsoft.dbgit.dbobjects.DBIndex; +import ru.fusionsoft.dbgit.dbobjects.DBPackage; +import ru.fusionsoft.dbgit.dbobjects.DBProcedure; +import ru.fusionsoft.dbgit.dbobjects.DBRole; +import ru.fusionsoft.dbgit.dbobjects.DBSchema; +import ru.fusionsoft.dbgit.dbobjects.DBSequence; +import ru.fusionsoft.dbgit.dbobjects.DBTable; +import ru.fusionsoft.dbgit.dbobjects.DBTableData; +import ru.fusionsoft.dbgit.dbobjects.DBTableField; +import ru.fusionsoft.dbgit.dbobjects.DBTableRow; +import ru.fusionsoft.dbgit.dbobjects.DBTableSpace; +import ru.fusionsoft.dbgit.dbobjects.DBTrigger; +import ru.fusionsoft.dbgit.dbobjects.DBUser; +import ru.fusionsoft.dbgit.dbobjects.DBView; +import ru.fusionsoft.dbgit.meta.IMapMetaObject; +import ru.fusionsoft.dbgit.meta.IMetaObject; +import ru.fusionsoft.dbgit.oracle.FactoryDBAdapterRestoreOracle; +import ru.fusionsoft.dbgit.statement.StatementLogging; +import ru.fusionsoft.dbgit.utils.ConsoleWriter; +import ru.fusionsoft.dbgit.utils.LoggerUtil; +import org.slf4j.Logger; + + +public class DBAdapterOracle extends DBAdapter { + private Logger logger = LoggerUtil.getLogger(this.getClass()); + private FactoryDBAdapterRestoreOracle restoreFactory = new FactoryDBAdapterRestoreOracle(); + private FactoryDbConvertAdapterOracle convertFactory = new FactoryDbConvertAdapterOracle(); + private FactoryDBBackupAdapterOracle backupFactory = new FactoryDBBackupAdapterOracle(); + + private String s; + + @Override + public IFactoryDBAdapterRestoteMetaData getFactoryRestore() { + return restoreFactory; + } + + @Override + public void startUpdateDB() { + // TODO Auto-generated method stub + + } + + @Override + public void endUpdateDB() { + // TODO Auto-generated method stub + + } + + @Override + public IMapMetaObject loadCustomMetaObjects() { + return null; + } + + @Override + public Map getSchemes() { + Map listScheme = new HashMap(); + try { + String query = "SELECT DISTINCT OWNER\n" + + "FROM DBA_OBJECTS WHERE OWNER != 'PUBLIC' AND OWNER != 'SYSTEM'\n" + + "AND OWNER != 'SYS' AND OWNER != 'APPQOSSYS' AND OWNER != 'OUTLN' \n" + + "AND OWNER != 'DIP' AND OWNER != 'DBSNMP' AND OWNER != 'ORACLE_OCM'\n" + + "ORDER BY OWNER"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("OWNER"); + DBSchema scheme = new DBSchema(name); + rowToProperties(rs, scheme.getOptions()); + listScheme.put(name, scheme); + } + stmt.close(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "schemes").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "schemes").toString(), e); + } + + return listScheme; + } + + @Override + public Map getTableSpaces() { + Map listTableSpace = new HashMap(); + try { + String query = "SELECT owner,\n" + + " segment_name,\n" + + " partition_name,\n" + + " segment_type,\n" + + " bytes \n" + + " FROM dba_segments \n" + + " WHERE OWNER != 'PUBLIC' AND OWNER != 'SYSTEM'\n" + + "AND OWNER != 'SYS' AND OWNER != 'APPQOSSYS' AND OWNER != 'OUTLN' \n" + + "AND OWNER != 'DIP' AND OWNER != 'DBSNMP' AND OWNER != 'ORACLE_OCM' and segment_name not like 'SYS%'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("segment_name"); + DBTableSpace dbTableSpace = new DBTableSpace(name); + rowToProperties(rs, dbTableSpace.getOptions()); + listTableSpace.put(name, dbTableSpace); + } + stmt.close(); + }catch(Exception e) { + logger.error(e.getMessage()); + throw new ExceptionDBGitRunTime(e.getMessage()); + } + return listTableSpace; + } + + @Override + public Map getSequences(String schema) { + Map listSequence = new HashMap(); + try { + Connection connect = getConnection(); + //variant 1 from DBA_OBJECTS + /*String query = + "SELECT ROWNUM AS NUM, OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_TYPE, STATUS,\n" + + "(select dbms_metadata.get_ddl('SEQUENCE', O.OBJECT_NAME) AS DDL from dual) AS DDL\n" + + "FROM DBA_OBJECTS O WHERE OBJECT_TYPE = 'SEQUENCE' AND OWNER = :schema";*/ + + //variant 2 from DBA_SEQUENCES + String query = + "SELECT S.SEQUENCE_NAME, (SELECT dbms_metadata.get_ddl('SEQUENCE', S.SEQUENCE_NAME, S.SEQUENCE_OWNER) from dual) AS DDL,\n" + + "order_flag, increment_by, last_number, min_value, max_value, cache_size \n" + + "FROM DBA_SEQUENCES S WHERE S.SEQUENCE_OWNER = '" + schema + "'"; + + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + while(rs.next()){ + String nameSeq = rs.getString("SEQUENCE_NAME"); + DBSequence sequence = new DBSequence(); + sequence.setName(nameSeq); + sequence.setSchema(schema); + sequence.setValue(0L); + rowToProperties(rs, sequence.getOptions()); + listSequence.put(nameSeq, sequence); + } + stmt.close(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "sequences").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "sequences").toString(), e); + } + return listSequence; + } + + @Override + public DBSequence getSequence(String schema, String name) { + try { + Connection connect = getConnection(); + String query = + "SELECT S.SEQUENCE_NAME, (SELECT dbms_metadata.get_ddl('SEQUENCE', S.SEQUENCE_NAME, S.SEQUENCE_OWNER) from dual) AS DDL, \n" + + "order_flag, increment_by, last_number, min_value, max_value, cache_size \n" + + "FROM DBA_SEQUENCES S WHERE S.SEQUENCE_OWNER = '" + schema + "' AND S.SEQUENCE_NAME = '" + name + "'"; + + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + DBSequence sequence = null; + while (rs.next()) { + String nameSeq = rs.getString("SEQUENCE_NAME"); + sequence = new DBSequence(); + sequence.setName(nameSeq); + sequence.setSchema(schema); + sequence.setValue(0L); + rowToProperties(rs, sequence.getOptions()); + } + stmt.close(); + return sequence; + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "sequences").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "sequences").toString(), e); + } + } + + @Override + public Map getTables(String schema) { + Map listTable = new HashMap(); + try { + String query = "SELECT T.TABLE_NAME, T.OWNER, (SELECT dbms_metadata.get_ddl('TABLE', T.TABLE_NAME, T.OWNER) from dual) AS DDL\n" + + "FROM DBA_TABLES T WHERE upper(OWNER) = upper('" + schema + "') and nested = 'NO' and (iot_type <> 'IOT_OVERFLOW' or iot_type is null)"; + Connection connect = getConnection(); + + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + while (rs.next()) { + String nameTable = rs.getString("TABLE_NAME"); + DBTable table = new DBTable(nameTable); + table.setSchema(schema); + rowToProperties(rs, table.getOptions()); + listTable.put(nameTable, table); + } + stmt.close(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); + } + return listTable; + } + + @Override + public DBTable getTable(String schema, String name) { + try { + String query = "SELECT T.TABLE_NAME, T.OWNER, (SELECT dbms_metadata.get_ddl('TABLE', T.TABLE_NAME, T.OWNER) from dual) AS DDL\n" + + "FROM DBA_TABLES T WHERE upper(T.OWNER) = upper('" + schema + "') AND upper(T.TABLE_NAME) = upper('" + name + "')"; + Connection connect = getConnection(); + + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + DBTable table = null; + + while(rs.next()) { + String nameTable = rs.getString("TABLE_NAME"); + table = new DBTable(nameTable); + table.setSchema(schema); + rowToProperties(rs, table.getOptions()); + } + + stmt.close(); + return table; + + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); + } + } + + @Override + public Map getTableFields(String schema, String nameTable) { + try { + Map listField = new HashMap(); + + String query1 = + "SELECT column_name FROM all_constraints cons, all_cons_columns cols\n"+ + "WHERE upper(cols.table_name) = upper('" + nameTable + "')\n"+ + "AND cons.constraint_type = 'P'\n" + + "AND cons.constraint_name = cols.constraint_name\n" + + "AND cons.owner = cols.owner"; + Connection connect = getConnection(); + + Statement stmt = connect.createStatement(); + ResultSet rs1 = stmt.executeQuery(query1); + + String s = ""; + + while (rs1.next()) + s = rs1.getString("COLUMN_NAME").toLowerCase(); + + String query = + "SELECT case \r\n" + + " when lower(data_type) in ('number', 'numeric', 'dec', 'decimal', 'pls_integer') then 'number'\r\n" + + " when lower(data_type) in ('varchar2', 'varchar', 'char', 'nchar', 'nvarchar2') then 'string'\r\n" + + " when substr(lower(data_type), 1, instr(data_type, '(') - 1) in ('date', 'timestamp') then 'date'\r\n" + + " when lower(data_type) in ('date', 'timestamp') then 'date'\r\n" + + " when lower(data_type) in ('clob') then 'text'\r\n" + + " when lower(data_type) in ('blob') then 'binary'" + + " else 'native'\r\n" + + " end type, " + + " case when lower(data_type) in ('char', 'nchar') then 1 else 0 end fixed, " + + " ROWNUM AS NUM, TC.* FROM DBA_TAB_COLS TC \n" + + "WHERE lower(table_name) = lower('" + nameTable + "') AND lower(OWNER) = lower('" + schema + "') ORDER BY column_id"; + + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + DBTableField field = new DBTableField(); + field.setName(rs.getString("COLUMN_NAME").toLowerCase()); + if (rs.getString("COLUMN_NAME").toLowerCase().equals(s)) { + field.setIsPrimaryKey(true); + } + String typeSQL = getFieldType(rs); + field.setTypeSQL(typeSQL); + field.setIsNullable( !typeSQL.toLowerCase().contains("not null")); + field.setTypeUniversal(FieldType.fromString(rs.getString("TYPE"))); + field.setLength(rs.getInt("DATA_LENGTH")); + field.setScale(rs.getInt("DATA_SCALE")); + field.setPrecision(rs.getInt("DATA_PRECISION")); + field.setFixed(rs.getBoolean("fixed")); + field.setOrder(rs.getInt("column_id")); + listField.put(field.getName(), field); + } + + stmt.close(); + + return listField; + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); + } + } + + protected String getFieldType(ResultSet rs) { + try { + StringBuilder type = new StringBuilder(); + type.append(rs.getString("DATA_TYPE")); + + int max_length = rs.getInt("CHAR_LENGTH"); + if (!rs.wasNull() && !rs.getString("DATA_TYPE").contains("(")) { + type.append("(" + max_length + ")"); + } + + if (rs.getString("NULLABLE").equals("N")){ + type.append(" NOT NULL"); + } + + return type.toString(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); + } + } + + @Override + public Map getIndexes(String schema, String nameTable) { + Map indexes = new HashMap<>(); + try { + String query = "SELECT ind.index_name, (select dbms_metadata.get_ddl('INDEX', ind.INDEX_NAME, owner) AS DDL from dual) AS DDL\n" + + "FROM all_indexes ind\n" + + "WHERE upper(table_name) = upper('" + nameTable + "') AND upper(owner) = upper('" + schema + "')"; + + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + while(rs.next()){ + DBIndex index = new DBIndex(); + index.setName(rs.getString("INDEX_NAME")); + index.setSchema(schema); + rowToProperties(rs, index.getOptions()); + indexes.put(index.getName(), index); + } + stmt.close(); + + return indexes; + + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "indexes").toString()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "indexes").toString(), e); + } + } + + @Override + public Map getConstraints(String schema, String nameTable) { + Map constraints = new HashMap<>(); + try { + String query = "SELECT cons.constraint_type, cons.CONSTRAINT_NAME, (select dbms_metadata.get_ddl('CONSTRAINT', cons.constraint_name, owner) AS DDL from dual) AS DDL\n" + + "FROM all_constraints cons\n" + + "WHERE upper(owner) = upper('" + schema + "') and upper(table_name) = upper('" + nameTable + "') and constraint_name not like 'SYS%' and cons.constraint_type = 'P'"; + + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + while(rs.next()){ + DBConstraint con = new DBConstraint(); + con.setName(rs.getString("CONSTRAINT_NAME")); + //This is DDL? + con.setConstraintType(rs.getString("CONSTRAINT_TYPE")); + con.setSchema(schema); + rowToProperties(rs, con.getOptions()); + constraints.put(con.getName(), con); + } + stmt.close(); + + return constraints; + + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "constraints").toString()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "constraints").toString(), e); + } + } + + @Override + public Map getViews(String schema) { + Map listView = new HashMap(); + try { + String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('VIEW', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + + "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'VIEW'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + DBView view = new DBView(rs.getString("OBJECT_NAME")); + view.setSchema(rs.getString("OWNER")); + view.setOwner(rs.getString("OWNER")); + rowToProperties(rs, view.getOptions()); + listView.put(rs.getString("OBJECT_NAME"), view); + } + stmt.close(); + return listView; + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views") + ": " + e.getMessage()); + } + } + + @Override + public DBView getView(String schema, String name) { + DBView view = new DBView(name); + view.setSchema(schema); + try { + String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('VIEW', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + + "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'VIEW' and f.object_name = '" + name + "'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + view.setOwner(schema); + + while (rs.next()) { + view.setOwner(rs.getString("OWNER")); + rowToProperties(rs, view.getOptions()); + } + stmt.close(); + return view; + + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "views").toString() + ": "+ e.getMessage()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views").toString() + ": "+ e.getMessage()); + } + } + + public Map getTriggers(String schema) { + Map listTrigger = new HashMap(); + try { + String query = "SELECT tr.owner, tr.trigger_name, tr.trigger_type, tr.table_name," + + " (select dbms_metadata.get_ddl('TRIGGER', tr.trigger_name, tr.owner) AS DDL from dual) AS DDL\n" + + "FROM all_triggers tr\n" + + "WHERE owner = '"+ schema +"'"; + + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("TRIGGER_NAME"); + String sql = rs.getString("DDL"); + DBTrigger trigger = new DBTrigger(name); + trigger.setSchema(schema); + //what means owner? oracle/postgres or owner like database user/schema + trigger.setOwner("oracle"); + rowToProperties(rs, trigger.getOptions()); + listTrigger.put(name, trigger); + } + stmt.close(); + return listTrigger; + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "triggers").toString(), e); + } + } + + public DBTrigger getTrigger(String schema, String name) { + DBTrigger trigger = null; + try { + String query = "SELECT tr.owner, tr.trigger_name, tr.trigger_type, tr.table_name, (select dbms_metadata.get_ddl('TRIGGER', tr.trigger_name, tr.owner) AS DDL from dual) AS DDL\n" + + "FROM all_triggers tr\n" + + "WHERE owner = '" + schema + "' and trigger_name = '" + name + "'"; + + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + while(rs.next()){ + trigger = new DBTrigger(name); + trigger.setSchema(schema); + //what means owner? oracle/postgres or owner like database user/schema + trigger.setOwner("oracle"); + rowToProperties(rs, trigger.getOptions()); + } + stmt.close(); + return trigger; + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "triggers").toString(), e); + } + } + + @Override + public Map getPackages(String schema) { + Map listPackage = new HashMap(); + try { + String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('PACKAGE', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + + "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'PACKAGE'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("OBJECT_NAME"); + String owner = rs.getString("OWNER"); + //String args = rs.getString("arguments"); + DBPackage pack = new DBPackage(name); + pack.setSchema(schema); + pack.setOwner(owner); + rowToProperties(rs,pack.getOptions()); + //pack.setArguments(args); + listPackage.put(name, pack); + } + stmt.close(); + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "pkg").toString(), e); + } + return listPackage; + } + + @Override + public DBPackage getPackage(String schema, String name) { + try { + String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('PACKAGE', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + + "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'PACKAGE' and f.object_name = '" + name + "'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + DBPackage pack = null; + while (rs.next()) { + pack = new DBPackage(name); + String owner = rs.getString("OWNER"); + //String args = rs.getString("arguments"); + pack.setSchema(schema); + pack.setOwner(owner); + //pack.setArguments(args); + rowToProperties(rs,pack.getOptions()); + } + stmt.close(); + + return pack; + + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views").toString(), e); + } + } + + @Override + public Map getProcedures(String schema) { + Map listProcedure = new HashMap(); + try { + String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('PROCEDURE', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + + "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'PROCEDURE'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("OBJECT_NAME"); + String owner = rs.getString("OWNER"); + //String args = rs.getString("arguments"); + DBProcedure proc = new DBProcedure(name); + proc.setSchema(schema); + proc.setOwner(owner); + proc.setName(name); + rowToProperties(rs,proc.getOptions()); + //proc.setArguments(args); + listProcedure.put(name, proc); + } + stmt.close(); + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "prc").toString(), e); + } + return listProcedure; + } + + @Override + public DBProcedure getProcedure(String schema, String name) { + try { + String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('PROCEDURE', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + + "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'PROCEDURE' and f.object_name = '" + name + "'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + DBProcedure proc = null; + + while (rs.next()) { + proc = new DBProcedure(rs.getString("OBJECT_NAME")); + String owner = rs.getString("OWNER"); + //String args = rs.getString("arguments"); + proc.setSchema(schema); + proc.setOwner(owner); + //proc.setArguments(args); + rowToProperties(rs,proc.getOptions()); + } + stmt.close(); + + return proc; + + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "prc").toString(), e); + } + } + + @Override + public Map getFunctions(String schema) { + Map listFunction = new HashMap(); + try { + String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('FUNCTION', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + + "FROM all_objects f WHERE f.owner = '" + schema + "' and f.object_type = 'FUNCTION'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("OBJECT_NAME"); + String sql = rs.getString("DDL"); + String owner = rs.getString("OWNER"); + //String args = rs.getString("arguments"); + DBFunction func = new DBFunction(name); + func.setSchema(schema); + func.setOwner(owner); + rowToProperties(rs,func.getOptions()); + //func.setArguments(args); + listFunction.put(name, func); + } + stmt.close(); + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "fnc").toString(), e); + } + return listFunction; + } + + @Override + public DBFunction getFunction(String schema, String name) { + try { + String query = "SELECT f.owner, f.object_name, (select dbms_metadata.get_ddl('FUNCTION', f.object_name, f.owner) AS DDL from dual) AS DDL \n" + + "FROM all_objects f WHERE f.owner = '" + schema +"' and " + + "f.object_type = 'FUNCTION' and f.object_name = '" + name +"'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + DBFunction func = null; + + while (rs.next()) { + func = new DBFunction(rs.getString("OBJECT_NAME")); + String owner = rs.getString("OWNER"); + //String args = rs.getString("arguments"); + func.setSchema(schema); + func.setOwner(owner); + //func.setArguments(args); + rowToProperties(rs,func.getOptions()); + } + stmt.close(); + + return func; + + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "fnc").toString(), e); + } + } + + @Override + public DBTableData getTableDataPortion(String schema, String nameTable, int portionIndex, int tryNumber) { + DBTableData data = new DBTableData(); + + try { + int portionSize = DBGitConfig.getInstance().getInteger("core", "PORTION_SIZE", DBGitConfig.getInstance().getIntegerGlobal("core", "PORTION_SIZE", 1000)); + + int begin = 1 + portionSize*portionIndex; + int end = portionSize + portionSize*portionIndex; + + Statement st = getConnection().createStatement(); + ResultSet rs = st.executeQuery(" SELECT * FROM \r\n" + + " (SELECT f.*, ROW_NUMBER() OVER (ORDER BY rowid) DBGIT_ROW_NUM FROM " + schema + "." + nameTable + " f)\r\n" + + " WHERE DBGIT_ROW_NUM BETWEEN " + begin + " and " + end); + data.setResultSet(rs); + return data; + } catch(Exception e) { + ConsoleWriter.println("Connection lost!"); + logger.error(lang.getValue("errors", "adapter", "tableData").toString(), e); + + try { + if (tryNumber <= DBGitConfig.getInstance().getInteger("core", "TRY_COUNT", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_COUNT", 1000))) { + try { + TimeUnit.SECONDS.sleep(DBGitConfig.getInstance().getInteger("core", "TRY_DELAY", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_DELAY", 1000))); + } catch (InterruptedException e1) { + throw new ExceptionDBGitRunTime(e1.getMessage()); + } + ConsoleWriter.println("Error while getting portion of data, try " + tryNumber); + return getTableDataPortion(schema, nameTable, portionIndex, tryNumber++); + } + } catch (Exception e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + try { + getConnection().rollback(); + } catch (Exception e2) { + logger.error(lang.getValue("errors", "adapter", "rollback").toString(), e2); + } + throw new ExceptionDBGitRunTime(e.getMessage()); + } + } + + @Override + public DBTableData getTableData(String schema, String nameTable) { + String tableName = schema + "." + nameTable; + try { + DBTableData data = new DBTableData(); + + int maxRowsCount = DBGitConfig.getInstance().getInteger("core", "MAX_ROW_COUNT_FETCH", DBGitConfig.getInstance().getIntegerGlobal("core", "MAX_ROW_COUNT_FETCH", MAX_ROW_COUNT_FETCH)); + + if (DBGitConfig.getInstance().getBoolean("core", "LIMIT_FETCH", DBGitConfig.getInstance().getBooleanGlobal("core", "LIMIT_FETCH", true))) { + Statement st = getConnection().createStatement(); + String query = "select COALESCE(count(*), 0) row_count from ( select 1 from "+ + tableName+" where ROWNUM <= " + (maxRowsCount + 1) + " ) tbl"; + ResultSet rs = st.executeQuery(query); + rs.next(); + if (rs.getInt("row_count") > maxRowsCount) { + data.setErrorFlag(DBTableData.ERROR_LIMIT_ROWS); + return data; + } + } + Statement st = getConnection().createStatement(); + ResultSet rs = st.executeQuery("select * from "+tableName); + data.setResultSet(rs); + return data; + + } catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tableData").toString(), e); + try { + getConnection().rollback(); + } catch (Exception e2) { + logger.error(lang.getValue("errors", "adapter", "rollback").toString(), e2); + } + throw new ExceptionDBGitRunTime(e.getMessage()); + } + } +/* + @Override + public DBTableRow getTableRow(String schema, String nameTable, Object id) { + // TODO Auto-generated method stub + return null; + } +*/ + @Override + public Map getUsers() { + Map listUser = new HashMap(); + try { + String query = "SELECT USERNAME FROM DBA_USERS WHERE USERNAME != 'PUBLIC' AND USERNAME != 'SYSTEM'\n" + + "AND USERNAME != 'SYS' AND USERNAME != 'APPQOSSYS' AND USERNAME != 'OUTLN' \n" + + "AND USERNAME != 'DIP' AND USERNAME != 'DBSNMP' AND USERNAME != 'ORACLE_OCM' ORDER BY USERNAME"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString(1); + DBUser user = new DBUser(name); + listUser.put(name, user); + } + stmt.close(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "users") + ": " +e.getMessage()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "users") + ": " + e.getMessage()); + } + return listUser; + } + + @Override + public Map getRoles() { + Map listRole = new HashMap(); + try { + String query = "SELECT R.GRANTEE, \n" + + "R.GRANTED_ROLE, R.ADMIN_OPTION, R.DEFAULT_ROLE FROM DBA_ROLE_PRIVS R \n" + + "WHERE R.GRANTEE = (SELECT USERNAME FROM DBA_USERS WHERE USERNAME = R.GRANTEE AND\n" + + "USERNAME != 'PUBLIC' AND USERNAME != 'SYSTEM'\n" + + "AND USERNAME != 'SYS' AND USERNAME != 'APPQOSSYS' AND USERNAME != 'OUTLN' \n" + + "AND USERNAME != 'DIP' AND USERNAME != 'DBSNMP' AND USERNAME != 'ORACLE_OCM')"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("GRANTED_ROLE"); + DBRole role = new DBRole(name); + rowToProperties(rs, role.getOptions()); + listRole.put(name, role); + } + stmt.close(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "roles") + ": " + e.getMessage()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "roles") + ": " + e.getMessage()); + } + return listRole; + } + + @Override + public boolean userHasRightsToGetDdlOfOtherUsers() { + try { + String userName = getConnection().getSchema(); + + if (userName.equalsIgnoreCase("SYS")) + return true; + + PreparedStatement stmt = getConnection().prepareStatement + ("SELECT count(1) cnt FROM DBA_ROLE_PRIVS WHERE GRANTEE = ? and GRANTED_ROLE = 'SELECT_CATALOG_ROLE'"); + stmt.setString(1, userName); + ResultSet resultSet = stmt.executeQuery(); + resultSet.next(); + + if (resultSet.getInt(1) == 0) { + return false; + } else { + return true; + } + } catch (SQLException e) { + logger.error(e.getMessage()); + return false; + } + } + + @Override + public IFactoryDBBackupAdapter getBackupAdapterFactory() { + return backupFactory; + } + + @Override + public DbType getDbType() { + return DbType.ORACLE; + } + + @Override + public String getDbVersion() { + try { + PreparedStatement stmt = getConnection().prepareStatement("SELECT version FROM V$INSTANCE"); + ResultSet resultSet = stmt.executeQuery(); + resultSet.next(); + + String result = resultSet.getString("version"); + resultSet.close(); + stmt.close(); + + return result; + } catch (SQLException e) { + return ""; + } + } + + @Override + public void createSchemaIfNeed(String schemaName) throws ExceptionDBGit { + try { + Statement st = connect.createStatement(); + ResultSet rs = st.executeQuery("select count(*) cnt from all_users where USERNAME = '" + schemaName.toUpperCase() + "'"); + rs.next(); + if (rs.getInt("cnt") == 0) { + StatementLogging stLog = new StatementLogging(connect, getStreamOutputSqlCommand(), isExecSql()); + stLog.execute("create USER \"" + schemaName.toUpperCase() + "\"\r\n" + + "IDENTIFIED BY \"" + schemaName.toUpperCase() + "\"\r\n" + + "DEFAULT TABLESPACE \"SYSTEM\"\r\n" + + "TEMPORARY TABLESPACE \"TEMP\"\r\n" + + "ACCOUNT UNLOCK"); + + stLog.execute("ALTER USER \"" + schemaName.toUpperCase() + "\" QUOTA UNLIMITED ON SYSTEM"); + stLog.close(); + } + + rs.close(); + st.close(); + } catch (SQLException e) { + throw new ExceptionDBGit(lang.getValue("errors", "adapter", "createSchema") + ": " + e.getLocalizedMessage()); + } + + } + + @Override + public boolean isReservedWord(String word) { + Set reservedWords = new HashSet<>(); + + reservedWords.add("ACCESS"); + reservedWords.add("ADD"); + reservedWords.add("ALL"); + reservedWords.add("ALTER"); + reservedWords.add("AND"); + reservedWords.add("ANY"); + reservedWords.add("AS"); + reservedWords.add("ASC"); + reservedWords.add("AUDIT"); + reservedWords.add("BETWEEN"); + reservedWords.add("BY"); + reservedWords.add("CHAR"); + reservedWords.add("CHECK"); + reservedWords.add("CLUSTER"); + reservedWords.add("COLUMN"); + reservedWords.add("COMMENT"); + reservedWords.add("COMPRESS"); + reservedWords.add("CONNECT"); + reservedWords.add("CREATE"); + reservedWords.add("CURRENT"); + reservedWords.add("DATE"); + reservedWords.add("DECIMAL"); + reservedWords.add("DEFAULT"); + reservedWords.add("DELETE"); + reservedWords.add("DESC"); + reservedWords.add("DISTINCT"); + reservedWords.add("DROP"); + reservedWords.add("ELSE"); + reservedWords.add("EXCLUSIVE"); + reservedWords.add("EXISTS"); + reservedWords.add("FILE"); + reservedWords.add("FLOAT"); + reservedWords.add("FOR"); + reservedWords.add("FROM"); + reservedWords.add("GRANT"); + reservedWords.add("GROUP"); + reservedWords.add("HAVING"); + reservedWords.add("IDENTIFIED"); + reservedWords.add("IMMEDIATE"); + reservedWords.add("IN"); + reservedWords.add("INCREMENT"); + reservedWords.add("INDEX"); + reservedWords.add("INITIAL"); + reservedWords.add("INSERT"); + reservedWords.add("INTEGER"); + reservedWords.add("INTERSECT"); + reservedWords.add("INTO"); + reservedWords.add("IS"); + reservedWords.add("LEVEL"); + reservedWords.add("LIKE"); + reservedWords.add("LOCK"); + reservedWords.add("LONG"); + reservedWords.add("MAXEXTENTS"); + reservedWords.add("MINUS"); + reservedWords.add("MLSLABEL"); + reservedWords.add("MODE"); + reservedWords.add("MODIFY"); + reservedWords.add("NOAUDIT"); + reservedWords.add("NOCOMPRESS"); + reservedWords.add("NOT"); + reservedWords.add("NOWAIT"); + reservedWords.add("NULL"); + reservedWords.add("NUMBER"); + reservedWords.add("OF"); + reservedWords.add("OFFLINE"); + reservedWords.add("ON"); + reservedWords.add("ONLINE"); + reservedWords.add("OPTION"); + reservedWords.add("OR"); + reservedWords.add("ORDER"); + reservedWords.add("PCTFREE"); + reservedWords.add("PRIOR"); + reservedWords.add("PRIVILEGES"); + reservedWords.add("PUBLIC"); + reservedWords.add("RAW"); + reservedWords.add("RENAME"); + reservedWords.add("RESOURCE"); + reservedWords.add("REVOKE"); + reservedWords.add("ROW"); + reservedWords.add("ROWID"); + reservedWords.add("ROWNUM"); + reservedWords.add("ROWS"); + reservedWords.add("SELECT"); + reservedWords.add("SESSION"); + reservedWords.add("SET"); + reservedWords.add("SHARE"); + reservedWords.add("SIZE"); + reservedWords.add("SMALLINT"); + reservedWords.add("START"); + reservedWords.add("SUCCESSFUL"); + reservedWords.add("SYNONYM"); + reservedWords.add("SYSDATE"); + reservedWords.add("TABLE"); + reservedWords.add("THEN"); + reservedWords.add("TO"); + reservedWords.add("TRIGGER"); + reservedWords.add("UID"); + reservedWords.add("UNION"); + reservedWords.add("UNIQUE"); + reservedWords.add("UPDATE"); + reservedWords.add("USER"); + reservedWords.add("VALIDATE"); + reservedWords.add("VALUES"); + reservedWords.add("VARCHAR"); + reservedWords.add("VARCHAR2"); + reservedWords.add("VIEW"); + reservedWords.add("WHENEVER"); + reservedWords.add("WHERE"); + reservedWords.add("WITH"); + + return reservedWords.contains(word.toUpperCase()); + } + + @Override + public IFactoryDBConvertAdapter getConvertAdapterFactory() { + return convertFactory; + } + + + @Override + public void createRoleIfNeed(String roleName) throws ExceptionDBGit { + + } + + @Override + public String getDefaultScheme() throws ExceptionDBGit { + try { + return getConnection().getSchema(); + } catch (SQLException e) { + throw new ExceptionDBGit(lang.getValue("errors", "adapter", "getSchema") + ": " + e.getLocalizedMessage()); + } + } +} diff --git a/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreRoleOracle.java b/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreRoleOracle.java index 34d7b1d..8b31125 100644 --- a/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreRoleOracle.java +++ b/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreRoleOracle.java @@ -27,46 +27,43 @@ public boolean restoreMetaObject(IMetaObject obj, int step) throws Exception { boolean exist = false; if(!(roles.isEmpty() || roles == null)) { for(DBRole role:roles.values()) { - if(restoreRole.getObjectOption().getName().equals(role.getName())){ + if (restoreRole.getObjectOption().getName().equals(role.getName())) { exist = true; - + break; } - //TODO Восстановление привилегий + //TODO Восстановление привилегий } } - - if(!exist){ + + if (!exist) { //String rolconnect = "", rolresource = "", roldba = ""; String q = "GRANT "; if(restoreRole.getObjectOption().getOptions().getChildren().get("GRANTED_ROLE").getData().equals("CONNECT")) { //rolconnect = "CONNECT"; q += "CONNECT"; } - + if(restoreRole.getObjectOption().getOptions().getChildren().get("GRANTED_ROLE").getData().equals("RESOURCE")) { //rolresource = "RESOURCE"; q += ", RESOURCE"; } - + if(restoreRole.getObjectOption().getOptions().getChildren().get("GRANTED_ROLE").getData().equals("DBA")) { //roldba = "DBA"; q += ", DBA"; } - - st.execute(q + + + st.execute(q + " TO " + restoreRole.getObjectOption().getOptions().getChildren().get("GRANTEE").getData()); - - //TODO Восстановление привилегий + + //TODO Восстановление привилегий } - //TODO restore memberOfRole ConsoleWriter.detailsPrintlnGreen(lang.getValue("general", "ok")); - } - else - { + } else { ConsoleWriter.detailsPrintlnRed(lang.getValue("errors", "meta", "fail")); throw new ExceptionDBGitRestore(lang.getValue("errors", "restore", "objectRestoreError").withParams(obj.getName())); - } + } } catch (Exception e) { ConsoleWriter.detailsPrintlnRed(lang.getValue("errors", "meta", "fail")); throw new ExceptionDBGitRestore(lang.getValue("errors", "restore", "objectRestoreError").withParams(obj.getName()), e); diff --git a/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreSchemaOracle.java b/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreSchemaOracle.java index 124f148..960baf0 100644 --- a/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreSchemaOracle.java +++ b/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreSchemaOracle.java @@ -26,9 +26,9 @@ public boolean restoreMetaObject(IMetaObject obj, int step) throws Exception { boolean exist = false; if(!(schs.isEmpty() || schs == null)) { for(DBSchema sch:schs.values()) { - if(restoreSchema.getObjectOption().getName().equals(sch.getName())){ + if (restoreSchema.getObjectOption().getName().equals(sch.getName())) { exist = true; - + break; /*if(!restoreSchema.getObjectOption().getOptions().getChildren().get("owner").getData().equals(sch.getOptions().getChildren().get("owner").getData())) { st.execute("CREATE USER "+ restoreSchema.getObjectOption().getName() +" IDENTIFIED BY "+ restoreSchema.getObjectOption().getOptions().getChildren().get("OWNER").getData()); diff --git a/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreTableDataOracle.java b/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreTableDataOracle.java index 104a0f1..7b8bac9 100644 --- a/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreTableDataOracle.java +++ b/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreTableDataOracle.java @@ -1,15 +1,9 @@ package ru.fusionsoft.dbgit.oracle; -import java.io.BufferedReader; -import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStreamReader; -import java.sql.Clob; import java.sql.Connection; import java.sql.ResultSet; -import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; @@ -17,7 +11,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import java.util.StringJoiner; import java.util.TreeMap; import java.util.stream.Collectors; @@ -46,7 +39,6 @@ import ru.fusionsoft.dbgit.meta.IMetaObject; import ru.fusionsoft.dbgit.meta.MetaTable; import ru.fusionsoft.dbgit.meta.MetaTableData; -import ru.fusionsoft.dbgit.statement.PrepareStatementLogging; import ru.fusionsoft.dbgit.statement.StatementLogging; import ru.fusionsoft.dbgit.utils.ConsoleWriter; @@ -79,7 +71,7 @@ public boolean restoreMetaObject(IMetaObject obj, int step) throws Exception { currentTableData.setMapRows(new TreeMapRowData()); currentTableData.setDataTable(restoreTableData.getDataTable()); } - currentTableData.getmapRows().clear(); + currentTableData.getMapRows().clear(); if (getAdapter().getTable(schema, currentTableData.getTable().getName()) != null) { currentTableData.setDataTable(getAdapter().getTableData(schema, currentTableData.getTable().getName())); @@ -127,15 +119,15 @@ private void restoreTableDataOracle(MetaTableData restoreTableData, MetaTableDat String insertQuery= ""; - if (restoreTableData.getmapRows() == null) + if (restoreTableData.getMapRows() == null) restoreTableData.setMapRows(new TreeMapRowData()); String fields = ""; - if (restoreTableData.getmapRows().size() > 0) - fields = "(" + restoreTableData.getmapRows().firstEntry().getValue().getData().keySet().stream() + if (restoreTableData.getMapRows().size() > 0) + fields = "(" + restoreTableData.getMapRows().firstEntry().getValue().getData().keySet().stream() .map(d -> adapter.isReservedWord(d.toString()) ? "\"" + d.toString() + "\"" : d.toString()) .collect(Collectors.joining(",")) + ")"; - MapDifference diffTableData = Maps.difference(restoreTableData.getmapRows(), currentTableData == null ? new TreeMap() : currentTableData.getmapRows()); + MapDifference diffTableData = Maps.difference(restoreTableData.getMapRows(), currentTableData == null ? new TreeMap() : currentTableData.getMapRows()); ResultSet rsTypes = st.executeQuery("select column_name, data_type from ALL_TAB_COLUMNS \r\n" + "where lower(owner||'.'||table_name) = lower('" + tblName + "')"); @@ -343,21 +335,21 @@ private void removeTableConstraintsOracle(MetaTable table) throws Exception { } private String getBlobQuery(Collection datas, String query) throws Exception { - String res = "declare\n"; + StringBuilder res = new StringBuilder("declare\n"); for (ICellData data : datas) { if (data instanceof TextFileData) - res += " b_" + data.hashCode() + " CLOB;\n"; + res.append(" b_").append(data.hashCode()).append(" CLOB;\n"); else if (data instanceof MapFileData) - res += " b_" + data.hashCode() + " BLOB;\n"; + res.append(" b_").append(data.hashCode()).append(" BLOB;\n"); } - res += "begin\n"; + res.append("begin\n"); int i = 0; for (ICellData data : datas) { if (data instanceof TextFileData) { if (((TextFileData) data).getFile() != null && !((TextFileData) data).getFile().getName().contains("null")) { - res += " DBMS_LOB.CREATETEMPORARY(b_" + data.hashCode() + ",TRUE);\n"; + res.append(" DBMS_LOB.CREATETEMPORARY(b_").append(data.hashCode()).append(",TRUE);\n"); FileInputStream fis = new FileInputStream(((MapFileData) data).getFile()); @@ -371,17 +363,17 @@ else if (data instanceof MapFileData) sb.append(hex); if (sb.length() == 2000) { - res += " dbms_lob.WRITEAPPEND (b_" + data.hashCode() + ", 1000, utl_raw.cast_to_varchar2(hextoraw('" + sb.toString() + "')));\n"; + res.append(" dbms_lob.WRITEAPPEND (b_").append(data.hashCode()).append(", 1000, utl_raw.cast_to_varchar2(hextoraw('").append(sb.toString()).append("')));\n"); sb.setLength(0); } } if (sb.length() > 0) - res += " dbms_lob.WRITEAPPEND (b_" + data.hashCode() + ", " + sb.length()/2 + ", utl_raw.cast_to_varchar2(hextoraw('" + sb.toString() + "')));\n"; + res.append(" dbms_lob.WRITEAPPEND (b_").append(data.hashCode()).append(", ").append(sb.length() / 2).append(", utl_raw.cast_to_varchar2(hextoraw('").append(sb.toString()).append("')));\n"); fis.close(); } } else if (data instanceof MapFileData) { if (((MapFileData) data).getFile() != null && !((MapFileData) data).getFile().getName().contains("null")) { - res += " DBMS_LOB.CREATETEMPORARY(b_" + data.hashCode() + ",TRUE);\n"; + res.append(" DBMS_LOB.CREATETEMPORARY(b_").append(data.hashCode()).append(",TRUE);\n"); FileInputStream fis = new FileInputStream(((MapFileData) data).getFile()); @@ -395,22 +387,22 @@ else if (data instanceof MapFileData) sb.append(hex); if (sb.length() == 2000) { - res += " dbms_lob.WRITEAPPEND (b_" + data.hashCode() + ", 1000, hextoraw('" + sb.toString() + "'));\n"; + res.append(" dbms_lob.WRITEAPPEND (b_").append(data.hashCode()).append(", 1000, hextoraw('").append(sb.toString()).append("'));\n"); sb.setLength(0); } } if (sb.length() > 0) - res += " dbms_lob.WRITEAPPEND (b_" + data.hashCode() + ", " + sb.length()/2 + ", hextoraw('" + sb.toString() + "'));\n"; + res.append(" dbms_lob.WRITEAPPEND (b_").append(data.hashCode()).append(", ").append(sb.length() / 2).append(", hextoraw('").append(sb.toString()).append("'));\n"); fis.close(); } } i++; } - res += " " + query + ";\n"; - res += "end;\n"; + res.append(" ").append(query).append(";\n"); + res.append("end;\n"); - return res; + return res.toString(); } public String valuesToString(Collection datas, HashMap colTypes, ArrayList fieldsList, boolean isInsert) throws ExceptionDBGit, IOException { diff --git a/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreTableOracle.java b/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreTableOracle.java index b867093..6cbbae3 100644 --- a/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreTableOracle.java +++ b/src/main/java/ru/fusionsoft/dbgit/oracle/DBRestoreTableOracle.java @@ -65,10 +65,10 @@ public void restoreTableOracle(IMetaObject obj) throws Exception Map tables = adapter.getTables(schema.toUpperCase()); boolean exist = false; if(!(tables.isEmpty() || tables == null)) { - for(DBTable table:tables.values()) { - if(restoreTable.getTable().getName().equalsIgnoreCase(table.getName())){ + for (DBTable table : tables.values()) { + if (restoreTable.getTable().getName().equalsIgnoreCase(table.getName())) { exist = true; - + break; } } } @@ -193,7 +193,7 @@ public void restoreTableFieldsOracle(IMetaObject obj) throws Exception StatementLogging st = new StatementLogging(connect, adapter.getStreamOutputSqlCommand(), adapter.isExecSql()); try { if (obj instanceof MetaTable) { - MetaTable restoreTable = (MetaTable)obj; + MetaTable restoreTable = (MetaTable)obj; String schema = getPhisicalSchema(restoreTable.getTable().getSchema()); schema = (SchemaSynonym.getInstance().getSchema(schema) == null) ? schema : SchemaSynonym.getInstance().getSchema(schema); String tblName = schema+"."+restoreTable.getTable().getName(); @@ -201,8 +201,9 @@ public void restoreTableFieldsOracle(IMetaObject obj) throws Exception boolean exist = false; if(!(tables.isEmpty() || tables == null)) { for(DBTable table:tables.values()) { - if(restoreTable.getTable().getName().equals(table.getName())){ - exist = true; + if (restoreTable.getTable().getName().equals(table.getName())) { + exist = true; + break; } } } diff --git a/src/main/java/ru/fusionsoft/dbgit/postgres/DBAdapterPostgres.java b/src/main/java/ru/fusionsoft/dbgit/postgres/DBAdapterPostgres.java index e7aee27..f716005 100644 --- a/src/main/java/ru/fusionsoft/dbgit/postgres/DBAdapterPostgres.java +++ b/src/main/java/ru/fusionsoft/dbgit/postgres/DBAdapterPostgres.java @@ -1,1488 +1,1488 @@ -package ru.fusionsoft.dbgit.postgres; - - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import ru.fusionsoft.dbgit.adapters.AdapterFactory; -import ru.fusionsoft.dbgit.adapters.DBAdapter; -import ru.fusionsoft.dbgit.adapters.IFactoryDBAdapterRestoteMetaData; -import ru.fusionsoft.dbgit.adapters.IFactoryDBBackupAdapter; -import ru.fusionsoft.dbgit.adapters.IFactoryDBConvertAdapter; -import ru.fusionsoft.dbgit.core.DBGitConfig; -import ru.fusionsoft.dbgit.core.ExceptionDBGit; -import ru.fusionsoft.dbgit.core.ExceptionDBGitObjectNotFound; -import ru.fusionsoft.dbgit.core.ExceptionDBGitRunTime; -import ru.fusionsoft.dbgit.core.db.DbType; -import ru.fusionsoft.dbgit.core.db.FieldType; -import ru.fusionsoft.dbgit.data_table.MapFileData; -import ru.fusionsoft.dbgit.data_table.BooleanData; -import ru.fusionsoft.dbgit.data_table.DateData; -import ru.fusionsoft.dbgit.data_table.FactoryCellData; -import ru.fusionsoft.dbgit.data_table.LongData; -import ru.fusionsoft.dbgit.data_table.StringData; -import ru.fusionsoft.dbgit.data_table.TextFileData; -import ru.fusionsoft.dbgit.dbobjects.DBConstraint; -import ru.fusionsoft.dbgit.dbobjects.DBFunction; -import ru.fusionsoft.dbgit.dbobjects.DBIndex; -import ru.fusionsoft.dbgit.dbobjects.DBPackage; -import ru.fusionsoft.dbgit.dbobjects.DBProcedure; -import ru.fusionsoft.dbgit.dbobjects.DBRole; -import ru.fusionsoft.dbgit.dbobjects.DBSchema; -import ru.fusionsoft.dbgit.dbobjects.DBSequence; -import ru.fusionsoft.dbgit.dbobjects.DBTable; -import ru.fusionsoft.dbgit.dbobjects.DBTableData; -import ru.fusionsoft.dbgit.dbobjects.DBTableField; -import ru.fusionsoft.dbgit.dbobjects.DBTableRow; -import ru.fusionsoft.dbgit.dbobjects.DBTableSpace; -import ru.fusionsoft.dbgit.dbobjects.DBTrigger; -import ru.fusionsoft.dbgit.dbobjects.DBUser; -import ru.fusionsoft.dbgit.dbobjects.DBView; -import ru.fusionsoft.dbgit.meta.IMapMetaObject; -import ru.fusionsoft.dbgit.meta.IMetaObject; -import ru.fusionsoft.dbgit.statement.StatementLogging; -import ru.fusionsoft.dbgit.utils.ConsoleWriter; -import ru.fusionsoft.dbgit.utils.LoggerUtil; -import org.slf4j.Logger; - -import com.axiomalaska.jdbc.NamedParameterPreparedStatement; - - -public class DBAdapterPostgres extends DBAdapter { - private Logger logger = LoggerUtil.getLogger(this.getClass()); - private FactoryDBAdapterRestorePostgres restoreFactory = new FactoryDBAdapterRestorePostgres(); - private FactoryDbConvertAdapterPostgres convertFactory = new FactoryDbConvertAdapterPostgres(); - private FactoryDBBackupAdapterPostgres backupFactory = new FactoryDBBackupAdapterPostgres(); - - @Override - public IFactoryDBAdapterRestoteMetaData getFactoryRestore() { - return restoreFactory; - } - - @Override - public void startUpdateDB() { - // TODO Auto-generated method stub - - } - - @Override - public void endUpdateDB() { - // TODO Auto-generated method stub - - } - - @Override - public IMapMetaObject loadCustomMetaObjects() { - return null; - } - - @Override - public Map getSchemes() { - Map listScheme = new HashMap(); - try { - String query = "select nspname,usename,nspacl from pg_namespace,pg_user where nspname!='pg_toast' and nspname!='pg_temp_1'"+ - "and nspname!='pg_toast_temp_1' and nspname!='pg_catalog'"+ - "and nspname!='information_schema' and nspname!='pgagent'"+ - "and nspname!='pg_temp_3' and nspname!='pg_toast_temp_3'"+ - "and usesysid = nspowner"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("nspname"); - DBSchema scheme = new DBSchema(name); - rowToProperties(rs, scheme.getOptions()); - listScheme.put(name, scheme); - } - stmt.close(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "schemes").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "schemes").toString(), e); - } - - return listScheme; - } - - @Override - public Map getTableSpaces() { - Map listTableSpace = new HashMap(); - try { - String query = "SELECT tblspaces.spcname,tblspaces.spcacl,tblspaces.spcoptions,users.usename,pg_tablespace_location(tblspacesoid.oid) " + - "FROM pg_tablespace as tblspaces,pg_user as users,(Select oid FROM pg_tablespace where spcname!='pg_default' and spcname!='pg_global') as tblspacesoid " + - "WHERE users.usesysid=tblspaces.spcowner and spcname!='pg_default' and spcname!='pg_global' and tblspacesoid.oid=tblspaces.oid"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("spcname"); - DBTableSpace dbTableSpace = new DBTableSpace(name); - rowToProperties(rs, dbTableSpace.getOptions()); - listTableSpace.put(name, dbTableSpace); - } - stmt.close(); - }catch(Exception e) { - logger.error(e.getMessage()); - throw new ExceptionDBGitRunTime(e.getMessage()); - } - return listTableSpace; - } - - @Override - public Map getSequences(String schema) { - Map listSequence = new HashMap(); - try { - Connection connect = getConnection(); - String query = - "select s.sequence_name, rol.rolname as owner, s.start_value, s.minimum_value, s.maximum_value, s.increment, s.cycle_option " + - "from pg_class cls " + - " join pg_roles rol on rol.oid = cls.relowner " + - " join pg_namespace nsp on nsp.oid = cls.relnamespace " + - " join information_schema.sequences s on cls.relname = s.sequence_name " + - "where nsp.nspname not in ('information_schema', 'pg_catalog') " + - " and nsp.nspname not like 'pg_toast%' " + - " and cls.relkind = 'S' and s.sequence_schema = :schema "; - - NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); - stmt.setString("schema", schema); - - ResultSet rs = stmt.executeQuery(); - while(rs.next()){ - String nameSeq = rs.getString("sequence_name"); - DBSequence sequence = new DBSequence(); - sequence.setName(nameSeq); - sequence.setSchema(schema); - sequence.setValue(0L); - rowToProperties(rs, sequence.getOptions()); - listSequence.put(nameSeq, sequence); - } - stmt.close(); - }catch(Exception e) { - logger.error(e.getMessage(), e); - throw new ExceptionDBGitRunTime(e.getMessage(), e); - } - return listSequence; - } - - @Override - public DBSequence getSequence(String schema, String name) { - try { - Connection connect = getConnection(); - String query = - "select s.sequence_name, rol.rolname as owner, s.start_value, s.minimum_value, s.maximum_value, s.increment, s.cycle_option " + - "from pg_class cls " + - " join pg_roles rol on rol.oid = cls.relowner " + - " join pg_namespace nsp on nsp.oid = cls.relnamespace " + - " join information_schema.sequences s on cls.relname = s.sequence_name " + - "where nsp.nspname not in ('information_schema', 'pg_catalog') " + - " and nsp.nspname not like 'pg_toast%' " + - " and cls.relkind = 'S' and s.sequence_schema = :schema and s.sequence_name = :name "; - - NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); - stmt.setString("schema", schema); - stmt.setString("name", name); - - ResultSet rs = stmt.executeQuery(); - DBSequence sequence = null; - while (rs.next()) { - String nameSeq = rs.getString("sequence_name"); - sequence = new DBSequence(); - sequence.setName(nameSeq); - sequence.setSchema(schema); - sequence.setValue(0L); - rowToProperties(rs, sequence.getOptions()); - } - stmt.close(); - return sequence; - }catch(Exception e) { - logger.error(e.getMessage(), e); - throw new ExceptionDBGitRunTime(e.getMessage(), e); - } - } - - @Override - public Map getTables(String schema) { - Map listTable = new HashMap(); - try { - String query = - "select tablename as table_name,tableowner as owner,tablespace,hasindexes,hasrules,hastriggers " - + "from pg_tables where schemaname not in ('information_schema', 'pg_catalog') " - + "and schemaname not like 'pg_toast%' and upper(schemaname) = upper(:schema) "; - Connection connect = getConnection(); - - NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); - stmt.setString("schema", schema); - - ResultSet rs = stmt.executeQuery(); - while(rs.next()){ - String nameTable = rs.getString("table_name"); - DBTable table = new DBTable(nameTable); - table.setSchema(schema); - rowToProperties(rs, table.getOptions()); - listTable.put(nameTable, table); - } - stmt.close(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); - } - return listTable; - } - - @Override - public DBTable getTable(String schema, String name) { - try { - String query = - "select tablename as table_name,tableowner as owner,tablespace,hasindexes,hasrules,hastriggers from pg_tables where schemaname not in ('information_schema', 'pg_catalog') " - + "and schemaname not like 'pg_toast%' and upper(schemaname) = upper(\'"+schema+"\') and upper(tablename) = upper(\'"+name+"\') "; - Connection connect = getConnection(); - - Statement stmt = connect.createStatement(); - - ResultSet rs = stmt.executeQuery(query); - - DBTable table = null; - - while (rs.next()) { - String nameTable = rs.getString("table_name"); - table = new DBTable(nameTable); - table.setSchema(schema); - rowToProperties(rs, table.getOptions()); - } - stmt.close(); - return table; - - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); - } - } - - @Override - public Map getTableFields(String schema, String nameTable) { - - try { - Map listField = new HashMap(); - - String query = - "SELECT distinct col.column_name,col.is_nullable,col.data_type,col.character_maximum_length, tc.constraint_name, " + - "case\r\n" + - " when lower(data_type) in ('integer', 'numeric', 'smallint', 'double precision', 'bigint') then 'number' \r\n" + - " when lower(data_type) in ('character varying', 'char', 'character', 'varchar') then 'string'\r\n" + - " when lower(data_type) in ('timestamp without time zone', 'timestamp with time zone', 'date') then 'date'\r\n" + - " when lower(data_type) in ('boolean') then 'boolean'\r\n" + - " when lower(data_type) in ('text') then 'text'\r\n" + - " when lower(data_type) in ('bytea') then 'binary'" + - " else 'native'\r\n" + - " end tp, " + - " case when lower(data_type) in ('char', 'character') then true else false end fixed, " + - "col.* FROM " + - "information_schema.columns col " + - "left join information_schema.key_column_usage kc on col.table_schema = kc.table_schema and col.table_name = kc.table_name and col.column_name=kc.column_name " + - "left join information_schema.table_constraints tc on col.table_schema = kc.table_schema and col.table_name = kc.table_name and kc.constraint_name = tc.constraint_name and tc.constraint_type = 'PRIMARY KEY' " + - "where upper(col.table_schema) = upper(:schema) and upper(col.table_name) = upper(:table) " + - "order by col.column_name "; - Connection connect = getConnection(); - - NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); - stmt.setString("schema", schema); - stmt.setString("table", nameTable); - - ResultSet rs = stmt.executeQuery(); - while(rs.next()){ - DBTableField field = new DBTableField(); - field.setName(rs.getString("column_name").toLowerCase()); - if (rs.getString("constraint_name") != null) { - field.setIsPrimaryKey(true); - } - String typeSQL = getFieldType(rs); - field.setTypeSQL(typeSQL); - field.setIsNullable( !typeSQL.toLowerCase().contains("not null")); - field.setTypeUniversal(FieldType.fromString(rs.getString("tp"))); - field.setFixed(false); - field.setLength(rs.getInt("character_maximum_length")); - field.setPrecision(rs.getInt("numeric_precision")); - field.setScale(rs.getInt("numeric_scale")); - field.setFixed(rs.getBoolean("fixed")); - field.setOrder(rs.getInt("ordinal_position")); - listField.put(field.getName(), field); - } - stmt.close(); - - return listField; - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); - } - } - - protected String getFieldType(ResultSet rs) { - try { - StringBuilder type = new StringBuilder(); - type.append(rs.getString("data_type")); - - Integer max_length = rs.getInt("character_maximum_length"); - if (!rs.wasNull()) { - type.append("("+max_length.toString()+")"); - } - if (rs.getString("is_nullable").equals("NO")){ - type.append(" NOT NULL"); - } - - return type.toString(); - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); - } - } - - @Override - public Map getIndexes(String schema, String nameTable) { - Map indexes = new HashMap<>(); - try { - String query = "select i.schemaname,\r\n" + - "i.tablename, \r\n" + - "i.indexname, \r\n" + - "i.tablespace, \r\n" + - "i.indexdef as ddl \r\n" + - "from \r\n" + - "pg_indexes as i JOIN pg_class as cl \r\n" + - " on i.indexname = cl.relname\r\n" + - "JOIN pg_index AS idx \r\n" + - " ON cl.oid = idx.indexrelid\r\n" + - "where i.tablename not like 'pg%' and i.schemaname = :schema and i.tablename = :table and idx.indisprimary = false and idx.indisunique=false "; - - Connection connect = getConnection(); - NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); - stmt.setString("schema", schema); - stmt.setString("table", nameTable); - - ResultSet rs = stmt.executeQuery(); - while(rs.next()){ - DBIndex index = new DBIndex(); - index.setName(rs.getString("indexname")); - index.setSchema(schema); - rowToProperties(rs, index.getOptions()); - indexes.put(index.getName(), index); - } - stmt.close(); - - return indexes; - - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "indexes").toString()); - throw new ExceptionDBGitRunTime(e.getMessage()); - } - - } - - @Override - public Map getConstraints(String schema, String nameTable) { - Map constraints = new HashMap<>(); - try { - String query = "select conname as constraint_name,contype as constraint_type, " + - " pg_catalog.pg_get_constraintdef(r.oid, true) as ddl " + - "from " + - " pg_class c " + - " join pg_namespace n on n.oid = c.relnamespace " + - " join pg_catalog.pg_constraint r on r.conrelid = c.relfilenode " + - "WHERE " + - " relname = :table and nspname = :schema and c.relkind = 'r' "; - - Connection connect = getConnection(); - NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); - stmt.setString("table", nameTable); - stmt.setString("schema", schema); - - ResultSet rs = stmt.executeQuery(); - while(rs.next()){ - DBConstraint con = new DBConstraint(); - con.setName(rs.getString("constraint_name")); - con.setConstraintType(rs.getString("constraint_type")); - con.setSchema(schema); - rowToProperties(rs, con.getOptions()); - constraints.put(con.getName(), con); - } - stmt.close(); - - return constraints; - - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "constraints").toString()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "constraints").toString(), e); - } - } - - @Override - public Map getViews(String schema) { - Map listView = new HashMap(); - try { - String query = "select nsp.nspname as object_schema, " + - "cls.relname as object_name, rol.rolname as owner, 'create or replace view ' || nsp.nspname || '.' || cls.relname || ' as \n' || pg_get_viewdef(cls.oid) as ddl "+ - "from pg_class cls " + - " join pg_roles rol on rol.oid = cls.relowner" + - " join pg_namespace nsp on nsp.oid = cls.relnamespace " + - " where nsp.nspname not in ('information_schema', 'pg_catalog') " + - " and nsp.nspname not like 'pg_toast%' " + - "and cls.relkind = 'v' and nsp.nspname = '" + schema + "'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - DBView view = new DBView(rs.getString("object_name")); - view.setSchema(rs.getString("object_schema")); - view.setOwner(rs.getString("owner")); - rowToProperties(rs, view.getOptions()); - listView.put(rs.getString("object_name"), view); - } - stmt.close(); - return listView; - }catch(Exception e) { - logger.error(e.getMessage()); - System.out.println(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); - } - } - - @Override - public DBView getView(String schema, String name) { - DBView view = new DBView(name); - view.setSchema(schema); - try { - String query = "select nsp.nspname as object_schema, " + - "cls.relname as object_name, rol.rolname as owner, 'create or replace view ' || nsp.nspname || '.' || cls.relname || ' as \n' || pg_get_viewdef(cls.oid) as ddl "+ - "from pg_class cls " + - " join pg_roles rol on rol.oid = cls.relowner" + - " join pg_namespace nsp on nsp.oid = cls.relnamespace " + - " where nsp.nspname not in ('information_schema', 'pg_catalog') " + - " and nsp.nspname not like 'pg_toast%' " + - "and cls.relkind = 'v' and nsp.nspname = '" + schema + "' and cls.relname='"+name+"'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - while (rs.next()) { - view.setOwner(rs.getString("owner")); - rowToProperties(rs, view.getOptions()); - } - stmt.close(); - return view; - - }catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); - } - } - - @Override - public Map getTriggers(String schema) { - Map listTrigger = new HashMap(); - try { - String query = "SELECT trg.tgname, tbl.relname as trigger_table ,pg_get_triggerdef(trg.oid) AS ddl \r\n" + - "FROM pg_trigger trg\r\n" + - "JOIN pg_class tbl on trg.tgrelid = tbl.oid\r\n" + - "JOIN pg_namespace ns ON ns.oid = tbl.relnamespace\r\n" + - "and trg.tgconstraint=0 and ns.nspname like \'"+schema+"\'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("tgname"); - String sql = rs.getString("ddl"); - DBTrigger trigger = new DBTrigger(name); - trigger.setSchema(schema); - trigger.setOwner("postgres"); - rowToProperties(rs, trigger.getOptions()); - listTrigger.put(name, trigger); - } - stmt.close(); - return listTrigger; - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "triggers").toString(), e); - } - } - @Override - public DBTrigger getTrigger(String schema, String name) { - DBTrigger trigger = null; - try { - String query = "SELECT trg.tgname, tbl.relname as trigger_table ,pg_get_triggerdef(trg.oid) AS ddl \r\n" + - "FROM pg_trigger trg\r\n" + - "JOIN pg_class tbl on trg.tgrelid = tbl.oid\r\n" + - "JOIN pg_namespace ns ON ns.oid = tbl.relnamespace\r\n" + - "and trg.tgconstraint=0 and ns.nspname like \'"+schema+"\' and trg.tgname like \'"+name+"\'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String sql = rs.getString("ddl"); - trigger = new DBTrigger(name); - trigger.setSchema(schema); - trigger.setOwner("postgres"); - rowToProperties(rs, trigger.getOptions()); - } - stmt.close(); - return trigger; - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "triggers").toString(), e); - } - - } - @Override - public Map getPackages(String schema) { - // TODO Auto-generated method stub - return null; - } - - @Override - public DBPackage getPackage(String schema, String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Map getProcedures(String schema) { - // TODO Auto-generated method stub - return null; - } - - @Override - public DBProcedure getProcedure(String schema, String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Map getFunctions(String schema) { - Map listFunction = new HashMap(); - try { - String query = "SELECT n.nspname as \"schema\",u.rolname,\r\n" + - " p.proname as \"name\",\r\n" + - " pg_catalog.pg_get_function_arguments(p.oid) as \"arguments\",\r\n" + - " pg_get_functiondef(p.oid) AS ddl\r\n" + - "FROM pg_catalog.pg_proc p\r\n" + - " JOIN pg_catalog.pg_roles u ON u.oid = p.proowner\r\n" + - " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\r\n" + - "WHERE pg_catalog.pg_function_is_visible(p.oid)\r\n" + - " AND n.nspname = \'"+schema+"\'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("name"); - String owner = rs.getString("rolname"); - String args = rs.getString("arguments"); - DBFunction func = new DBFunction(name); - func.setSchema(schema); - func.setOwner(owner); - rowToProperties(rs,func.getOptions()); - //func.setArguments(args); - listFunction.put(name, func); - } - stmt.close(); - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "fnc").toString(), e); - } - return listFunction; - } - - @Override - public DBFunction getFunction(String schema, String name) { - - try { - String query = "SELECT n.nspname as \"schema\",u.rolname,\r\n" + - " p.proname as \"name\",\r\n" + - " pg_catalog.pg_get_function_arguments(p.oid) as \"arguments\",\r\n" + - " pg_get_functiondef(p.oid) AS ddl\r\n" + - "FROM pg_catalog.pg_proc p\r\n" + - " JOIN pg_catalog.pg_roles u ON u.oid = p.proowner\r\n" + - " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\r\n" + - "WHERE pg_catalog.pg_function_is_visible(p.oid)\r\n" + - " AND n.nspname = \'"+schema+ "\' AND p.proname=\'"+name+"\'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - - DBFunction func = null; - while (rs.next()) { - func = new DBFunction(rs.getString("name")); - String owner = rs.getString("rolname"); - String args = rs.getString("arguments"); - func.setSchema(schema); - func.setOwner(owner); - //func.setArguments(args); - rowToProperties(rs,func.getOptions()); - } - stmt.close(); - - return func; - - }catch(Exception e) { - throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "fnc").toString(), e); - } - } - - @Override - public DBTableData getTableDataPortion(String schema, String nameTable, int portionIndex, int tryNumber) { - DBTableData data = new DBTableData(); - - try { - int portionSize = DBGitConfig.getInstance().getInteger("core", "PORTION_SIZE", DBGitConfig.getInstance().getIntegerGlobal("core", "PORTION_SIZE", 1000)); - - int begin = 1 + portionSize*portionIndex; - int end = portionSize + portionSize*portionIndex; - - Statement st = getConnection().createStatement(); - ResultSet rs = st.executeQuery(" SELECT * FROM \r\n" + - " (SELECT f.*, ROW_NUMBER() OVER (ORDER BY ctid) DBGIT_ROW_NUM FROM " + schema + "." + nameTable + " f) s\r\n" + - " WHERE DBGIT_ROW_NUM BETWEEN " + begin + " and " + end); - data.setResultSet(rs); - return data; - } catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tableData").toString(), e); - - try { - if (tryNumber <= DBGitConfig.getInstance().getInteger("core", "TRY_COUNT", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_COUNT", 1000))) { - try { - TimeUnit.SECONDS.sleep(DBGitConfig.getInstance().getInteger("core", "TRY_DELAY", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_DELAY", 1000))); - } catch (InterruptedException e1) { - throw new ExceptionDBGitRunTime(e1.getMessage()); - } - ConsoleWriter.println("Error while getting portion of data, try " + tryNumber); - getTableDataPortion(schema, nameTable, portionIndex, tryNumber++); - } - } catch (Exception e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - - try { - getConnection().rollback(); - } catch (Exception e2) { - logger.error(lang.getValue("errors", "adapter", "rollback").toString(), e2); - } - throw new ExceptionDBGitRunTime(e.getMessage()); - } - } - - @Override - public DBTableData getTableData(String schema, String nameTable) { - String tableName = schema+"."+nameTable; - try { - DBTableData data = new DBTableData(); - - int maxRowsCount = DBGitConfig.getInstance().getInteger("core", "MAX_ROW_COUNT_FETCH", DBGitConfig.getInstance().getIntegerGlobal("core", "MAX_ROW_COUNT_FETCH", MAX_ROW_COUNT_FETCH)); - - if (DBGitConfig.getInstance().getBoolean("core", "LIMIT_FETCH", DBGitConfig.getInstance().getBooleanGlobal("core", "LIMIT_FETCH", true))) { - Statement st = getConnection().createStatement(); - String query = "select COALESCE(count(*), 0) kolvo from ( select 1 from "+ - tableName + " limit " + (maxRowsCount + 1) + " ) tbl"; - ResultSet rs = st.executeQuery(query); - rs.next(); - if (rs.getInt("kolvo") > maxRowsCount) { - data.setErrorFlag(DBTableData.ERROR_LIMIT_ROWS); - return data; - } - } - Statement st = getConnection().createStatement(); - ResultSet rs = st.executeQuery("select * from "+tableName); - data.setResultSet(rs); - - //TODO other state - - return data; - } catch(Exception e) { - logger.error(lang.getValue("errors", "adapter", "tableData").toString(), e); - try { - getConnection().rollback(); - } catch (Exception e2) { - logger.error(lang.getValue("errors", "adapter", "rollback").toString(), e2); - } - throw new ExceptionDBGitRunTime(e.getMessage()); - } - } -/* - @Override - public DBTableRow getTableRow(DBTable tbl, Object id) { - // TODO Auto-generated method stub - return null; - } -*/ - @Override - public Map getUsers() { - Map listUser = new HashMap(); - try { - String query = "select *from pg_user"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString(1); - DBUser user = new DBUser(name); - listUser.put(name, user); - } - stmt.close(); - }catch(Exception e) { - logger.error(e.getMessage()); - throw new ExceptionDBGitRunTime(e.getMessage()); - } - //connect.cre - //select *from pg_catalog.pg_namespace; - return listUser; - } - - @Override - public Map getRoles() { - Map listRole = new HashMap(); - try { - String query = "select *,array_to_string(array(SELECT rolname " + - "FROM pg_roles,pg_auth_members " + - "WHERE member = auth.oid and roleid=oid), ', ') as rolmemberof from pg_authid as auth where auth.rolname not like 'pg_%'"; - Connection connect = getConnection(); - Statement stmt = connect.createStatement(); - ResultSet rs = stmt.executeQuery(query); - while(rs.next()){ - String name = rs.getString("rolname"); - DBRole role = new DBRole(name); - rowToProperties(rs, role.getOptions()); - listRole.put(name, role); - } - stmt.close(); - }catch(Exception e) { - logger.error(e.getMessage()); - throw new ExceptionDBGitRunTime(e.getMessage()); - } - return listRole; - } - - @Override - public boolean userHasRightsToGetDdlOfOtherUsers() { - return true; - } - - @Override - public IFactoryDBBackupAdapter getBackupAdapterFactory() { - return backupFactory; - } - - @Override - public DbType getDbType() { - return DbType.POSTGRES; - } - - @Override - public String getDbVersion() { - try { - PreparedStatement stmt = getConnection().prepareStatement("SHOW server_version"); - ResultSet resultSet = stmt.executeQuery(); - resultSet.next(); - - String result = resultSet.getString("server_version"); - resultSet.close(); - stmt.close(); - - return result; - } catch (SQLException e) { - return ""; - } - } - - @Override - public IFactoryDBConvertAdapter getConvertAdapterFactory() { - return convertFactory; - } - - @Override - public void createSchemaIfNeed(String schemaName) throws ExceptionDBGit { - try { - Statement st = connect.createStatement(); - ResultSet rs = st.executeQuery("select count(*) cnt from information_schema.schemata where upper(schema_name) = '" + - schemaName.toUpperCase() + "'"); - - rs.next(); - if (rs.getInt("cnt") == 0) { - StatementLogging stLog = new StatementLogging(connect, getStreamOutputSqlCommand(), isExecSql()); - stLog.execute("create schema " + schemaName); - - stLog.close(); - } - - rs.close(); - st.close(); - } catch (SQLException e) { - throw new ExceptionDBGit(lang.getValue("errors", "adapter", "createSchema") + ": " + e.getLocalizedMessage()); - } - - } - - @Override - public void createRoleIfNeed(String roleName) throws ExceptionDBGit { - try { - Statement st = connect.createStatement(); - ResultSet rs = st.executeQuery("select count(*) cnt from pg_catalog.pg_roles where upper(rolname) = '" + - roleName.toUpperCase() + "'"); - - rs.next(); - if (rs.getInt("cnt") == 0) { - StatementLogging stLog = new StatementLogging(connect, getStreamOutputSqlCommand(), isExecSql()); - stLog.execute("CREATE ROLE " + roleName + " LOGIN PASSWORD '" + roleName + "'"); - - stLog.close(); - } - - connect.commit(); - rs.close(); - st.close(); - } catch (SQLException e) { - throw new ExceptionDBGit(lang.getValue("errors", "adapter", "createSchema") + ": " + e.getLocalizedMessage()); - } - } - - @Override - public String getDefaultScheme() throws ExceptionDBGit { - return "public"; - } - - @Override - public boolean isReservedWord(String word) { - Set reservedWords = new HashSet<>(); - - reservedWords.add("A"); - reservedWords.add("ABORT"); - reservedWords.add("ABS"); - reservedWords.add("ABSOLUTE"); - reservedWords.add("ACCESS"); - reservedWords.add("ACTION"); - reservedWords.add("ADA"); - reservedWords.add("ADD"); - reservedWords.add("ADMIN"); - reservedWords.add("AFTER"); - reservedWords.add("AGGREGATE"); - reservedWords.add("ALIAS"); - reservedWords.add("ALL"); - reservedWords.add("ALLOCATE"); - reservedWords.add("ALSO"); - reservedWords.add("ALTER"); - reservedWords.add("ALWAYS"); - reservedWords.add("ANALYSE"); - reservedWords.add("ANALYZE"); - reservedWords.add("AND"); - reservedWords.add("ANY"); - reservedWords.add("ARE"); - reservedWords.add("ARRAY"); - reservedWords.add("AS"); - reservedWords.add("ASC"); - reservedWords.add("ASENSITIVE"); - reservedWords.add("ASSERTION"); - reservedWords.add("ASSIGNMENT"); - reservedWords.add("ASYMMETRIC"); - reservedWords.add("AT"); - reservedWords.add("ATOMIC"); - reservedWords.add("ATTRIBUTE"); - reservedWords.add("ATTRIBUTES"); - reservedWords.add("AUTHORIZATION"); - reservedWords.add("AVG"); - reservedWords.add("BACKWARD"); - reservedWords.add("BEFORE"); - reservedWords.add("BEGIN"); - reservedWords.add("BERNOULLI"); - reservedWords.add("BETWEEN"); - reservedWords.add("BIGINT"); - reservedWords.add("BINARY"); - reservedWords.add("BIT"); - reservedWords.add("BITVAR"); - reservedWords.add("BIT_LENGTH"); - reservedWords.add("BLOB"); - reservedWords.add("BOOLEAN"); - reservedWords.add("BOTH"); - reservedWords.add("BREADTH"); - reservedWords.add("BY"); - reservedWords.add("C"); - reservedWords.add("CACHE"); - reservedWords.add("CALL"); - reservedWords.add("CALLED"); - reservedWords.add("CARDINALITY"); - reservedWords.add("CASCADE"); - reservedWords.add("CASCADED"); - reservedWords.add("CASE"); - reservedWords.add("CAST"); - reservedWords.add("CATALOG"); - reservedWords.add("CATALOG_NAME"); - reservedWords.add("CEIL"); - reservedWords.add("CEILING"); - reservedWords.add("CHAIN"); - reservedWords.add("CHAR"); - reservedWords.add("CHARACTER"); - reservedWords.add("CHARACTERISTICS"); - reservedWords.add("CHARACTERS"); - reservedWords.add("CHARACTER_LENGTH"); - reservedWords.add("CHARACTER_SET_CATALOG"); - reservedWords.add("CHARACTER_SET_NAME"); - reservedWords.add("CHARACTER_SET_SCHEMA"); - reservedWords.add("CHAR_LENGTH"); - reservedWords.add("CHECK"); - reservedWords.add("CHECKED"); - reservedWords.add("CHECKPOINT"); - reservedWords.add("CLASS"); - reservedWords.add("CLASS_ORIGIN"); - reservedWords.add("CLOB"); - reservedWords.add("CLOSE"); - reservedWords.add("CLUSTER"); - reservedWords.add("COALESCE"); - reservedWords.add("COBOL"); - reservedWords.add("COLLATE"); - reservedWords.add("COLLATION"); - reservedWords.add("COLLATION_CATALOG"); - reservedWords.add("COLLATION_NAME"); - reservedWords.add("COLLATION_SCHEMA"); - reservedWords.add("COLLECT"); - reservedWords.add("COLUMN"); - reservedWords.add("COLUMN_NAME"); - reservedWords.add("COMMAND_FUNCTION"); - reservedWords.add("COMMAND_FUNCTION_CODE"); - reservedWords.add("COMMENT"); - reservedWords.add("COMMIT"); - reservedWords.add("COMMITTED"); - reservedWords.add("COMPLETION"); - reservedWords.add("CONDITION"); - reservedWords.add("CONDITION_NUMBER"); - reservedWords.add("CONNECT"); - reservedWords.add("CONNECTION"); - reservedWords.add("CONNECTION_NAME"); - reservedWords.add("CONSTRAINT"); - reservedWords.add("CONSTRAINTS"); - reservedWords.add("CONSTRAINT_CATALOG"); - reservedWords.add("CONSTRAINT_NAME"); - reservedWords.add("CONSTRAINT_SCHEMA"); - reservedWords.add("CONSTRUCTOR"); - reservedWords.add("CONTAINS"); - reservedWords.add("CONTINUE"); - reservedWords.add("CONVERSION"); - reservedWords.add("CONVERT"); - reservedWords.add("COPY"); - reservedWords.add("CORR"); - reservedWords.add("CORRESPONDING"); - reservedWords.add("COUNT"); - reservedWords.add("COVAR_POP"); - reservedWords.add("COVAR_SAMP"); - reservedWords.add("CREATE"); - reservedWords.add("CREATEDB"); - reservedWords.add("CREATEROLE"); - reservedWords.add("CREATEUSER"); - reservedWords.add("CROSS"); - reservedWords.add("CSV"); - reservedWords.add("CUBE"); - reservedWords.add("CUME_DIST"); - reservedWords.add("CURRENT"); - reservedWords.add("CURRENT_DATE"); - reservedWords.add("CURRENT_DEFAULT_TRANSFORM_GROUP"); - reservedWords.add("CURRENT_PATH"); - reservedWords.add("CURRENT_ROLE"); - reservedWords.add("CURRENT_TIME"); - reservedWords.add("CURRENT_TIMESTAMP"); - reservedWords.add("CURRENT_TRANSFORM_GROUP_FOR_TYPE"); - reservedWords.add("CURRENT_USER"); - reservedWords.add("CURSOR"); - reservedWords.add("CURSOR_NAME"); - reservedWords.add("CYCLE"); - reservedWords.add("DATA"); - reservedWords.add("DATABASE"); - reservedWords.add("DATE"); - reservedWords.add("DATETIME_INTERVAL_CODE"); - reservedWords.add("DATETIME_INTERVAL_PRECISION"); - reservedWords.add("DAY"); - reservedWords.add("DEALLOCATE"); - reservedWords.add("DEC"); - reservedWords.add("DECIMAL"); - reservedWords.add("DECLARE"); - reservedWords.add("DEFAULT"); - reservedWords.add("DEFAULTS"); - reservedWords.add("DEFERRABLE"); - reservedWords.add("DEFERRED"); - reservedWords.add("DEFINED"); - reservedWords.add("DEFINER"); - reservedWords.add("DEGREE"); - reservedWords.add("DELETE"); - reservedWords.add("DELIMITER"); - reservedWords.add("DELIMITERS"); - reservedWords.add("DENSE_RANK"); - reservedWords.add("DEPTH"); - reservedWords.add("DEREF"); - reservedWords.add("DERIVED"); - reservedWords.add("DESC"); - reservedWords.add("DESCRIBE"); - reservedWords.add("DESCRIPTOR"); - reservedWords.add("DESTROY"); - reservedWords.add("DESTRUCTOR"); - reservedWords.add("DETERMINISTIC"); - reservedWords.add("DIAGNOSTICS"); - reservedWords.add("DICTIONARY"); - reservedWords.add("DISABLE"); - reservedWords.add("DISCONNECT"); - reservedWords.add("DISPATCH"); - reservedWords.add("DISTINCT"); - reservedWords.add("DO"); - reservedWords.add("DOMAIN"); - reservedWords.add("DOUBLE"); - reservedWords.add("DROP"); - reservedWords.add("DYNAMIC"); - reservedWords.add("DYNAMIC_FUNCTION"); - reservedWords.add("DYNAMIC_FUNCTION_CODE"); - reservedWords.add("EACH"); - reservedWords.add("ELEMENT"); - reservedWords.add("ELSE"); - reservedWords.add("ENABLE"); - reservedWords.add("ENCODING"); - reservedWords.add("ENCRYPTED"); - reservedWords.add("END"); - reservedWords.add("END-EXEC"); - reservedWords.add("EQUALS"); - reservedWords.add("ESCAPE"); - reservedWords.add("EVERY"); - reservedWords.add("EXCEPT"); - reservedWords.add("EXCEPTION"); - reservedWords.add("EXCLUDE"); - reservedWords.add("EXCLUDING"); - reservedWords.add("EXCLUSIVE"); - reservedWords.add("EXEC"); - reservedWords.add("EXECUTE"); - reservedWords.add("EXISTING"); - reservedWords.add("EXISTS"); - reservedWords.add("EXP"); - reservedWords.add("EXPLAIN"); - reservedWords.add("EXTERNAL"); - reservedWords.add("EXTRACT"); - reservedWords.add("FALSE"); - reservedWords.add("FETCH"); - reservedWords.add("FILTER"); - reservedWords.add("FINAL"); - reservedWords.add("FIRST"); - reservedWords.add("FLOAT"); - reservedWords.add("FLOOR"); - reservedWords.add("FOLLOWING"); - reservedWords.add("FOR"); - reservedWords.add("FORCE"); - reservedWords.add("FOREIGN"); - reservedWords.add("FORTRAN"); - reservedWords.add("FORWARD"); - reservedWords.add("FOUND"); - reservedWords.add("FREE"); - reservedWords.add("FREEZE"); - reservedWords.add("FROM"); - reservedWords.add("FULL"); - reservedWords.add("FUNCTION"); - reservedWords.add("FUSION"); - reservedWords.add("G"); - reservedWords.add("GENERAL"); - reservedWords.add("GENERATED"); - reservedWords.add("GET"); - reservedWords.add("GLOBAL"); - reservedWords.add("GO"); - reservedWords.add("GOTO"); - reservedWords.add("GRANT"); - reservedWords.add("GRANTED"); - reservedWords.add("GREATEST"); - reservedWords.add("GROUP"); - reservedWords.add("GROUPING"); - reservedWords.add("HANDLER"); - reservedWords.add("HAVING"); - reservedWords.add("HEADER"); - reservedWords.add("HIERARCHY"); - reservedWords.add("HOLD"); - reservedWords.add("HOST"); - reservedWords.add("HOUR"); - reservedWords.add("IDENTITY"); - reservedWords.add("IGNORE"); - reservedWords.add("ILIKE"); - reservedWords.add("IMMEDIATE"); - reservedWords.add("IMMUTABLE"); - reservedWords.add("IMPLEMENTATION"); - reservedWords.add("IMPLICIT"); - reservedWords.add("IN"); - reservedWords.add("INCLUDING"); - reservedWords.add("INCREMENT"); - reservedWords.add("INDEX"); - reservedWords.add("INDICATOR"); - reservedWords.add("INFIX"); - reservedWords.add("INHERIT"); - reservedWords.add("INHERITS"); - reservedWords.add("INITIALIZE"); - reservedWords.add("INITIALLY"); - reservedWords.add("INNER"); - reservedWords.add("INOUT"); - reservedWords.add("INPUT"); - reservedWords.add("INSENSITIVE"); - reservedWords.add("INSERT"); - reservedWords.add("INSTANCE"); - reservedWords.add("INSTANTIABLE"); - reservedWords.add("INSTEAD"); - reservedWords.add("INT"); - reservedWords.add("INTEGER"); - reservedWords.add("INTERSECT"); - reservedWords.add("INTERSECTION"); - reservedWords.add("INTERVAL"); - reservedWords.add("INTO"); - reservedWords.add("INVOKER"); - reservedWords.add("IS"); - reservedWords.add("ISNULL"); - reservedWords.add("ISOLATION"); - reservedWords.add("ITERATE"); - reservedWords.add("JOIN"); - reservedWords.add("K"); - reservedWords.add("KEY"); - reservedWords.add("KEY_MEMBER"); - reservedWords.add("KEY_TYPE"); - reservedWords.add("LANCOMPILER"); - reservedWords.add("LANGUAGE"); - reservedWords.add("LARGE"); - reservedWords.add("LAST"); - reservedWords.add("LATERAL"); - reservedWords.add("LEADING"); - reservedWords.add("LEAST"); - reservedWords.add("LEFT"); - reservedWords.add("LENGTH"); - reservedWords.add("LESS"); - reservedWords.add("LEVEL"); - reservedWords.add("LIKE"); - reservedWords.add("LIMIT"); - reservedWords.add("LISTEN"); - reservedWords.add("LN"); - reservedWords.add("LOAD"); - reservedWords.add("LOCAL"); - reservedWords.add("LOCALTIME"); - reservedWords.add("LOCALTIMESTAMP"); - reservedWords.add("LOCATION"); - reservedWords.add("LOCATOR"); - reservedWords.add("LOCK"); - reservedWords.add("LOGIN"); - reservedWords.add("LOWER"); - reservedWords.add("M"); - reservedWords.add("MAP"); - reservedWords.add("MATCH"); - reservedWords.add("MATCHED"); - reservedWords.add("MAX"); - reservedWords.add("MAXVALUE"); - reservedWords.add("MEMBER"); - reservedWords.add("MERGE"); - reservedWords.add("MESSAGE_LENGTH"); - reservedWords.add("MESSAGE_OCTET_LENGTH"); - reservedWords.add("MESSAGE_TEXT"); - reservedWords.add("METHOD"); - reservedWords.add("MIN"); - reservedWords.add("MINUTE"); - reservedWords.add("MINVALUE"); - reservedWords.add("MOD"); - reservedWords.add("MODE"); - reservedWords.add("MODIFIES"); - reservedWords.add("MODIFY"); - reservedWords.add("MODULE"); - reservedWords.add("MONTH"); - reservedWords.add("MORE"); - reservedWords.add("MOVE"); - reservedWords.add("MULTISET"); - reservedWords.add("MUMPS"); - reservedWords.add("NAME"); - reservedWords.add("NAMES"); - reservedWords.add("NATIONAL"); - reservedWords.add("NATURAL"); - reservedWords.add("NCHAR"); - reservedWords.add("NCLOB"); - reservedWords.add("NESTING"); - reservedWords.add("NEW"); - reservedWords.add("NEXT"); - reservedWords.add("NO"); - reservedWords.add("NOCREATEDB"); - reservedWords.add("NOCREATEROLE"); - reservedWords.add("NOCREATEUSER"); - reservedWords.add("NOINHERIT"); - reservedWords.add("NOLOGIN"); - reservedWords.add("NONE"); - reservedWords.add("NORMALIZE"); - reservedWords.add("NORMALIZED"); - reservedWords.add("NOSUPERUSER"); - reservedWords.add("NOT"); - reservedWords.add("NOTHING"); - reservedWords.add("NOTIFY"); - reservedWords.add("NOTNULL"); - reservedWords.add("NOWAIT"); - reservedWords.add("NULL"); - reservedWords.add("NULLABLE"); - reservedWords.add("NULLIF"); - reservedWords.add("NULLS"); - reservedWords.add("NUMBER"); - reservedWords.add("NUMERIC"); - reservedWords.add("OBJECT"); - reservedWords.add("OCTETS"); - reservedWords.add("OCTET_LENGTH"); - reservedWords.add("OF"); - reservedWords.add("OFF"); - reservedWords.add("OFFSET"); - reservedWords.add("OIDS"); - reservedWords.add("OLD"); - reservedWords.add("ON"); - reservedWords.add("ONLY"); - reservedWords.add("OPEN"); - reservedWords.add("OPERATION"); - reservedWords.add("OPERATOR"); - reservedWords.add("OPTION"); - reservedWords.add("OPTIONS"); - reservedWords.add("OR"); - reservedWords.add("ORDER"); - reservedWords.add("ORDERING"); - reservedWords.add("ORDINALITY"); - reservedWords.add("OTHERS"); - reservedWords.add("OUT"); - reservedWords.add("OUTER"); - reservedWords.add("OUTPUT"); - reservedWords.add("OVER"); - reservedWords.add("OVERLAPS"); - reservedWords.add("OVERLAY"); - reservedWords.add("OVERRIDING"); - reservedWords.add("OWNER"); - reservedWords.add("PAD"); - reservedWords.add("PARAMETER"); - reservedWords.add("PARAMETERS"); - reservedWords.add("PARAMETER_MODE"); - reservedWords.add("PARAMETER_NAME"); - reservedWords.add("PARAMETER_ORDINAL_POSITION"); - reservedWords.add("PARAMETER_SPECIFIC_CATALOG"); - reservedWords.add("PARAMETER_SPECIFIC_NAME"); - reservedWords.add("PARAMETER_SPECIFIC_SCHEMA"); - reservedWords.add("PARTIAL"); - reservedWords.add("PARTITION"); - reservedWords.add("PASCAL"); - reservedWords.add("PASSWORD"); - reservedWords.add("PATH"); - reservedWords.add("PERCENTILE_CONT"); - reservedWords.add("PERCENTILE_DISC"); - reservedWords.add("PERCENT_RANK"); - reservedWords.add("PLACING"); - reservedWords.add("PLI"); - reservedWords.add("POSITION"); - reservedWords.add("POSTFIX"); - reservedWords.add("POWER"); - reservedWords.add("PRECEDING"); - reservedWords.add("PRECISION"); - reservedWords.add("PREFIX"); - reservedWords.add("PREORDER"); - reservedWords.add("PREPARE"); - reservedWords.add("PREPARED"); - reservedWords.add("PRESERVE"); - reservedWords.add("PRIMARY"); - reservedWords.add("PRIOR"); - reservedWords.add("PRIVILEGES"); - reservedWords.add("PROCEDURAL"); - reservedWords.add("PROCEDURE"); - reservedWords.add("PUBLIC"); - reservedWords.add("QUOTE"); - reservedWords.add("RANGE"); - reservedWords.add("RANK"); - reservedWords.add("READ"); - reservedWords.add("READS"); - reservedWords.add("REAL"); - reservedWords.add("RECHECK"); - reservedWords.add("RECURSIVE"); - reservedWords.add("REF"); - reservedWords.add("REFERENCES"); - reservedWords.add("REFERENCING"); - reservedWords.add("REGR_AVGX"); - reservedWords.add("REGR_AVGY"); - reservedWords.add("REGR_COUNT"); - reservedWords.add("REGR_INTERCEPT"); - reservedWords.add("REGR_R2"); - reservedWords.add("REGR_SLOPE"); - reservedWords.add("REGR_SXX"); - reservedWords.add("REGR_SXY"); - reservedWords.add("REGR_SYY"); - reservedWords.add("REINDEX"); - reservedWords.add("RELATIVE"); - reservedWords.add("RELEASE"); - reservedWords.add("RENAME"); - reservedWords.add("REPEATABLE"); - reservedWords.add("REPLACE"); - reservedWords.add("RESET"); - reservedWords.add("RESTART"); - reservedWords.add("RESTRICT"); - reservedWords.add("RESULT"); - reservedWords.add("RETURN"); - reservedWords.add("RETURNED_CARDINALITY"); - reservedWords.add("RETURNED_LENGTH"); - reservedWords.add("RETURNED_OCTET_LENGTH"); - reservedWords.add("RETURNED_SQLSTATE"); - reservedWords.add("RETURNS"); - reservedWords.add("REVOKE"); - reservedWords.add("RIGHT"); - reservedWords.add("ROLE"); - reservedWords.add("ROLLBACK"); - reservedWords.add("ROLLUP"); - reservedWords.add("ROUTINE"); - reservedWords.add("ROUTINE_CATALOG"); - reservedWords.add("ROUTINE_NAME"); - reservedWords.add("ROUTINE_SCHEMA"); - reservedWords.add("ROW"); - reservedWords.add("ROWS"); - reservedWords.add("ROW_COUNT"); - reservedWords.add("ROW_NUMBER"); - reservedWords.add("RULE"); - reservedWords.add("SAVEPOINT"); - reservedWords.add("SCALE"); - reservedWords.add("SCHEMA"); - reservedWords.add("SCHEMA_NAME"); - reservedWords.add("SCOPE"); - reservedWords.add("SCOPE_CATALOG"); - reservedWords.add("SCOPE_NAME"); - reservedWords.add("SCOPE_SCHEMA"); - reservedWords.add("SCROLL"); - reservedWords.add("SEARCH"); - reservedWords.add("SECOND"); - reservedWords.add("SECTION"); - reservedWords.add("SECURITY"); - reservedWords.add("SELECT"); - reservedWords.add("SELF"); - reservedWords.add("SENSITIVE"); - reservedWords.add("SEQUENCE"); - reservedWords.add("SERIALIZABLE"); - reservedWords.add("SERVER_NAME"); - reservedWords.add("SESSION"); - reservedWords.add("SESSION_USER"); - reservedWords.add("SET"); - reservedWords.add("SETOF"); - reservedWords.add("SETS"); - reservedWords.add("SHARE"); - reservedWords.add("SHOW"); - reservedWords.add("SIMILAR"); - reservedWords.add("SIMPLE"); - reservedWords.add("SIZE"); - reservedWords.add("SMALLINT"); - reservedWords.add("SOME"); - reservedWords.add("SOURCE"); - reservedWords.add("SPACE"); - reservedWords.add("SPECIFIC"); - reservedWords.add("SPECIFICTYPE"); - reservedWords.add("SPECIFIC_NAME"); - reservedWords.add("SQL"); - reservedWords.add("SQLCODE"); - reservedWords.add("SQLERROR"); - reservedWords.add("SQLEXCEPTION"); - reservedWords.add("SQLSTATE"); - reservedWords.add("SQLWARNING"); - reservedWords.add("SQRT"); - reservedWords.add("STABLE"); - reservedWords.add("START"); - reservedWords.add("STATE"); - reservedWords.add("STATEMENT"); - reservedWords.add("STATIC"); - reservedWords.add("STATISTICS"); - reservedWords.add("STDDEV_POP"); - reservedWords.add("STDDEV_SAMP"); - reservedWords.add("STDIN"); - reservedWords.add("STDOUT"); - reservedWords.add("STORAGE"); - reservedWords.add("STRICT"); - reservedWords.add("STRUCTURE"); - reservedWords.add("STYLE"); - reservedWords.add("SUBCLASS_ORIGIN"); - reservedWords.add("SUBLIST"); - reservedWords.add("SUBMULTISET"); - reservedWords.add("SUBSTRING"); - reservedWords.add("SUM"); - reservedWords.add("SUPERUSER"); - reservedWords.add("SYMMETRIC"); - reservedWords.add("SYSID"); - reservedWords.add("SYSTEM"); - reservedWords.add("SYSTEM_USER"); - reservedWords.add("TABLE"); - reservedWords.add("TABLESAMPLE"); - reservedWords.add("TABLESPACE"); - reservedWords.add("TABLE_NAME"); - reservedWords.add("TEMP"); - reservedWords.add("TEMPLATE"); - reservedWords.add("TEMPORARY"); - reservedWords.add("TERMINATE"); - reservedWords.add("THAN"); - reservedWords.add("THEN"); - reservedWords.add("TIES"); - reservedWords.add("TIME"); - reservedWords.add("TIMESTAMP"); - reservedWords.add("TIMEZONE_HOUR"); - reservedWords.add("TIMEZONE_MINUTE"); - reservedWords.add("TO"); - reservedWords.add("TOAST"); - reservedWords.add("TOP_LEVEL_COUNT"); - reservedWords.add("TRAILING"); - reservedWords.add("TRANSACTION"); - reservedWords.add("TRANSACTIONS_COMMITTED"); - reservedWords.add("TRANSACTIONS_ROLLED_BACK"); - reservedWords.add("TRANSACTION_ACTIVE"); - reservedWords.add("TRANSFORM"); - reservedWords.add("TRANSFORMS"); - reservedWords.add("TRANSLATE"); - reservedWords.add("TRANSLATION"); - reservedWords.add("TREAT"); - reservedWords.add("TRIGGER"); - reservedWords.add("TRIGGER_CATALOG"); - reservedWords.add("TRIGGER_NAME"); - reservedWords.add("TRIGGER_SCHEMA"); - reservedWords.add("TRIM"); - reservedWords.add("TRUE"); - reservedWords.add("TRUNCATE"); - reservedWords.add("TRUSTED"); - reservedWords.add("TYPE"); - reservedWords.add("UESCAPE"); - reservedWords.add("UNBOUNDED"); - reservedWords.add("UNCOMMITTED"); - reservedWords.add("UNDER"); - reservedWords.add("UNENCRYPTED"); - reservedWords.add("UNION"); - reservedWords.add("UNIQUE"); - reservedWords.add("UNKNOWN"); - reservedWords.add("UNLISTEN"); - reservedWords.add("UNNAMED"); - reservedWords.add("UNNEST"); - reservedWords.add("UNTIL"); - reservedWords.add("UPDATE"); - reservedWords.add("UPPER"); - reservedWords.add("USAGE"); - reservedWords.add("USER"); - reservedWords.add("USER_DEFINED_TYPE_CATALOG"); - reservedWords.add("USER_DEFINED_TYPE_CODE"); - reservedWords.add("USER_DEFINED_TYPE_NAME"); - reservedWords.add("USER_DEFINED_TYPE_SCHEMA"); - reservedWords.add("USING"); - reservedWords.add("VACUUM"); - reservedWords.add("VALID"); - reservedWords.add("VALIDATOR"); - reservedWords.add("VALUE"); - reservedWords.add("VALUES"); - reservedWords.add("VARCHAR"); - reservedWords.add("VARIABLE"); - reservedWords.add("VARYING"); - reservedWords.add("VAR_POP"); - reservedWords.add("VAR_SAMP"); - reservedWords.add("VERBOSE"); - reservedWords.add("VIEW"); - reservedWords.add("VOLATILE"); - reservedWords.add("WHEN"); - reservedWords.add("WHENEVER"); - reservedWords.add("WHERE"); - reservedWords.add("WIDTH_BUCKET"); - reservedWords.add("WINDOW"); - reservedWords.add("WITH"); - reservedWords.add("WITHIN"); - reservedWords.add("WITHOUT"); - reservedWords.add("WORK"); - reservedWords.add("WRITE"); - reservedWords.add("YEAR"); - reservedWords.add("ZONE"); - - return reservedWords.contains(word.toUpperCase()); - } - - -} +package ru.fusionsoft.dbgit.postgres; + + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import ru.fusionsoft.dbgit.adapters.AdapterFactory; +import ru.fusionsoft.dbgit.adapters.DBAdapter; +import ru.fusionsoft.dbgit.adapters.IFactoryDBAdapterRestoteMetaData; +import ru.fusionsoft.dbgit.adapters.IFactoryDBBackupAdapter; +import ru.fusionsoft.dbgit.adapters.IFactoryDBConvertAdapter; +import ru.fusionsoft.dbgit.core.DBGitConfig; +import ru.fusionsoft.dbgit.core.ExceptionDBGit; +import ru.fusionsoft.dbgit.core.ExceptionDBGitObjectNotFound; +import ru.fusionsoft.dbgit.core.ExceptionDBGitRunTime; +import ru.fusionsoft.dbgit.core.db.DbType; +import ru.fusionsoft.dbgit.core.db.FieldType; +import ru.fusionsoft.dbgit.data_table.MapFileData; +import ru.fusionsoft.dbgit.data_table.BooleanData; +import ru.fusionsoft.dbgit.data_table.DateData; +import ru.fusionsoft.dbgit.data_table.FactoryCellData; +import ru.fusionsoft.dbgit.data_table.LongData; +import ru.fusionsoft.dbgit.data_table.StringData; +import ru.fusionsoft.dbgit.data_table.TextFileData; +import ru.fusionsoft.dbgit.dbobjects.DBConstraint; +import ru.fusionsoft.dbgit.dbobjects.DBFunction; +import ru.fusionsoft.dbgit.dbobjects.DBIndex; +import ru.fusionsoft.dbgit.dbobjects.DBPackage; +import ru.fusionsoft.dbgit.dbobjects.DBProcedure; +import ru.fusionsoft.dbgit.dbobjects.DBRole; +import ru.fusionsoft.dbgit.dbobjects.DBSchema; +import ru.fusionsoft.dbgit.dbobjects.DBSequence; +import ru.fusionsoft.dbgit.dbobjects.DBTable; +import ru.fusionsoft.dbgit.dbobjects.DBTableData; +import ru.fusionsoft.dbgit.dbobjects.DBTableField; +import ru.fusionsoft.dbgit.dbobjects.DBTableRow; +import ru.fusionsoft.dbgit.dbobjects.DBTableSpace; +import ru.fusionsoft.dbgit.dbobjects.DBTrigger; +import ru.fusionsoft.dbgit.dbobjects.DBUser; +import ru.fusionsoft.dbgit.dbobjects.DBView; +import ru.fusionsoft.dbgit.meta.IMapMetaObject; +import ru.fusionsoft.dbgit.meta.IMetaObject; +import ru.fusionsoft.dbgit.statement.StatementLogging; +import ru.fusionsoft.dbgit.utils.ConsoleWriter; +import ru.fusionsoft.dbgit.utils.LoggerUtil; +import org.slf4j.Logger; + +import com.axiomalaska.jdbc.NamedParameterPreparedStatement; + + +public class DBAdapterPostgres extends DBAdapter { + private Logger logger = LoggerUtil.getLogger(this.getClass()); + private FactoryDBAdapterRestorePostgres restoreFactory = new FactoryDBAdapterRestorePostgres(); + private FactoryDbConvertAdapterPostgres convertFactory = new FactoryDbConvertAdapterPostgres(); + private FactoryDBBackupAdapterPostgres backupFactory = new FactoryDBBackupAdapterPostgres(); + + @Override + public IFactoryDBAdapterRestoteMetaData getFactoryRestore() { + return restoreFactory; + } + + @Override + public void startUpdateDB() { + // TODO Auto-generated method stub + + } + + @Override + public void endUpdateDB() { + // TODO Auto-generated method stub + + } + + @Override + public IMapMetaObject loadCustomMetaObjects() { + return null; + } + + @Override + public Map getSchemes() { + Map listScheme = new HashMap(); + try { + String query = "select nspname,usename,nspacl from pg_namespace,pg_user where nspname!='pg_toast' and nspname!='pg_temp_1'"+ + "and nspname!='pg_toast_temp_1' and nspname!='pg_catalog'"+ + "and nspname!='information_schema' and nspname!='pgagent'"+ + "and nspname!='pg_temp_3' and nspname!='pg_toast_temp_3'"+ + "and usesysid = nspowner"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("nspname"); + DBSchema scheme = new DBSchema(name); + rowToProperties(rs, scheme.getOptions()); + listScheme.put(name, scheme); + } + stmt.close(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "schemes").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "schemes").toString(), e); + } + + return listScheme; + } + + @Override + public Map getTableSpaces() { + Map listTableSpace = new HashMap(); + try { + String query = "SELECT tblspaces.spcname,tblspaces.spcacl,tblspaces.spcoptions,users.usename,pg_tablespace_location(tblspacesoid.oid) " + + "FROM pg_tablespace as tblspaces,pg_user as users,(Select oid FROM pg_tablespace where spcname!='pg_default' and spcname!='pg_global') as tblspacesoid " + + "WHERE users.usesysid=tblspaces.spcowner and spcname!='pg_default' and spcname!='pg_global' and tblspacesoid.oid=tblspaces.oid"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("spcname"); + DBTableSpace dbTableSpace = new DBTableSpace(name); + rowToProperties(rs, dbTableSpace.getOptions()); + listTableSpace.put(name, dbTableSpace); + } + stmt.close(); + }catch(Exception e) { + logger.error(e.getMessage()); + throw new ExceptionDBGitRunTime(e.getMessage()); + } + return listTableSpace; + } + + @Override + public Map getSequences(String schema) { + Map listSequence = new HashMap(); + try { + Connection connect = getConnection(); + String query = + "select s.sequence_name, rol.rolname as owner, s.start_value, s.minimum_value, s.maximum_value, s.increment, s.cycle_option " + + "from pg_class cls " + + " join pg_roles rol on rol.oid = cls.relowner " + + " join pg_namespace nsp on nsp.oid = cls.relnamespace " + + " join information_schema.sequences s on cls.relname = s.sequence_name " + + "where nsp.nspname not in ('information_schema', 'pg_catalog') " + + " and nsp.nspname not like 'pg_toast%' " + + " and cls.relkind = 'S' and s.sequence_schema = :schema "; + + NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); + stmt.setString("schema", schema); + + ResultSet rs = stmt.executeQuery(); + while(rs.next()){ + String nameSeq = rs.getString("sequence_name"); + DBSequence sequence = new DBSequence(); + sequence.setName(nameSeq); + sequence.setSchema(schema); + sequence.setValue(0L); + rowToProperties(rs, sequence.getOptions()); + listSequence.put(nameSeq, sequence); + } + stmt.close(); + }catch(Exception e) { + logger.error(e.getMessage(), e); + throw new ExceptionDBGitRunTime(e.getMessage(), e); + } + return listSequence; + } + + @Override + public DBSequence getSequence(String schema, String name) { + try { + Connection connect = getConnection(); + String query = + "select s.sequence_name, rol.rolname as owner, s.start_value, s.minimum_value, s.maximum_value, s.increment, s.cycle_option " + + "from pg_class cls " + + " join pg_roles rol on rol.oid = cls.relowner " + + " join pg_namespace nsp on nsp.oid = cls.relnamespace " + + " join information_schema.sequences s on cls.relname = s.sequence_name " + + "where nsp.nspname not in ('information_schema', 'pg_catalog') " + + " and nsp.nspname not like 'pg_toast%' " + + " and cls.relkind = 'S' and s.sequence_schema = :schema and s.sequence_name = :name "; + + NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); + stmt.setString("schema", schema); + stmt.setString("name", name); + + ResultSet rs = stmt.executeQuery(); + DBSequence sequence = null; + while (rs.next()) { + String nameSeq = rs.getString("sequence_name"); + sequence = new DBSequence(); + sequence.setName(nameSeq); + sequence.setSchema(schema); + sequence.setValue(0L); + rowToProperties(rs, sequence.getOptions()); + } + stmt.close(); + return sequence; + }catch(Exception e) { + logger.error(e.getMessage(), e); + throw new ExceptionDBGitRunTime(e.getMessage(), e); + } + } + + @Override + public Map getTables(String schema) { + Map listTable = new HashMap(); + try { + String query = + "select tablename as table_name,tableowner as owner,tablespace,hasindexes,hasrules,hastriggers " + + "from pg_tables where schemaname not in ('information_schema', 'pg_catalog') " + + "and schemaname not like 'pg_toast%' and upper(schemaname) = upper(:schema) "; + Connection connect = getConnection(); + + NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); + stmt.setString("schema", schema); + + ResultSet rs = stmt.executeQuery(); + while(rs.next()){ + String nameTable = rs.getString("table_name"); + DBTable table = new DBTable(nameTable); + table.setSchema(schema); + rowToProperties(rs, table.getOptions()); + listTable.put(nameTable, table); + } + stmt.close(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); + } + return listTable; + } + + @Override + public DBTable getTable(String schema, String name) { + try { + String query = + "select tablename as table_name,tableowner as owner,tablespace,hasindexes,hasrules,hastriggers from pg_tables where schemaname not in ('information_schema', 'pg_catalog') " + + "and schemaname not like 'pg_toast%' and upper(schemaname) = upper(\'"+schema+"\') and upper(tablename) = upper(\'"+name+"\') "; + Connection connect = getConnection(); + + Statement stmt = connect.createStatement(); + + ResultSet rs = stmt.executeQuery(query); + + DBTable table = null; + + while (rs.next()) { + String nameTable = rs.getString("table_name"); + table = new DBTable(nameTable); + table.setSchema(schema); + rowToProperties(rs, table.getOptions()); + } + stmt.close(); + return table; + + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); + } + } + + @Override + public Map getTableFields(String schema, String nameTable) { + + try { + Map listField = new HashMap(); + + String query = + "SELECT distinct col.column_name,col.is_nullable,col.data_type,col.character_maximum_length, tc.constraint_name, " + + "case\r\n" + + " when lower(data_type) in ('integer', 'numeric', 'smallint', 'double precision', 'bigint') then 'number' \r\n" + + " when lower(data_type) in ('character varying', 'char', 'character', 'varchar') then 'string'\r\n" + + " when lower(data_type) in ('timestamp without time zone', 'timestamp with time zone', 'date') then 'date'\r\n" + + " when lower(data_type) in ('boolean') then 'boolean'\r\n" + + " when lower(data_type) in ('text') then 'text'\r\n" + + " when lower(data_type) in ('bytea') then 'binary'" + + " else 'native'\r\n" + + " end tp, " + + " case when lower(data_type) in ('char', 'character') then true else false end fixed, " + + "col.* FROM " + + "information_schema.columns col " + + "left join information_schema.key_column_usage kc on col.table_schema = kc.table_schema and col.table_name = kc.table_name and col.column_name=kc.column_name " + + "left join information_schema.table_constraints tc on col.table_schema = kc.table_schema and col.table_name = kc.table_name and kc.constraint_name = tc.constraint_name and tc.constraint_type = 'PRIMARY KEY' " + + "where upper(col.table_schema) = upper(:schema) and upper(col.table_name) = upper(:table) " + + "order by col.column_name "; + Connection connect = getConnection(); + + NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); + stmt.setString("schema", schema); + stmt.setString("table", nameTable); + + ResultSet rs = stmt.executeQuery(); + while(rs.next()){ + DBTableField field = new DBTableField(); + field.setName(rs.getString("column_name").toLowerCase()); + if (rs.getString("constraint_name") != null) { + field.setIsPrimaryKey(true); + } + String typeSQL = getFieldType(rs); + field.setTypeSQL(typeSQL); + field.setIsNullable( !typeSQL.toLowerCase().contains("not null")); + field.setTypeUniversal(FieldType.fromString(rs.getString("tp"))); + field.setFixed(false); + field.setLength(rs.getInt("character_maximum_length")); + field.setPrecision(rs.getInt("numeric_precision")); + field.setScale(rs.getInt("numeric_scale")); + field.setFixed(rs.getBoolean("fixed")); + field.setOrder(rs.getInt("ordinal_position")); + listField.put(field.getName(), field); + } + stmt.close(); + + return listField; + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); + } + } + + protected String getFieldType(ResultSet rs) { + try { + StringBuilder type = new StringBuilder(); + type.append(rs.getString("data_type")); + + int max_length = rs.getInt("character_maximum_length"); + if (!rs.wasNull()) { + type.append("(" + max_length + ")"); + } + if (rs.getString("is_nullable").equals("NO")){ + type.append(" NOT NULL"); + } + + return type.toString(); + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tables").toString(), e); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "tables").toString(), e); + } + } + + @Override + public Map getIndexes(String schema, String nameTable) { + Map indexes = new HashMap<>(); + try { + String query = "select i.schemaname,\r\n" + + "i.tablename, \r\n" + + "i.indexname, \r\n" + + "i.tablespace, \r\n" + + "i.indexdef as ddl \r\n" + + "from \r\n" + + "pg_indexes as i JOIN pg_class as cl \r\n" + + " on i.indexname = cl.relname\r\n" + + "JOIN pg_index AS idx \r\n" + + " ON cl.oid = idx.indexrelid\r\n" + + "where i.tablename not like 'pg%' and i.schemaname = :schema and i.tablename = :table and idx.indisprimary = false and idx.indisunique=false "; + + Connection connect = getConnection(); + NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); + stmt.setString("schema", schema); + stmt.setString("table", nameTable); + + ResultSet rs = stmt.executeQuery(); + while(rs.next()){ + DBIndex index = new DBIndex(); + index.setName(rs.getString("indexname")); + index.setSchema(schema); + rowToProperties(rs, index.getOptions()); + indexes.put(index.getName(), index); + } + stmt.close(); + + return indexes; + + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "indexes").toString()); + throw new ExceptionDBGitRunTime(e.getMessage()); + } + + } + + @Override + public Map getConstraints(String schema, String nameTable) { + Map constraints = new HashMap<>(); + try { + String query = "select conname as constraint_name,contype as constraint_type, " + + " pg_catalog.pg_get_constraintdef(r.oid, true) as ddl " + + "from " + + " pg_class c " + + " join pg_namespace n on n.oid = c.relnamespace " + + " join pg_catalog.pg_constraint r on r.conrelid = c.relfilenode " + + "WHERE " + + " relname = :table and nspname = :schema and c.relkind = 'r' "; + + Connection connect = getConnection(); + NamedParameterPreparedStatement stmt = NamedParameterPreparedStatement.createNamedParameterPreparedStatement(connect, query); + stmt.setString("table", nameTable); + stmt.setString("schema", schema); + + ResultSet rs = stmt.executeQuery(); + while(rs.next()){ + DBConstraint con = new DBConstraint(); + con.setName(rs.getString("constraint_name")); + con.setConstraintType(rs.getString("constraint_type")); + con.setSchema(schema); + rowToProperties(rs, con.getOptions()); + constraints.put(con.getName(), con); + } + stmt.close(); + + return constraints; + + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "constraints").toString()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "constraints").toString(), e); + } + } + + @Override + public Map getViews(String schema) { + Map listView = new HashMap(); + try { + String query = "select nsp.nspname as object_schema, " + + "cls.relname as object_name, rol.rolname as owner, 'create or replace view ' || nsp.nspname || '.' || cls.relname || ' as \n' || pg_get_viewdef(cls.oid) as ddl "+ + "from pg_class cls " + + " join pg_roles rol on rol.oid = cls.relowner" + + " join pg_namespace nsp on nsp.oid = cls.relnamespace " + + " where nsp.nspname not in ('information_schema', 'pg_catalog') " + + " and nsp.nspname not like 'pg_toast%' " + + "and cls.relkind = 'v' and nsp.nspname = '" + schema + "'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + DBView view = new DBView(rs.getString("object_name")); + view.setSchema(rs.getString("object_schema")); + view.setOwner(rs.getString("owner")); + rowToProperties(rs, view.getOptions()); + listView.put(rs.getString("object_name"), view); + } + stmt.close(); + return listView; + }catch(Exception e) { + logger.error(e.getMessage()); + System.out.println(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); + } + } + + @Override + public DBView getView(String schema, String name) { + DBView view = new DBView(name); + view.setSchema(schema); + try { + String query = "select nsp.nspname as object_schema, " + + "cls.relname as object_name, rol.rolname as owner, 'create or replace view ' || nsp.nspname || '.' || cls.relname || ' as \n' || pg_get_viewdef(cls.oid) as ddl "+ + "from pg_class cls " + + " join pg_roles rol on rol.oid = cls.relowner" + + " join pg_namespace nsp on nsp.oid = cls.relnamespace " + + " where nsp.nspname not in ('information_schema', 'pg_catalog') " + + " and nsp.nspname not like 'pg_toast%' " + + "and cls.relkind = 'v' and nsp.nspname = '" + schema + "' and cls.relname='"+name+"'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + while (rs.next()) { + view.setOwner(rs.getString("owner")); + rowToProperties(rs, view.getOptions()); + } + stmt.close(); + return view; + + }catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "views") + ": "+ e.getMessage()); + } + } + + @Override + public Map getTriggers(String schema) { + Map listTrigger = new HashMap(); + try { + String query = "SELECT trg.tgname, tbl.relname as trigger_table ,pg_get_triggerdef(trg.oid) AS ddl \r\n" + + "FROM pg_trigger trg\r\n" + + "JOIN pg_class tbl on trg.tgrelid = tbl.oid\r\n" + + "JOIN pg_namespace ns ON ns.oid = tbl.relnamespace\r\n" + + "and trg.tgconstraint=0 and ns.nspname like \'"+schema+"\'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("tgname"); + String sql = rs.getString("ddl"); + DBTrigger trigger = new DBTrigger(name); + trigger.setSchema(schema); + trigger.setOwner("postgres"); + rowToProperties(rs, trigger.getOptions()); + listTrigger.put(name, trigger); + } + stmt.close(); + return listTrigger; + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "triggers").toString(), e); + } + } + @Override + public DBTrigger getTrigger(String schema, String name) { + DBTrigger trigger = null; + try { + String query = "SELECT trg.tgname, tbl.relname as trigger_table ,pg_get_triggerdef(trg.oid) AS ddl \r\n" + + "FROM pg_trigger trg\r\n" + + "JOIN pg_class tbl on trg.tgrelid = tbl.oid\r\n" + + "JOIN pg_namespace ns ON ns.oid = tbl.relnamespace\r\n" + + "and trg.tgconstraint=0 and ns.nspname like \'"+schema+"\' and trg.tgname like \'"+name+"\'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String sql = rs.getString("ddl"); + trigger = new DBTrigger(name); + trigger.setSchema(schema); + trigger.setOwner("postgres"); + rowToProperties(rs, trigger.getOptions()); + } + stmt.close(); + return trigger; + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "triggers").toString(), e); + } + + } + @Override + public Map getPackages(String schema) { + // TODO Auto-generated method stub + return null; + } + + @Override + public DBPackage getPackage(String schema, String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Map getProcedures(String schema) { + // TODO Auto-generated method stub + return null; + } + + @Override + public DBProcedure getProcedure(String schema, String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Map getFunctions(String schema) { + Map listFunction = new HashMap(); + try { + String query = "SELECT n.nspname as \"schema\",u.rolname,\r\n" + + " p.proname as \"name\",\r\n" + + " pg_catalog.pg_get_function_arguments(p.oid) as \"arguments\",\r\n" + + " pg_get_functiondef(p.oid) AS ddl\r\n" + + "FROM pg_catalog.pg_proc p\r\n" + + " JOIN pg_catalog.pg_roles u ON u.oid = p.proowner\r\n" + + " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\r\n" + + "WHERE pg_catalog.pg_function_is_visible(p.oid)\r\n" + + " AND n.nspname = \'"+schema+"\'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString("name"); + String owner = rs.getString("rolname"); + String args = rs.getString("arguments"); + DBFunction func = new DBFunction(name); + func.setSchema(schema); + func.setOwner(owner); + rowToProperties(rs,func.getOptions()); + //func.setArguments(args); + listFunction.put(name, func); + } + stmt.close(); + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "fnc").toString(), e); + } + return listFunction; + } + + @Override + public DBFunction getFunction(String schema, String name) { + + try { + String query = "SELECT n.nspname as \"schema\",u.rolname,\r\n" + + " p.proname as \"name\",\r\n" + + " pg_catalog.pg_get_function_arguments(p.oid) as \"arguments\",\r\n" + + " pg_get_functiondef(p.oid) AS ddl\r\n" + + "FROM pg_catalog.pg_proc p\r\n" + + " JOIN pg_catalog.pg_roles u ON u.oid = p.proowner\r\n" + + " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\r\n" + + "WHERE pg_catalog.pg_function_is_visible(p.oid)\r\n" + + " AND n.nspname = \'"+schema+ "\' AND p.proname=\'"+name+"\'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + + DBFunction func = null; + while (rs.next()) { + func = new DBFunction(rs.getString("name")); + String owner = rs.getString("rolname"); + String args = rs.getString("arguments"); + func.setSchema(schema); + func.setOwner(owner); + //func.setArguments(args); + rowToProperties(rs,func.getOptions()); + } + stmt.close(); + + return func; + + }catch(Exception e) { + throw new ExceptionDBGitRunTime(lang.getValue("errors", "adapter", "fnc").toString(), e); + } + } + + @Override + public DBTableData getTableDataPortion(String schema, String nameTable, int portionIndex, int tryNumber) { + DBTableData data = new DBTableData(); + + try { + int portionSize = DBGitConfig.getInstance().getInteger("core", "PORTION_SIZE", DBGitConfig.getInstance().getIntegerGlobal("core", "PORTION_SIZE", 1000)); + + int begin = 1 + portionSize*portionIndex; + int end = portionSize + portionSize*portionIndex; + + Statement st = getConnection().createStatement(); + ResultSet rs = st.executeQuery(" SELECT * FROM \r\n" + + " (SELECT f.*, ROW_NUMBER() OVER (ORDER BY ctid) DBGIT_ROW_NUM FROM " + schema + "." + nameTable + " f) s\r\n" + + " WHERE DBGIT_ROW_NUM BETWEEN " + begin + " and " + end); + data.setResultSet(rs); + return data; + } catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tableData").toString(), e); + + try { + if (tryNumber <= DBGitConfig.getInstance().getInteger("core", "TRY_COUNT", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_COUNT", 1000))) { + try { + TimeUnit.SECONDS.sleep(DBGitConfig.getInstance().getInteger("core", "TRY_DELAY", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_DELAY", 1000))); + } catch (InterruptedException e1) { + throw new ExceptionDBGitRunTime(e1.getMessage()); + } + ConsoleWriter.println("Error while getting portion of data, try " + tryNumber); + getTableDataPortion(schema, nameTable, portionIndex, tryNumber++); + } + } catch (Exception e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + try { + getConnection().rollback(); + } catch (Exception e2) { + logger.error(lang.getValue("errors", "adapter", "rollback").toString(), e2); + } + throw new ExceptionDBGitRunTime(e.getMessage()); + } + } + + @Override + public DBTableData getTableData(String schema, String nameTable) { + String tableName = schema+"."+nameTable; + try { + DBTableData data = new DBTableData(); + + int maxRowsCount = DBGitConfig.getInstance().getInteger("core", "MAX_ROW_COUNT_FETCH", DBGitConfig.getInstance().getIntegerGlobal("core", "MAX_ROW_COUNT_FETCH", MAX_ROW_COUNT_FETCH)); + + if (DBGitConfig.getInstance().getBoolean("core", "LIMIT_FETCH", DBGitConfig.getInstance().getBooleanGlobal("core", "LIMIT_FETCH", true))) { + Statement st = getConnection().createStatement(); + String query = "select COALESCE(count(*), 0) kolvo from ( select 1 from "+ + tableName + " limit " + (maxRowsCount + 1) + " ) tbl"; + ResultSet rs = st.executeQuery(query); + rs.next(); + if (rs.getInt("kolvo") > maxRowsCount) { + data.setErrorFlag(DBTableData.ERROR_LIMIT_ROWS); + return data; + } + } + Statement st = getConnection().createStatement(); + ResultSet rs = st.executeQuery("select * from "+tableName); + data.setResultSet(rs); + + //TODO other state + + return data; + } catch(Exception e) { + logger.error(lang.getValue("errors", "adapter", "tableData").toString(), e); + try { + getConnection().rollback(); + } catch (Exception e2) { + logger.error(lang.getValue("errors", "adapter", "rollback").toString(), e2); + } + throw new ExceptionDBGitRunTime(e.getMessage()); + } + } +/* + @Override + public DBTableRow getTableRow(DBTable tbl, Object id) { + // TODO Auto-generated method stub + return null; + } +*/ + @Override + public Map getUsers() { + Map listUser = new HashMap(); + try { + String query = "select *from pg_user"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while(rs.next()){ + String name = rs.getString(1); + DBUser user = new DBUser(name); + listUser.put(name, user); + } + stmt.close(); + }catch(Exception e) { + logger.error(e.getMessage()); + throw new ExceptionDBGitRunTime(e.getMessage()); + } + //connect.cre + //select *from pg_catalog.pg_namespace; + return listUser; + } + + @Override + public Map getRoles() { + Map listRole = new HashMap(); + try { + String query = "select *,array_to_string(array(SELECT rolname " + + "FROM pg_roles,pg_auth_members " + + "WHERE member = auth.oid and roleid=oid), ', ') as rolmemberof from pg_authid as auth where auth.rolname not like 'pg_%'"; + Connection connect = getConnection(); + Statement stmt = connect.createStatement(); + ResultSet rs = stmt.executeQuery(query); + while (rs.next()) { + String name = rs.getString("rolname"); + DBRole role = new DBRole(name); + rowToProperties(rs, role.getOptions()); + listRole.put(name, role); + } + stmt.close(); + } catch (Exception e) { + logger.error(e.getMessage()); + throw new ExceptionDBGitRunTime(e.getMessage()); + } + return listRole; + } + + @Override + public boolean userHasRightsToGetDdlOfOtherUsers() { + return true; + } + + @Override + public IFactoryDBBackupAdapter getBackupAdapterFactory() { + return backupFactory; + } + + @Override + public DbType getDbType() { + return DbType.POSTGRES; + } + + @Override + public String getDbVersion() { + try { + PreparedStatement stmt = getConnection().prepareStatement("SHOW server_version"); + ResultSet resultSet = stmt.executeQuery(); + resultSet.next(); + + String result = resultSet.getString("server_version"); + resultSet.close(); + stmt.close(); + + return result; + } catch (SQLException e) { + return ""; + } + } + + @Override + public IFactoryDBConvertAdapter getConvertAdapterFactory() { + return convertFactory; + } + + @Override + public void createSchemaIfNeed(String schemaName) throws ExceptionDBGit { + try { + Statement st = connect.createStatement(); + ResultSet rs = st.executeQuery("select count(*) cnt from information_schema.schemata where upper(schema_name) = '" + + schemaName.toUpperCase() + "'"); + + rs.next(); + if (rs.getInt("cnt") == 0) { + StatementLogging stLog = new StatementLogging(connect, getStreamOutputSqlCommand(), isExecSql()); + stLog.execute("create schema " + schemaName); + + stLog.close(); + } + + rs.close(); + st.close(); + } catch (SQLException e) { + throw new ExceptionDBGit(lang.getValue("errors", "adapter", "createSchema") + ": " + e.getLocalizedMessage()); + } + + } + + @Override + public void createRoleIfNeed(String roleName) throws ExceptionDBGit { + try { + Statement st = connect.createStatement(); + ResultSet rs = st.executeQuery("select count(*) cnt from pg_catalog.pg_roles where upper(rolname) = '" + + roleName.toUpperCase() + "'"); + + rs.next(); + if (rs.getInt("cnt") == 0) { + StatementLogging stLog = new StatementLogging(connect, getStreamOutputSqlCommand(), isExecSql()); + stLog.execute("CREATE ROLE " + roleName + " LOGIN PASSWORD '" + roleName + "'"); + + stLog.close(); + } + + connect.commit(); + rs.close(); + st.close(); + } catch (SQLException e) { + throw new ExceptionDBGit(lang.getValue("errors", "adapter", "createSchema") + ": " + e.getLocalizedMessage()); + } + } + + @Override + public String getDefaultScheme() throws ExceptionDBGit { + return "public"; + } + + @Override + public boolean isReservedWord(String word) { + Set reservedWords = new HashSet<>(); + + reservedWords.add("A"); + reservedWords.add("ABORT"); + reservedWords.add("ABS"); + reservedWords.add("ABSOLUTE"); + reservedWords.add("ACCESS"); + reservedWords.add("ACTION"); + reservedWords.add("ADA"); + reservedWords.add("ADD"); + reservedWords.add("ADMIN"); + reservedWords.add("AFTER"); + reservedWords.add("AGGREGATE"); + reservedWords.add("ALIAS"); + reservedWords.add("ALL"); + reservedWords.add("ALLOCATE"); + reservedWords.add("ALSO"); + reservedWords.add("ALTER"); + reservedWords.add("ALWAYS"); + reservedWords.add("ANALYSE"); + reservedWords.add("ANALYZE"); + reservedWords.add("AND"); + reservedWords.add("ANY"); + reservedWords.add("ARE"); + reservedWords.add("ARRAY"); + reservedWords.add("AS"); + reservedWords.add("ASC"); + reservedWords.add("ASENSITIVE"); + reservedWords.add("ASSERTION"); + reservedWords.add("ASSIGNMENT"); + reservedWords.add("ASYMMETRIC"); + reservedWords.add("AT"); + reservedWords.add("ATOMIC"); + reservedWords.add("ATTRIBUTE"); + reservedWords.add("ATTRIBUTES"); + reservedWords.add("AUTHORIZATION"); + reservedWords.add("AVG"); + reservedWords.add("BACKWARD"); + reservedWords.add("BEFORE"); + reservedWords.add("BEGIN"); + reservedWords.add("BERNOULLI"); + reservedWords.add("BETWEEN"); + reservedWords.add("BIGINT"); + reservedWords.add("BINARY"); + reservedWords.add("BIT"); + reservedWords.add("BITVAR"); + reservedWords.add("BIT_LENGTH"); + reservedWords.add("BLOB"); + reservedWords.add("BOOLEAN"); + reservedWords.add("BOTH"); + reservedWords.add("BREADTH"); + reservedWords.add("BY"); + reservedWords.add("C"); + reservedWords.add("CACHE"); + reservedWords.add("CALL"); + reservedWords.add("CALLED"); + reservedWords.add("CARDINALITY"); + reservedWords.add("CASCADE"); + reservedWords.add("CASCADED"); + reservedWords.add("CASE"); + reservedWords.add("CAST"); + reservedWords.add("CATALOG"); + reservedWords.add("CATALOG_NAME"); + reservedWords.add("CEIL"); + reservedWords.add("CEILING"); + reservedWords.add("CHAIN"); + reservedWords.add("CHAR"); + reservedWords.add("CHARACTER"); + reservedWords.add("CHARACTERISTICS"); + reservedWords.add("CHARACTERS"); + reservedWords.add("CHARACTER_LENGTH"); + reservedWords.add("CHARACTER_SET_CATALOG"); + reservedWords.add("CHARACTER_SET_NAME"); + reservedWords.add("CHARACTER_SET_SCHEMA"); + reservedWords.add("CHAR_LENGTH"); + reservedWords.add("CHECK"); + reservedWords.add("CHECKED"); + reservedWords.add("CHECKPOINT"); + reservedWords.add("CLASS"); + reservedWords.add("CLASS_ORIGIN"); + reservedWords.add("CLOB"); + reservedWords.add("CLOSE"); + reservedWords.add("CLUSTER"); + reservedWords.add("COALESCE"); + reservedWords.add("COBOL"); + reservedWords.add("COLLATE"); + reservedWords.add("COLLATION"); + reservedWords.add("COLLATION_CATALOG"); + reservedWords.add("COLLATION_NAME"); + reservedWords.add("COLLATION_SCHEMA"); + reservedWords.add("COLLECT"); + reservedWords.add("COLUMN"); + reservedWords.add("COLUMN_NAME"); + reservedWords.add("COMMAND_FUNCTION"); + reservedWords.add("COMMAND_FUNCTION_CODE"); + reservedWords.add("COMMENT"); + reservedWords.add("COMMIT"); + reservedWords.add("COMMITTED"); + reservedWords.add("COMPLETION"); + reservedWords.add("CONDITION"); + reservedWords.add("CONDITION_NUMBER"); + reservedWords.add("CONNECT"); + reservedWords.add("CONNECTION"); + reservedWords.add("CONNECTION_NAME"); + reservedWords.add("CONSTRAINT"); + reservedWords.add("CONSTRAINTS"); + reservedWords.add("CONSTRAINT_CATALOG"); + reservedWords.add("CONSTRAINT_NAME"); + reservedWords.add("CONSTRAINT_SCHEMA"); + reservedWords.add("CONSTRUCTOR"); + reservedWords.add("CONTAINS"); + reservedWords.add("CONTINUE"); + reservedWords.add("CONVERSION"); + reservedWords.add("CONVERT"); + reservedWords.add("COPY"); + reservedWords.add("CORR"); + reservedWords.add("CORRESPONDING"); + reservedWords.add("COUNT"); + reservedWords.add("COVAR_POP"); + reservedWords.add("COVAR_SAMP"); + reservedWords.add("CREATE"); + reservedWords.add("CREATEDB"); + reservedWords.add("CREATEROLE"); + reservedWords.add("CREATEUSER"); + reservedWords.add("CROSS"); + reservedWords.add("CSV"); + reservedWords.add("CUBE"); + reservedWords.add("CUME_DIST"); + reservedWords.add("CURRENT"); + reservedWords.add("CURRENT_DATE"); + reservedWords.add("CURRENT_DEFAULT_TRANSFORM_GROUP"); + reservedWords.add("CURRENT_PATH"); + reservedWords.add("CURRENT_ROLE"); + reservedWords.add("CURRENT_TIME"); + reservedWords.add("CURRENT_TIMESTAMP"); + reservedWords.add("CURRENT_TRANSFORM_GROUP_FOR_TYPE"); + reservedWords.add("CURRENT_USER"); + reservedWords.add("CURSOR"); + reservedWords.add("CURSOR_NAME"); + reservedWords.add("CYCLE"); + reservedWords.add("DATA"); + reservedWords.add("DATABASE"); + reservedWords.add("DATE"); + reservedWords.add("DATETIME_INTERVAL_CODE"); + reservedWords.add("DATETIME_INTERVAL_PRECISION"); + reservedWords.add("DAY"); + reservedWords.add("DEALLOCATE"); + reservedWords.add("DEC"); + reservedWords.add("DECIMAL"); + reservedWords.add("DECLARE"); + reservedWords.add("DEFAULT"); + reservedWords.add("DEFAULTS"); + reservedWords.add("DEFERRABLE"); + reservedWords.add("DEFERRED"); + reservedWords.add("DEFINED"); + reservedWords.add("DEFINER"); + reservedWords.add("DEGREE"); + reservedWords.add("DELETE"); + reservedWords.add("DELIMITER"); + reservedWords.add("DELIMITERS"); + reservedWords.add("DENSE_RANK"); + reservedWords.add("DEPTH"); + reservedWords.add("DEREF"); + reservedWords.add("DERIVED"); + reservedWords.add("DESC"); + reservedWords.add("DESCRIBE"); + reservedWords.add("DESCRIPTOR"); + reservedWords.add("DESTROY"); + reservedWords.add("DESTRUCTOR"); + reservedWords.add("DETERMINISTIC"); + reservedWords.add("DIAGNOSTICS"); + reservedWords.add("DICTIONARY"); + reservedWords.add("DISABLE"); + reservedWords.add("DISCONNECT"); + reservedWords.add("DISPATCH"); + reservedWords.add("DISTINCT"); + reservedWords.add("DO"); + reservedWords.add("DOMAIN"); + reservedWords.add("DOUBLE"); + reservedWords.add("DROP"); + reservedWords.add("DYNAMIC"); + reservedWords.add("DYNAMIC_FUNCTION"); + reservedWords.add("DYNAMIC_FUNCTION_CODE"); + reservedWords.add("EACH"); + reservedWords.add("ELEMENT"); + reservedWords.add("ELSE"); + reservedWords.add("ENABLE"); + reservedWords.add("ENCODING"); + reservedWords.add("ENCRYPTED"); + reservedWords.add("END"); + reservedWords.add("END-EXEC"); + reservedWords.add("EQUALS"); + reservedWords.add("ESCAPE"); + reservedWords.add("EVERY"); + reservedWords.add("EXCEPT"); + reservedWords.add("EXCEPTION"); + reservedWords.add("EXCLUDE"); + reservedWords.add("EXCLUDING"); + reservedWords.add("EXCLUSIVE"); + reservedWords.add("EXEC"); + reservedWords.add("EXECUTE"); + reservedWords.add("EXISTING"); + reservedWords.add("EXISTS"); + reservedWords.add("EXP"); + reservedWords.add("EXPLAIN"); + reservedWords.add("EXTERNAL"); + reservedWords.add("EXTRACT"); + reservedWords.add("FALSE"); + reservedWords.add("FETCH"); + reservedWords.add("FILTER"); + reservedWords.add("FINAL"); + reservedWords.add("FIRST"); + reservedWords.add("FLOAT"); + reservedWords.add("FLOOR"); + reservedWords.add("FOLLOWING"); + reservedWords.add("FOR"); + reservedWords.add("FORCE"); + reservedWords.add("FOREIGN"); + reservedWords.add("FORTRAN"); + reservedWords.add("FORWARD"); + reservedWords.add("FOUND"); + reservedWords.add("FREE"); + reservedWords.add("FREEZE"); + reservedWords.add("FROM"); + reservedWords.add("FULL"); + reservedWords.add("FUNCTION"); + reservedWords.add("FUSION"); + reservedWords.add("G"); + reservedWords.add("GENERAL"); + reservedWords.add("GENERATED"); + reservedWords.add("GET"); + reservedWords.add("GLOBAL"); + reservedWords.add("GO"); + reservedWords.add("GOTO"); + reservedWords.add("GRANT"); + reservedWords.add("GRANTED"); + reservedWords.add("GREATEST"); + reservedWords.add("GROUP"); + reservedWords.add("GROUPING"); + reservedWords.add("HANDLER"); + reservedWords.add("HAVING"); + reservedWords.add("HEADER"); + reservedWords.add("HIERARCHY"); + reservedWords.add("HOLD"); + reservedWords.add("HOST"); + reservedWords.add("HOUR"); + reservedWords.add("IDENTITY"); + reservedWords.add("IGNORE"); + reservedWords.add("ILIKE"); + reservedWords.add("IMMEDIATE"); + reservedWords.add("IMMUTABLE"); + reservedWords.add("IMPLEMENTATION"); + reservedWords.add("IMPLICIT"); + reservedWords.add("IN"); + reservedWords.add("INCLUDING"); + reservedWords.add("INCREMENT"); + reservedWords.add("INDEX"); + reservedWords.add("INDICATOR"); + reservedWords.add("INFIX"); + reservedWords.add("INHERIT"); + reservedWords.add("INHERITS"); + reservedWords.add("INITIALIZE"); + reservedWords.add("INITIALLY"); + reservedWords.add("INNER"); + reservedWords.add("INOUT"); + reservedWords.add("INPUT"); + reservedWords.add("INSENSITIVE"); + reservedWords.add("INSERT"); + reservedWords.add("INSTANCE"); + reservedWords.add("INSTANTIABLE"); + reservedWords.add("INSTEAD"); + reservedWords.add("INT"); + reservedWords.add("INTEGER"); + reservedWords.add("INTERSECT"); + reservedWords.add("INTERSECTION"); + reservedWords.add("INTERVAL"); + reservedWords.add("INTO"); + reservedWords.add("INVOKER"); + reservedWords.add("IS"); + reservedWords.add("ISNULL"); + reservedWords.add("ISOLATION"); + reservedWords.add("ITERATE"); + reservedWords.add("JOIN"); + reservedWords.add("K"); + reservedWords.add("KEY"); + reservedWords.add("KEY_MEMBER"); + reservedWords.add("KEY_TYPE"); + reservedWords.add("LANCOMPILER"); + reservedWords.add("LANGUAGE"); + reservedWords.add("LARGE"); + reservedWords.add("LAST"); + reservedWords.add("LATERAL"); + reservedWords.add("LEADING"); + reservedWords.add("LEAST"); + reservedWords.add("LEFT"); + reservedWords.add("LENGTH"); + reservedWords.add("LESS"); + reservedWords.add("LEVEL"); + reservedWords.add("LIKE"); + reservedWords.add("LIMIT"); + reservedWords.add("LISTEN"); + reservedWords.add("LN"); + reservedWords.add("LOAD"); + reservedWords.add("LOCAL"); + reservedWords.add("LOCALTIME"); + reservedWords.add("LOCALTIMESTAMP"); + reservedWords.add("LOCATION"); + reservedWords.add("LOCATOR"); + reservedWords.add("LOCK"); + reservedWords.add("LOGIN"); + reservedWords.add("LOWER"); + reservedWords.add("M"); + reservedWords.add("MAP"); + reservedWords.add("MATCH"); + reservedWords.add("MATCHED"); + reservedWords.add("MAX"); + reservedWords.add("MAXVALUE"); + reservedWords.add("MEMBER"); + reservedWords.add("MERGE"); + reservedWords.add("MESSAGE_LENGTH"); + reservedWords.add("MESSAGE_OCTET_LENGTH"); + reservedWords.add("MESSAGE_TEXT"); + reservedWords.add("METHOD"); + reservedWords.add("MIN"); + reservedWords.add("MINUTE"); + reservedWords.add("MINVALUE"); + reservedWords.add("MOD"); + reservedWords.add("MODE"); + reservedWords.add("MODIFIES"); + reservedWords.add("MODIFY"); + reservedWords.add("MODULE"); + reservedWords.add("MONTH"); + reservedWords.add("MORE"); + reservedWords.add("MOVE"); + reservedWords.add("MULTISET"); + reservedWords.add("MUMPS"); + reservedWords.add("NAME"); + reservedWords.add("NAMES"); + reservedWords.add("NATIONAL"); + reservedWords.add("NATURAL"); + reservedWords.add("NCHAR"); + reservedWords.add("NCLOB"); + reservedWords.add("NESTING"); + reservedWords.add("NEW"); + reservedWords.add("NEXT"); + reservedWords.add("NO"); + reservedWords.add("NOCREATEDB"); + reservedWords.add("NOCREATEROLE"); + reservedWords.add("NOCREATEUSER"); + reservedWords.add("NOINHERIT"); + reservedWords.add("NOLOGIN"); + reservedWords.add("NONE"); + reservedWords.add("NORMALIZE"); + reservedWords.add("NORMALIZED"); + reservedWords.add("NOSUPERUSER"); + reservedWords.add("NOT"); + reservedWords.add("NOTHING"); + reservedWords.add("NOTIFY"); + reservedWords.add("NOTNULL"); + reservedWords.add("NOWAIT"); + reservedWords.add("NULL"); + reservedWords.add("NULLABLE"); + reservedWords.add("NULLIF"); + reservedWords.add("NULLS"); + reservedWords.add("NUMBER"); + reservedWords.add("NUMERIC"); + reservedWords.add("OBJECT"); + reservedWords.add("OCTETS"); + reservedWords.add("OCTET_LENGTH"); + reservedWords.add("OF"); + reservedWords.add("OFF"); + reservedWords.add("OFFSET"); + reservedWords.add("OIDS"); + reservedWords.add("OLD"); + reservedWords.add("ON"); + reservedWords.add("ONLY"); + reservedWords.add("OPEN"); + reservedWords.add("OPERATION"); + reservedWords.add("OPERATOR"); + reservedWords.add("OPTION"); + reservedWords.add("OPTIONS"); + reservedWords.add("OR"); + reservedWords.add("ORDER"); + reservedWords.add("ORDERING"); + reservedWords.add("ORDINALITY"); + reservedWords.add("OTHERS"); + reservedWords.add("OUT"); + reservedWords.add("OUTER"); + reservedWords.add("OUTPUT"); + reservedWords.add("OVER"); + reservedWords.add("OVERLAPS"); + reservedWords.add("OVERLAY"); + reservedWords.add("OVERRIDING"); + reservedWords.add("OWNER"); + reservedWords.add("PAD"); + reservedWords.add("PARAMETER"); + reservedWords.add("PARAMETERS"); + reservedWords.add("PARAMETER_MODE"); + reservedWords.add("PARAMETER_NAME"); + reservedWords.add("PARAMETER_ORDINAL_POSITION"); + reservedWords.add("PARAMETER_SPECIFIC_CATALOG"); + reservedWords.add("PARAMETER_SPECIFIC_NAME"); + reservedWords.add("PARAMETER_SPECIFIC_SCHEMA"); + reservedWords.add("PARTIAL"); + reservedWords.add("PARTITION"); + reservedWords.add("PASCAL"); + reservedWords.add("PASSWORD"); + reservedWords.add("PATH"); + reservedWords.add("PERCENTILE_CONT"); + reservedWords.add("PERCENTILE_DISC"); + reservedWords.add("PERCENT_RANK"); + reservedWords.add("PLACING"); + reservedWords.add("PLI"); + reservedWords.add("POSITION"); + reservedWords.add("POSTFIX"); + reservedWords.add("POWER"); + reservedWords.add("PRECEDING"); + reservedWords.add("PRECISION"); + reservedWords.add("PREFIX"); + reservedWords.add("PREORDER"); + reservedWords.add("PREPARE"); + reservedWords.add("PREPARED"); + reservedWords.add("PRESERVE"); + reservedWords.add("PRIMARY"); + reservedWords.add("PRIOR"); + reservedWords.add("PRIVILEGES"); + reservedWords.add("PROCEDURAL"); + reservedWords.add("PROCEDURE"); + reservedWords.add("PUBLIC"); + reservedWords.add("QUOTE"); + reservedWords.add("RANGE"); + reservedWords.add("RANK"); + reservedWords.add("READ"); + reservedWords.add("READS"); + reservedWords.add("REAL"); + reservedWords.add("RECHECK"); + reservedWords.add("RECURSIVE"); + reservedWords.add("REF"); + reservedWords.add("REFERENCES"); + reservedWords.add("REFERENCING"); + reservedWords.add("REGR_AVGX"); + reservedWords.add("REGR_AVGY"); + reservedWords.add("REGR_COUNT"); + reservedWords.add("REGR_INTERCEPT"); + reservedWords.add("REGR_R2"); + reservedWords.add("REGR_SLOPE"); + reservedWords.add("REGR_SXX"); + reservedWords.add("REGR_SXY"); + reservedWords.add("REGR_SYY"); + reservedWords.add("REINDEX"); + reservedWords.add("RELATIVE"); + reservedWords.add("RELEASE"); + reservedWords.add("RENAME"); + reservedWords.add("REPEATABLE"); + reservedWords.add("REPLACE"); + reservedWords.add("RESET"); + reservedWords.add("RESTART"); + reservedWords.add("RESTRICT"); + reservedWords.add("RESULT"); + reservedWords.add("RETURN"); + reservedWords.add("RETURNED_CARDINALITY"); + reservedWords.add("RETURNED_LENGTH"); + reservedWords.add("RETURNED_OCTET_LENGTH"); + reservedWords.add("RETURNED_SQLSTATE"); + reservedWords.add("RETURNS"); + reservedWords.add("REVOKE"); + reservedWords.add("RIGHT"); + reservedWords.add("ROLE"); + reservedWords.add("ROLLBACK"); + reservedWords.add("ROLLUP"); + reservedWords.add("ROUTINE"); + reservedWords.add("ROUTINE_CATALOG"); + reservedWords.add("ROUTINE_NAME"); + reservedWords.add("ROUTINE_SCHEMA"); + reservedWords.add("ROW"); + reservedWords.add("ROWS"); + reservedWords.add("ROW_COUNT"); + reservedWords.add("ROW_NUMBER"); + reservedWords.add("RULE"); + reservedWords.add("SAVEPOINT"); + reservedWords.add("SCALE"); + reservedWords.add("SCHEMA"); + reservedWords.add("SCHEMA_NAME"); + reservedWords.add("SCOPE"); + reservedWords.add("SCOPE_CATALOG"); + reservedWords.add("SCOPE_NAME"); + reservedWords.add("SCOPE_SCHEMA"); + reservedWords.add("SCROLL"); + reservedWords.add("SEARCH"); + reservedWords.add("SECOND"); + reservedWords.add("SECTION"); + reservedWords.add("SECURITY"); + reservedWords.add("SELECT"); + reservedWords.add("SELF"); + reservedWords.add("SENSITIVE"); + reservedWords.add("SEQUENCE"); + reservedWords.add("SERIALIZABLE"); + reservedWords.add("SERVER_NAME"); + reservedWords.add("SESSION"); + reservedWords.add("SESSION_USER"); + reservedWords.add("SET"); + reservedWords.add("SETOF"); + reservedWords.add("SETS"); + reservedWords.add("SHARE"); + reservedWords.add("SHOW"); + reservedWords.add("SIMILAR"); + reservedWords.add("SIMPLE"); + reservedWords.add("SIZE"); + reservedWords.add("SMALLINT"); + reservedWords.add("SOME"); + reservedWords.add("SOURCE"); + reservedWords.add("SPACE"); + reservedWords.add("SPECIFIC"); + reservedWords.add("SPECIFICTYPE"); + reservedWords.add("SPECIFIC_NAME"); + reservedWords.add("SQL"); + reservedWords.add("SQLCODE"); + reservedWords.add("SQLERROR"); + reservedWords.add("SQLEXCEPTION"); + reservedWords.add("SQLSTATE"); + reservedWords.add("SQLWARNING"); + reservedWords.add("SQRT"); + reservedWords.add("STABLE"); + reservedWords.add("START"); + reservedWords.add("STATE"); + reservedWords.add("STATEMENT"); + reservedWords.add("STATIC"); + reservedWords.add("STATISTICS"); + reservedWords.add("STDDEV_POP"); + reservedWords.add("STDDEV_SAMP"); + reservedWords.add("STDIN"); + reservedWords.add("STDOUT"); + reservedWords.add("STORAGE"); + reservedWords.add("STRICT"); + reservedWords.add("STRUCTURE"); + reservedWords.add("STYLE"); + reservedWords.add("SUBCLASS_ORIGIN"); + reservedWords.add("SUBLIST"); + reservedWords.add("SUBMULTISET"); + reservedWords.add("SUBSTRING"); + reservedWords.add("SUM"); + reservedWords.add("SUPERUSER"); + reservedWords.add("SYMMETRIC"); + reservedWords.add("SYSID"); + reservedWords.add("SYSTEM"); + reservedWords.add("SYSTEM_USER"); + reservedWords.add("TABLE"); + reservedWords.add("TABLESAMPLE"); + reservedWords.add("TABLESPACE"); + reservedWords.add("TABLE_NAME"); + reservedWords.add("TEMP"); + reservedWords.add("TEMPLATE"); + reservedWords.add("TEMPORARY"); + reservedWords.add("TERMINATE"); + reservedWords.add("THAN"); + reservedWords.add("THEN"); + reservedWords.add("TIES"); + reservedWords.add("TIME"); + reservedWords.add("TIMESTAMP"); + reservedWords.add("TIMEZONE_HOUR"); + reservedWords.add("TIMEZONE_MINUTE"); + reservedWords.add("TO"); + reservedWords.add("TOAST"); + reservedWords.add("TOP_LEVEL_COUNT"); + reservedWords.add("TRAILING"); + reservedWords.add("TRANSACTION"); + reservedWords.add("TRANSACTIONS_COMMITTED"); + reservedWords.add("TRANSACTIONS_ROLLED_BACK"); + reservedWords.add("TRANSACTION_ACTIVE"); + reservedWords.add("TRANSFORM"); + reservedWords.add("TRANSFORMS"); + reservedWords.add("TRANSLATE"); + reservedWords.add("TRANSLATION"); + reservedWords.add("TREAT"); + reservedWords.add("TRIGGER"); + reservedWords.add("TRIGGER_CATALOG"); + reservedWords.add("TRIGGER_NAME"); + reservedWords.add("TRIGGER_SCHEMA"); + reservedWords.add("TRIM"); + reservedWords.add("TRUE"); + reservedWords.add("TRUNCATE"); + reservedWords.add("TRUSTED"); + reservedWords.add("TYPE"); + reservedWords.add("UESCAPE"); + reservedWords.add("UNBOUNDED"); + reservedWords.add("UNCOMMITTED"); + reservedWords.add("UNDER"); + reservedWords.add("UNENCRYPTED"); + reservedWords.add("UNION"); + reservedWords.add("UNIQUE"); + reservedWords.add("UNKNOWN"); + reservedWords.add("UNLISTEN"); + reservedWords.add("UNNAMED"); + reservedWords.add("UNNEST"); + reservedWords.add("UNTIL"); + reservedWords.add("UPDATE"); + reservedWords.add("UPPER"); + reservedWords.add("USAGE"); + reservedWords.add("USER"); + reservedWords.add("USER_DEFINED_TYPE_CATALOG"); + reservedWords.add("USER_DEFINED_TYPE_CODE"); + reservedWords.add("USER_DEFINED_TYPE_NAME"); + reservedWords.add("USER_DEFINED_TYPE_SCHEMA"); + reservedWords.add("USING"); + reservedWords.add("VACUUM"); + reservedWords.add("VALID"); + reservedWords.add("VALIDATOR"); + reservedWords.add("VALUE"); + reservedWords.add("VALUES"); + reservedWords.add("VARCHAR"); + reservedWords.add("VARIABLE"); + reservedWords.add("VARYING"); + reservedWords.add("VAR_POP"); + reservedWords.add("VAR_SAMP"); + reservedWords.add("VERBOSE"); + reservedWords.add("VIEW"); + reservedWords.add("VOLATILE"); + reservedWords.add("WHEN"); + reservedWords.add("WHENEVER"); + reservedWords.add("WHERE"); + reservedWords.add("WIDTH_BUCKET"); + reservedWords.add("WINDOW"); + reservedWords.add("WITH"); + reservedWords.add("WITHIN"); + reservedWords.add("WITHOUT"); + reservedWords.add("WORK"); + reservedWords.add("WRITE"); + reservedWords.add("YEAR"); + reservedWords.add("ZONE"); + + return reservedWords.contains(word.toUpperCase()); + } + + +} diff --git a/src/main/java/ru/fusionsoft/dbgit/postgres/DBBackupAdapterPostgres.java b/src/main/java/ru/fusionsoft/dbgit/postgres/DBBackupAdapterPostgres.java index 4f144a9..8900bdd 100644 --- a/src/main/java/ru/fusionsoft/dbgit/postgres/DBBackupAdapterPostgres.java +++ b/src/main/java/ru/fusionsoft/dbgit/postgres/DBBackupAdapterPostgres.java @@ -81,39 +81,43 @@ public IMetaObject backupDBObject(IMetaObject obj) throws Exception { dropIfExists(isSaveToSchema() ? PREFIX + schema : schema, isSaveToSchema() ? objectName : PREFIX + objectName, stLog); - - String ddl = ""; + + StringBuilder ddl; if (isToSaveData()) { - ddl = "create table " + tableName + " as (select * from " + schema + "." + objectName + ")" + - (metaTable.getTable().getOptions().getChildren().containsKey("tablespace") ? - " tablespace " + metaTable.getTable().getOptions().get("tablespace").getData() : "") +";\n"; - ddl += "alter table "+ tableName + " owner to "+ metaTable.getTable().getOptions().get("owner").getData()+";\n"; - } else { - - ddl ="create table " + tableName + "() " + - (metaTable.getTable().getOptions().getChildren().containsKey("tablespace") ? - " tablespace " + metaTable.getTable().getOptions().get("tablespace").getData() : "") +";\n"; - ddl += "alter table "+ tableName + " owner to "+ metaTable.getTable().getOptions().get("tableowner").getData()+";\n"; - - + ddl = new StringBuilder("create table " + tableName + " as (select * from " + schema + "." + objectName + ")" + + (metaTable.getTable().getOptions().getChildren().containsKey("tablespace") ? + " tablespace " + metaTable.getTable().getOptions().get("tablespace").getData() : "") + ";\n"); + ddl.append("alter table ").append(tableName).append(" owner to ") + .append(metaTable.getTable().getOptions().get("owner").getData()).append(";\n"); + } else { + ddl = new StringBuilder("create table " + tableName + "() " + + (metaTable.getTable().getOptions().getChildren().containsKey("tablespace") ? + " tablespace " + metaTable.getTable().getOptions().get("tablespace").getData() : "") + ";\n"); + ddl.append("alter table ").append(tableName).append(" owner to ") + .append(metaTable.getTable().getOptions().get("tableowner").getData()).append(";\n"); + + for (DBTableField field : metaTable.getFields().values()) { - ddl += "alter table " + tableName + " add " + field.getName() + " " + field.getTypeSQL() + ";\n"; - } - + ddl.append("alter table ").append(tableName).append(" add ") + .append(field.getName()).append(" ").append(field.getTypeSQL()).append(";\n"); + } + } for (DBConstraint constraint : metaTable.getConstraints().values()) { - ddl += "alter table "+ tableName +" add constraint " + PREFIX + constraint.getName() + " " + constraint.getSql() + ";\n"; + ddl.append("alter table ").append(tableName).append(" add constraint ").append(PREFIX) + .append(constraint.getName()).append(" ").append(constraint.getSql()).append(";\n"); } for (DBIndex index : metaTable.getIndexes().values()) { - String indexDdl = index.getSql() + (metaTable.getTable().getOptions().getChildren().containsKey("tablespace") ? + String indexDdl = index.getSql() + + (metaTable.getTable().getOptions().getChildren().containsKey("tablespace") ? " tablespace "+index.getOptions().get("tablespace").getData() : "") + ";\n"; indexDdl = indexDdl.replace(index.getName(), PREFIX + index.getName()); if (indexDdl.length() > 3) - ddl += indexDdl; + ddl.append(indexDdl); } - stLog.execute(ddl); + stLog.execute(ddl.toString()); File file = new File(DBGitPath.getFullPath() + metaTable.getFileName()); if (file.exists()) diff --git a/src/main/java/ru/fusionsoft/dbgit/postgres/DBRestoreTableDataPostgres.java b/src/main/java/ru/fusionsoft/dbgit/postgres/DBRestoreTableDataPostgres.java index 235b7c4..2c4f399 100644 --- a/src/main/java/ru/fusionsoft/dbgit/postgres/DBRestoreTableDataPostgres.java +++ b/src/main/java/ru/fusionsoft/dbgit/postgres/DBRestoreTableDataPostgres.java @@ -1,17 +1,12 @@ package ru.fusionsoft.dbgit.postgres; import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; -import java.sql.Clob; import java.sql.Connection; import java.sql.ResultSet; -import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; @@ -21,6 +16,7 @@ import java.util.Set; import java.util.StringJoiner; +import org.apache.commons.lang3.StringUtils; import ru.fusionsoft.dbgit.adapters.DBRestoreAdapter; import ru.fusionsoft.dbgit.adapters.IDBAdapter; import ru.fusionsoft.dbgit.core.ExceptionDBGit; @@ -80,7 +76,7 @@ public boolean restoreMetaObject(IMetaObject obj, int step) throws Exception { currentTableData.setMapRows(new TreeMapRowData()); currentTableData.setDataTable(restoreTableData.getDataTable()); } - currentTableData.getmapRows().clear(); + currentTableData.getMapRows().clear(); if (getAdapter().getTable(schema, currentTableData.getTable().getName()) != null) { currentTableData.setDataTable(getAdapter().getTableData(schema, currentTableData.getTable().getName())); @@ -133,13 +129,13 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa Connection connect = adapter.getConnection(); StatementLogging st = new StatementLogging(connect, adapter.getStreamOutputSqlCommand(), adapter.isExecSql()); try { - if (restoreTableData.getmapRows() == null) + if (restoreTableData.getMapRows() == null) restoreTableData.setMapRows(new TreeMapRowData()); String fields = ""; - if (restoreTableData.getmapRows().size() > 0) - fields = keysToString(restoreTableData.getmapRows().firstEntry().getValue().getData().keySet()) + " values "; - MapDifference diffTableData = Maps.difference(restoreTableData.getmapRows(),currentTableData.getmapRows()); + if (restoreTableData.getMapRows().size() > 0) + fields = keysToString(restoreTableData.getMapRows().firstEntry().getValue().getData().keySet()) + " values "; + MapDifference diffTableData = Maps.difference(restoreTableData.getMapRows(),currentTableData.getMapRows()); String schema = getPhisicalSchema(restoreTableData.getTable().getSchema()); schema = (SchemaSynonym.getInstance().getSchema(schema) == null) ? schema : SchemaSynonym.getInstance().getSchema(schema); @@ -150,48 +146,24 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa ResultSet rsTypes = st.executeQuery("select column_name, data_type from information_schema.columns \r\n" + "where lower(table_schema||'.'||table_name) = lower('" + tblName + "')"); - HashMap colTypes = new HashMap(); + HashMap colTypes = new HashMap<>(); while (rsTypes.next()) { colTypes.put(rsTypes.getString("column_name"), rsTypes.getString("data_type")); } - if(!diffTableData.entriesOnlyOnLeft().isEmpty()) { + if (!diffTableData.entriesOnlyOnLeft().isEmpty()) { ConsoleWriter.detailsPrint(lang.getValue("general", "restore", "inserting"), 2); - for(RowData rowData:diffTableData.entriesOnlyOnLeft().values()) { - ArrayList fieldsList = new ArrayList(rowData.getData().keySet()); + for (RowData rowData : diffTableData.entriesOnlyOnLeft().values()) { + ArrayList fieldsList = new ArrayList<>(rowData.getData().keySet()); String insertQuery = "insert into "+tblName + fields+valuesToString(rowData.getData().values(), colTypes, fieldsList) + ";\n"; ConsoleWriter.detailsPrintLn(insertQuery); - PrepareStatementLogging ps = new PrepareStatementLogging(connect, insertQuery, adapter.getStreamOutputSqlCommand(), adapter.isExecSql()); - int i = 0; - - for (ICellData data : rowData.getData().values()) { - i++; - ConsoleWriter.detailsPrintLn(data.getSQLData()); - - ResultSet rs = st.executeQuery("select data_type from information_schema.columns \r\n" + - "where lower(table_schema||'.'||table_name) = lower('" + tblName + "') and lower(column_name) = '" + fieldsList.get(i - 1) + "'"); - - boolean isBoolean = false; - while (rs.next()) { - if (rs.getString("data_type").contains("boolean")) { - isBoolean = true; - } - } - - //ps = setValues(data, i, ps, isBoolean); - } - - //if (adapter.isExecSql()) - // ps.execute(); - //ps.close(); - st.execute(insertQuery); } ConsoleWriter.detailsPrintlnGreen(lang.getValue("general", "ok")); @@ -199,7 +171,7 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa if(!diffTableData.entriesOnlyOnRight().isEmpty()){ ConsoleWriter.detailsPrint(lang.getValue("general", "restore", "deleting"), 2); - String deleteQuery=""; + StringBuilder deleteQuery= new StringBuilder(); Map primarykeys = new HashMap(); for(RowData rowData:diffTableData.entriesOnlyOnRight().values()) { Map tempcols = rowData.getData(); @@ -220,21 +192,21 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa StringJoiner valuejoiner = new StringJoiner(","); for (Map.Entry entry : primarykeys.entrySet()) { fieldJoiner.add("\""+entry.getKey()+"\""); - valuejoiner.add("\'"+entry.getValue()+"\'"); + valuejoiner.add("'"+entry.getValue()+"'"); } delFields+=fieldJoiner.toString()+")"; delValues+=valuejoiner.toString()+")"; primarykeys.clear(); if (delValues.length() > 3) - deleteQuery+="delete from " + tblName+ - " where " + delFields + " = " + delValues + ";\n"; + deleteQuery.append("delete from ").append(tblName).append(" where ") + .append(delFields).append(" = ").append(delValues).append(";\n"); if(deleteQuery.length() > 50000 ){ - st.execute(deleteQuery); - deleteQuery = ""; + st.execute(deleteQuery.toString()); + deleteQuery = new StringBuilder(); } } if(deleteQuery.length()>1) { - st.execute(deleteQuery); + st.execute(deleteQuery.toString()); } ConsoleWriter.detailsPrintlnGreen(lang.getValue("general", "ok")); } @@ -242,12 +214,12 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa if(!diffTableData.entriesDiffering().isEmpty()) { ConsoleWriter.detailsPrint(lang.getValue("general", "restore", "updating"), 2); String updateQuery=""; - Map primarykeys = new HashMap(); + Map primarykeys = new HashMap<>(); for(ValueDifference diffRowData:diffTableData.entriesDiffering().values()) { if(!diffRowData.leftValue().getHashRow().equals(diffRowData.rightValue().getHashRow())) { Map tempCols = diffRowData.leftValue().getData(); String[] keysArray = diffRowData.leftValue().getKey().split("_"); - for(String key:keysArray) { + for(String key : keysArray) { for (String o : tempCols.keySet()) { if (tempCols.get(o) == null || tempCols.get(o).convertToString() == null) continue; if (tempCols.get(o).convertToString().equals(key)) { @@ -264,7 +236,7 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa StringJoiner valuejoiner = new StringJoiner(","); for (Map.Entry entry : primarykeys.entrySet()) { fieldJoiner.add("\""+entry.getKey()+"\""); - valuejoiner.add("\'"+entry.getValue()+"\'"); + valuejoiner.add("'"+entry.getValue()+"'"); } keyFields+=fieldJoiner.toString()+")"; keyValues+=valuejoiner.toString()+")"; @@ -286,8 +258,9 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa updFields+=updfieldJoiner.toString()+")"; updValues+=updvaluejoiner.toString()+")"; - updateQuery="update "+tblName+ - " set "+updFields + " = " + valuesToString(tempCols.values(), colTypes, fieldsList) + " where " + keyFields+ "=" +keyValues+";\n"; + updateQuery="update " + tblName + + " set " + updFields + " = " + valuesToString(tempCols.values(), colTypes, fieldsList) + + " where " + keyFields + "=" + keyValues + ";\n"; ConsoleWriter.detailsPrintLn(updateQuery); @@ -300,7 +273,8 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa ConsoleWriter.detailsPrintLn(data.getSQLData()); ResultSet rs = st.executeQuery("select data_type from information_schema.columns \r\n" + - "where lower(table_schema||'.'||table_name) = lower('" + tblName + "') and lower(column_name) = '" + fieldsList.get(i - 1) + "'"); + "where lower(table_schema||'.'||table_name) = lower('" + tblName + "') " + + "and lower(column_name) = '" + fieldsList.get(i - 1) + "'"); boolean isBoolean = false; while (rs.next()) { @@ -329,7 +303,7 @@ public void restoreTableDataPostgres(MetaTableData restoreTableData, MetaTableDa } } ConsoleWriter.detailsPrintlnGreen(lang.getValue("general", "ok")); - if(updateQuery.length()>1) { + if(updateQuery.length() > 1) { ConsoleWriter.println(updateQuery); st.execute(updateQuery); } @@ -453,20 +427,7 @@ else if (dt.startsWith("t") || dt.startsWith("T") || dt.equals("1") || dt.starts } public String keysToString(Set keys) { - String fields=""; - if(keys.size()>1) { - String[] fieldsArray = keys.toArray(new String[keys.size()]); - fields="("+fieldsArray[0]; - for(int i=1;i 0) { for (String item : children.keySet()) { - sb.append("\n"+prefix+item+":"+" "+children.get(item).toString(level+1)); + sb.append("\n" + prefix + item + ":" + " " + children.get(item).toString(level + 1)); } } else { sb.append(getData()); diff --git a/src/main/java/ru/fusionsoft/dbgit/yaml/DBGitYamlRepresenter.java b/src/main/java/ru/fusionsoft/dbgit/yaml/DBGitYamlRepresenter.java index 9145436..30dfcd3 100644 --- a/src/main/java/ru/fusionsoft/dbgit/yaml/DBGitYamlRepresenter.java +++ b/src/main/java/ru/fusionsoft/dbgit/yaml/DBGitYamlRepresenter.java @@ -39,7 +39,7 @@ */ public class DBGitYamlRepresenter extends Representer { - class ComparatorProperty implements Comparator { + static class ComparatorProperty implements Comparator { public static final int MAX_ORDER = 1000; private Map propertyOrders = new HashMap<>();