001package gudusoft.gsqlparser.sqlenv.parser.grabit; 002 003import gudusoft.gsqlparser.EDbVendor; 004import gudusoft.gsqlparser.sqlenv.ESQLDataObjectType; 005import gudusoft.gsqlparser.sqlenv.IdentifierProfile; 006import gudusoft.gsqlparser.sqlenv.TSQLEnv; 007import gudusoft.gsqlparser.sqlenv.TSQLSchema; 008import gudusoft.gsqlparser.sqlenv.TSQLTable; 009import gudusoft.gsqlparser.util.SQLUtil; 010 011import java.util.List; 012import java.util.Map; 013 014@SuppressWarnings("rawtypes") 015public class GrabitSQLEnv extends TSQLEnv { 016 017 private Map jsonContent; 018 019 private Boolean init = false; 020 021 public GrabitSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, EDbVendor dbVendor, Map jsonContent) { 022 this(defaultServer, defaultDatabase, defaultSchema, dbVendor, jsonContent, null); 023 } 024 025 /** 026 * Same input, analyzed under an explicit identifier configuration. 027 * 028 * <p>The metadata this environment registers is indexed with {@code identifierProfile}, so the 029 * analysis that reads it back asks the catalog the same question it was filled with. A profile 030 * belonging to another vendor is not applied ({@link IdentifierProfile#forVendorOr}); null means 031 * the vendor default. 032 */ 033 public GrabitSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, EDbVendor dbVendor, Map jsonContent, IdentifierProfile identifierProfile) { 034 super(dbVendor, IdentifierProfile.forVendorOr(identifierProfile, dbVendor)); 035 if(!SQLUtil.isEmpty(defaultServer) && !defaultServer.equals(TSQLEnv.DEFAULT_SERVER_NAME)) { 036 setDefaultServerName(defaultServer); 037 } 038 if(!SQLUtil.isEmpty(defaultDatabase) && !defaultDatabase.equals(TSQLEnv.DEFAULT_DB_NAME)) { 039 setDefaultCatalogName(defaultDatabase); 040 } 041 if(!SQLUtil.isEmpty(defaultSchema) && !defaultSchema.equals(TSQLEnv.DEFAULT_SCHEMA_NAME)) { 042 setDefaultSchemaName(defaultSchema); 043 } 044 this.jsonContent = jsonContent; 045 initSQLEnv(); 046 } 047 048 @Override 049 public void initSQLEnv() { 050 synchronized (init) { 051 if (jsonContent == null || init) 052 return; 053 if(jsonContent.containsKey("databaseModel")){ 054 jsonContent = (Map)jsonContent.get("databaseModel"); 055 } 056 List databases = (List) jsonContent.get("databases"); 057 if (databases != null) { 058 for (int i = 0; i < databases.size(); i++) { 059 Map jsonDatabase = (Map) databases.get(i); 060 String databaseName = (String) jsonDatabase.get("name"); 061 if(databaseName.indexOf(".")!=-1) { 062 databaseName = SQLUtil.quoteDottedName(this.getDBVendor(), ESQLDataObjectType.dotCatalog, databaseName); 063 } 064 List tables = (List) jsonDatabase.get("tables"); 065 for (int j = 0; j < tables.size(); j++) { 066 Map jsonTable = (Map) tables.get(j); 067 String schemeName = (String) jsonTable.get("schema"); 068 if(schemeName.indexOf(".")!=-1) { 069 schemeName = SQLUtil.quoteDottedName(this.getDBVendor(), ESQLDataObjectType.dotSchema, schemeName); 070 } 071 String tableName = (String) jsonTable.get("name"); 072 if(tableName.indexOf(".")!=-1) { 073 tableName = SQLUtil.quoteDottedName(this.getDBVendor(), ESQLDataObjectType.dotTable, tableName); 074 } 075 TSQLSchema sqlSchema = getSQLSchema(databaseName + "." + schemeName, true); 076 TSQLTable sqlTable = sqlSchema.createTable(tableName, 3); 077 if (jsonTable.containsKey("isView")) { 078 sqlTable.setView(Boolean.parseBoolean((String) jsonTable.get("isView"))); 079 } 080 List columns = (List) jsonTable.get("columns"); 081 for (int k = 0; k < columns.size(); k++) { 082 Map jsonColumn = (Map) columns.get(k); 083 sqlTable.addColumn((String) jsonColumn.get("name")); 084 } 085 } 086 } 087 088 jsonContent = null; 089 init = true; 090 } 091 } 092 } 093 094}