From bc926822dddd05d55678696999e3b8b0fd415570 Mon Sep 17 00:00:00 2001 From: Dennis Kao <ulysseskao@gmail.com> Date: Mon, 10 Mar 2014 12:28:24 +0800 Subject: [PATCH] update for increment and theme jobs --- xdgnjobs/ximple-jobcarrier/quartz.properties | 3 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties | 3 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java | 45 ++++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java | 20 ++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java | 351 +++++++++++++++++++------------------------ xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml | 18 + xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml | 14 7 files changed, 235 insertions(+), 219 deletions(-) diff --git a/xdgnjobs/ximple-jobcarrier/quartz.properties b/xdgnjobs/ximple-jobcarrier/quartz.properties index 19eb15a..78574f9 100644 --- a/xdgnjobs/ximple-jobcarrier/quartz.properties +++ b/xdgnjobs/ximple-jobcarrier/quartz.properties @@ -25,8 +25,9 @@ org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin #org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml -org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_inc.xml +#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_inc.xml #org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_edb.xml +org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_colowner.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 10 diff --git a/xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml b/xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml index c086024..30d36a9 100644 --- a/xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml +++ b/xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml @@ -19,7 +19,7 @@ <schedule> <job> - <name>ConvertDMMS2PostGisWithGeoserver</name> + <name>ConvertPowerThemesIntoPostGISJob</name> <group>DEFAULT</group> <description>A job that convert dgn to postgis</description> <job-class>com.ximple.eofms.jobs.OracleConvertThemes2PostGISJob</job-class> @@ -30,12 +30,12 @@ <job-data-map> <entry> <key>JOBDATA_DIR</key> - <value>/Users/ulysseskao/Projects/XGeoDMMS/xjobrun/nstpcjobs/jobdata</value> + <value>/Users/ulysseskao/Projects/XGeoDMMS/xjobrun/tctpcjobs/jobdata</value> <!--value>/mnt/hdisk/home.data/private/projects/xdcad/xjobrun/nntpcjobs/jobdata</value--> </entry> <entry> <key>PGHOST</key> - <value>10.16.17.14</value> + <value>10.10.1.17</value> </entry> <entry> <key>PGDATBASE</key> @@ -59,11 +59,11 @@ </entry> <entry> <key>ORAHOST</key> - <value>10.16.17.14</value> + <value>10.10.1.17</value> </entry> <entry> <key>ORAINST</key> - <value>nntpc</value> + <value>orcl</value> </entry> <entry> <key>ORAPORT</key> @@ -75,7 +75,7 @@ </entry> <entry> <key>ORAPASS</key> - <value>manager</value> + <value>simple000</value> </entry> <entry> <key>ORGSCHEMA</key> @@ -93,6 +93,10 @@ <entry> <key>CONVERTELEMIN</key> <value>false</value> + </entry> + <entry> + <key>CONVERTPWTHEMES</key> + <value>true</value> </entry> <entry> <key>CREATEDUMMY</key> @@ -149,7 +153,7 @@ <simple> <name>convertTrigger</name> <group>DEFAULT</group> - <job-name>ConvertDMMS2PostGisWithGeoserver</job-name> + <job-name>ConvertPowerThemesIntoPostGISJob</job-name> <job-group>DEFAULT</job-group> <start-time>2013-03-01T18:00:00</start-time> <!-- repeat indefinitely every 10 seconds --> diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties index 1619aaa..31202fd 100644 --- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties +++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties @@ -25,8 +25,9 @@ org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin #org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml -org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_inc.xml +#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_inc.xml #org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_edb.xml +org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_colowner.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 10 diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml index 1a85d52..30d36a9 100644 --- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml +++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml @@ -19,7 +19,7 @@ <schedule> <job> - <name>ConvertDMMS2PostGisWithGeoserver</name> + <name>ConvertPowerThemesIntoPostGISJob</name> <group>DEFAULT</group> <description>A job that convert dgn to postgis</description> <job-class>com.ximple.eofms.jobs.OracleConvertThemes2PostGISJob</job-class> @@ -30,12 +30,12 @@ <job-data-map> <entry> <key>JOBDATA_DIR</key> - <value>/Users/ulysseskao/Projects/XGeoDMMS/xjobrun/nstpcjobs/jobdata</value> + <value>/Users/ulysseskao/Projects/XGeoDMMS/xjobrun/tctpcjobs/jobdata</value> <!--value>/mnt/hdisk/home.data/private/projects/xdcad/xjobrun/nntpcjobs/jobdata</value--> </entry> <entry> <key>PGHOST</key> - <value>10.16.17.14</value> + <value>10.10.1.17</value> </entry> <entry> <key>PGDATBASE</key> @@ -59,11 +59,11 @@ </entry> <entry> <key>ORAHOST</key> - <value>10.16.17.14</value> + <value>10.10.1.17</value> </entry> <entry> <key>ORAINST</key> - <value>nntpc</value> + <value>orcl</value> </entry> <entry> <key>ORAPORT</key> @@ -75,7 +75,7 @@ </entry> <entry> <key>ORAPASS</key> - <value>manager</value> + <value>simple000</value> </entry> <entry> <key>ORGSCHEMA</key> @@ -153,7 +153,7 @@ <simple> <name>convertTrigger</name> <group>DEFAULT</group> - <job-name>ConvertDMMS2PostGisWithGeoserver</job-name> + <job-name>ConvertPowerThemesIntoPostGISJob</job-name> <job-group>DEFAULT</job-group> <start-time>2013-03-01T18:00:00</start-time> <!-- repeat indefinitely every 10 seconds --> diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java index a0b117a..cc2a050 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java @@ -605,7 +605,7 @@ private String retrieveCurrentSchemaName(Connection connection, short status) throws SQLException { StringBuilder sbSQL = new StringBuilder("SELECT vsschema, vstimestamp, vsstatus FROM "); - sbSQL.append(DataReposVersionManager.XGVERSIONTABLE_NAME); + sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)); sbSQL.append(" WHERE vsstatus = "); sbSQL.append(status); sbSQL.append(" ORDER BY vsid"); @@ -628,14 +628,14 @@ } } - private void updateCurrentThemeStatus(Connection connection, String schemaName, short newStatus) + private void updateCurrentThemeStatus(Connection connection, String themeTableName, short newStatus) throws SQLException { StringBuilder sbSQL = new StringBuilder("UPDATE "); sbSQL.append(DataReposVersionManager.XPTVERSIONTABLE_NAME).append(' '); sbSQL.append(" SET vptstatus = "); sbSQL.append(newStatus); sbSQL.append(", vpttimestamp = CURRENT_TIMESTAMP WHERE vptname = '"); - sbSQL.append(schemaName).append("'"); + sbSQL.append(themeTableName).append("'"); Statement stmt = null; try { @@ -659,8 +659,10 @@ private String retrieveCurrentThemeName(Connection connection, short status) throws SQLException { StringBuilder sbSQL = new StringBuilder("SELECT "); - sbSQL.append("vptname, vptstatus, vpttimestamp FROM "); - sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' '); + sbSQL.append("vptname, vpttimestamp, vptstatus FROM "); + sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)); + sbSQL.append(" WHERE vptstatus = "); + sbSQL.append(status); sbSQL.append("ORDER BY vptid"); String result = null; @@ -703,6 +705,32 @@ } catch (SQLException e) { logger.warn(e.getMessage(), e); throw new JobExecutionException("Update " + DataReposVersionManager.XGVERSIONTABLE_NAME + + " has error-", e); + } + } + + protected void transferThemesVersionStatus(Connection connection, + short vsstatusBefore, short vsstatusAfter, boolean exclusive) throws JobExecutionException { + + try { + String currentTargetTheme = retrieveCurrentThemeName(connection, vsstatusBefore); + if (currentTargetTheme == null) { + logger.info("Cannot found target schema in dataStore. status=" + vsstatusBefore); + return; + } + String existTargetSchema = null; + if (exclusive) + existTargetSchema = retrieveCurrentThemeName(connection, vsstatusAfter); + + + updateCurrentThemeStatus(connection, currentTargetTheme, vsstatusAfter); + if ((exclusive) && (existTargetSchema != null)) { + updateCurrentThemeStatus(connection, existTargetSchema, + DataReposVersionManager.VSSTATUS_AVAILABLE); + } + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + throw new JobExecutionException("Update " + DataReposVersionManager.XPTVERSIONTABLE_NAME + " has error-", e); } } @@ -869,6 +897,9 @@ connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); transferXGeosVersionStatus(connection, DataReposVersionManager.VSSTATUS_LINKVIEW, DataReposVersionManager.VSSTATUS_CONFIG, false); + transferThemesVersionStatus(connection, DataReposVersionManager.VSSTATUS_LINKVIEW, + DataReposVersionManager.VSSTATUS_CONFIG, false); + URL geoServerURL = new URL(_geoServerURL); GeoServerRESTManager manager = new GeoServerRESTManager(geoServerURL, _geoServerUser, _geoServerPass); GeoServerRESTReader reader = manager.getReader(); @@ -906,7 +937,9 @@ resetWMSVirtualLayerMapping(jobExecutionContext, connection, manager, true); transferXGeosVersionStatus(connection, DataReposVersionManager.VSSTATUS_CONFIG, - DataReposVersionManager.VSSTATUS_USING, true); + DataReposVersionManager.VSSTATUS_USING, true); + transferThemesVersionStatus(connection, DataReposVersionManager.VSSTATUS_CONFIG, + DataReposVersionManager.VSSTATUS_USING, true); Date lastUpdate = Calendar.getInstance().getTime(); } catch (IOException e) { logger.warn(e.getMessage(), e); diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java index 974237e..93b1a89 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java @@ -1346,7 +1346,7 @@ values[0] = rs.getString("vptname"); values[1] = rs.getShort("vptstatus"); tmpTablenames.add(values); - if ((((Short) values[1]) & DataReposVersionManager.VSSTATUS_USING) != 0) { + if (((Short) values[1]) >= DataReposVersionManager.VSSTATUS_LINKVIEW) { current = i; } i++; @@ -1923,11 +1923,23 @@ Statement stmt = connection.createStatement(); ResultSet rs = null; try { - stmt.execute("CREATE TABLE " + tableName +" AS SELECT * FROM " + tempTable); + boolean found = false; rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"}); if (rs.next()) { - stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) + - " ADD PRIMARY KEY (tid, oid)"); + found = true; + } + JDBCUtils.close(rs); + + if (!found) { + stmt.execute("CREATE TABLE " + tableName +" AS SELECT * FROM " + tempTable); + rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"}); + if (rs.next()) { + stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) + + " ADD PRIMARY KEY (tid, oid)"); + } + } else { + stmt.execute("TRUNCATE "+ tableName + " CASCADE"); + stmt.execute("SELECT * INTO " + tableName + " FROM " + tempTable); } stmt.execute("DROP TABLE " + tempTable); } finally { diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java index 6fd990d..8cdc8ab 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java @@ -17,6 +17,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TreeMap; import java.util.TreeSet; import com.ximple.eofms.geoserver.config.XGeosDataConfig; @@ -39,6 +40,7 @@ import org.geotools.jdbc.JDBCDataStore; import org.postgresql.PGConnection; import org.postgresql.copy.CopyManager; +import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; @@ -110,6 +112,8 @@ private long queryTime = 0; private long queryTimeStart = 0; + private String currentThemeTable = null; + private Short currentThemeStatus = -1; public Log getLogger() { return logger; @@ -124,6 +128,52 @@ protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException { super.extractJobConfiguration(jobDetail); + + JobDataMap dataMap = jobDetail.getJobDataMap(); + _pgHost = dataMap.getString(PGHOST); + _pgDatabase = dataMap.getString(PGDATBASE); + _pgPort = dataMap.getString(PGPORT); + _pgSchema = dataMap.getString(PGSCHEMA); + _pgUsername = dataMap.getString(PGUSER); + _pgPassword = dataMap.getString(PGPASS); + _pgUseWKB = dataMap.getString(USEWKB); + + Log logger = getLogger(); + if (_pgHost == null) { + logger.warn("PGHOST is null"); + throw new JobExecutionException("Unknown PostGIS host."); + } + if (_pgDatabase == null) { + logger.warn("PGDATABASE is null"); + throw new JobExecutionException("Unknown PostGIS database."); + } + if (_pgPort == null) { + logger.warn("PGPORT is null"); + throw new JobExecutionException("Unknown PostGIS port."); + } + if (_pgSchema == null) { + logger.warn("PGSCHEMA is null"); + throw new JobExecutionException("Unknown PostGIS schema."); + } + if (_pgUsername == null) { + logger.warn("PGUSERNAME is null"); + throw new JobExecutionException("Unknown PostGIS username."); + } + if (_pgPassword == null) { + logger.warn("PGPASSWORD is null"); + throw new JobExecutionException("Unknown PostGIS password."); + } + + Map<String, String> remote = new TreeMap<String, String>(); + remote.put(PostgisNGDataStoreFactory.DBTYPE.key, "postgis"); + // remote.put("charset", "UTF-8"); + remote.put(PostgisNGDataStoreFactory.HOST.key, _pgHost); + remote.put(PostgisNGDataStoreFactory.PORT.key, _pgPort); + remote.put(PostgisNGDataStoreFactory.DATABASE.key, _pgDatabase); + remote.put(PostgisNGDataStoreFactory.USER.key, _pgUsername); + remote.put(PostgisNGDataStoreFactory.PASSWD.key, _pgPassword); + // remote.put( "namespace", null); + pgProperties = remote; } protected XGeosDataConfigMapping getConfigMapping() { @@ -177,17 +227,15 @@ } long t1 = System.currentTimeMillis(); - String targetSchemaName, targetThemeTable; + String targetThemeTable; try { logger.info("-- step:clearOutputDatabase --"); - - targetSchemaName = determineTargetSchemaName(); - targetThemeTable = determineTargetThemeTableName(); OracleConvertPostGISJobContext jobContext = null; if (checkConvertPWThemes()) { - jobContext = (OracleConvertPostGISJobContext) prepareJobContext(targetSchemaName, _filterPath, + targetThemeTable = determineTargetThemeTableName(); + jobContext = (OracleConvertPostGISJobContext) prepareJobContext("public", _filterPath, isProfileMode(), isTransformed()); jobContext.setSourceDataStore(getSourceDataStore()); jobContext.setElementLogging(checkElementLogging()); @@ -209,9 +257,9 @@ logTimeDiff("Profile-convertFeatureDesignFile", tStep, tStepEnd); } jobContext.closeOracleConnection(); - } - updatePWThemeStatusToReady(targetThemeTable); + updatePWThemeStatusToReady(targetThemeTable); + } long t2 = System.currentTimeMillis(); // public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; @@ -228,13 +276,19 @@ logger.warn(jobName + " end at " + new Date()); + createTargetDataStore(); + if (getTargetDataStore() == null) { + logger.warn("Cannot connect source postgreSQL database."); + throw new JobExecutionException("Cannot connect source postgreSQL database."); + } + try { - logger.info("-- step:resetPostgisViewMapping --"); + logger.info("-- step:resetThemesViewMapping --"); long tStep = System.currentTimeMillis(); resetThemesViewMapping(context); if (isProfileMode()) { long tStepEnd = System.currentTimeMillis(); - logTimeDiff("Profile-resetPostgisViewMapping", tStep, tStepEnd); + logTimeDiff("Profile-resetThemesViewMapping", tStep, tStepEnd); } logger.info("-- step:resetGeoServerConfig --"); tStep = System.currentTimeMillis(); @@ -253,7 +307,7 @@ * * @param executionContext 批次執行的關係 */ - private void resetThemesViewMapping(JobExecutionContext executionContext) { + private void resetThemesViewMapping(JobExecutionContext executionContext) throws JobExecutionException { assert executionContext != null; Connection connection = null; try { @@ -273,43 +327,18 @@ resetThemesBaseView(connection, ownerName, currentTargetThemesName); - XGeosDataConfigMapping configMapping = getConfigMapping(); - String[] allView = retrieveTargetStoreAllViewNames(connection); - TreeSet<String> allViewNames = new TreeSet<String>(); - if (allView != null) { - allViewNames.addAll(Arrays.asList(allView)); - } - List values = (List) configMapping.getMapping().get("pgOMS"); - for (Object value : values) { - XGeosDataConfig xgeosConfig = (XGeosDataConfig) value; - short tid = xgeosConfig.getFSC(); - short cid = xgeosConfig.getCOMP(); - StringBuilder sbTable = new StringBuilder("fsc-"); - sbTable.append(tid).append("-c-"); - sbTable.append(cid); - - int index = realTableNames.indexOf(sbTable.toString()); - if (index == -1) { - logger.debug("pgOMS LayerView Cannot found-" + xgeosConfig.toString()); - continue; - } - - StringBuilder sbView = new StringBuilder("fsc-"); - sbView.append(tid).append("-c"); - sbView.append(cid).append("-l"); - sbView.append(xgeosConfig.getLEV()).append("-w"); - sbView.append(xgeosConfig.getWEIGHT()); - String viewName = sbView.toString(); - if (allViewNames.contains(viewName)) { - resetThemesPostgisDataView(connection, ownerName, null, viewName); - if (tid == 106) { - resetFlowThemesPostgisDataView(connection, ownerName, null, viewName); - } - } + if (currentThemeTable == null) { + transferThemesVersionStatus(DataReposVersionManager.VSSTATUS_READY, + DataReposVersionManager.VSSTATUS_LINKVIEW, false); + } else { + transferThemesVersionStatus(DataReposVersionManager.VSSTATUS_READY, + currentThemeStatus, true); } + /* updateCurrentThemeStatus(connection, currentTargetThemesName, DataReposVersionManager.VSSTATUS_LINKVIEW); + */ // String[] featureNames = dataStore.getTypeNames(); // logger.info("featureNames[] size = " + featureNames.length); @@ -572,12 +601,12 @@ // connection.commit(); } - private Timestamp retrieveCurrentSchemaTimestamp(Connection connection, short status) throws SQLException { - StringBuilder sbSQL = new StringBuilder("SELECT vstimestamp, vsschema, vsstatus FROM "); - sbSQL.append(DataReposVersionManager.XGVERSIONTABLE_NAME); - sbSQL.append(" WHERE vsstatus = "); + private Timestamp retrieveCurrentThemeTimestamp(Connection connection, short status) throws SQLException { + StringBuilder sbSQL = new StringBuilder("SELECT vpttimestamp, vptname, vptstatus FROM "); + sbSQL.append(DataReposVersionManager.XPTVERSIONTABLE_NAME); + sbSQL.append(" WHERE vptstatus = "); sbSQL.append(status); - sbSQL.append(" ORDER BY vsid"); + sbSQL.append(" ORDER BY vptid"); Timestamp result = null; Statement stmt = null; @@ -597,66 +626,14 @@ } } - private void updateCurrentRepositoryStatus(Connection connection, String schemaName, short newStatus) - throws SQLException { - StringBuilder sbSQL = new StringBuilder("UPDATE "); - sbSQL.append(DataReposVersionManager.XGVERSIONTABLE_NAME).append(' '); - sbSQL.append(" SET vsstatus = "); - sbSQL.append(newStatus); - sbSQL.append(", vstimestamp = CURRENT_TIMESTAMP WHERE vsschema = '"); - sbSQL.append(schemaName).append("'"); - - Statement stmt = null; - try { - stmt = connection.createStatement(); - stmt.executeUpdate(sbSQL.toString()); - } finally { - if (stmt != null) stmt.close(); - } - } - - private boolean checkCurrentRepositoryStatus(Connection connection, short status) { - try { - return (retrieveCurrentSchemaName(connection, status) != null); - } catch (SQLException e) { - logger.warn(e.getMessage(), e); - return false; - } - } - - private String retrieveCurrentSchemaName(Connection connection, short status) throws SQLException { - StringBuilder sbSQL = new StringBuilder("SELECT vsschema, vstimestamp, vsstatus FROM "); - sbSQL.append(DataReposVersionManager.XGVERSIONTABLE_NAME); - sbSQL.append(" WHERE vsstatus = "); - sbSQL.append(status); - sbSQL.append(" ORDER BY vsid"); - - String result = null; - Statement stmt = null; - ResultSet rs = null; - - try { - stmt = connection.createStatement(); - rs = stmt.executeQuery(sbSQL.toString()); - // get first result - if (rs.next()) { - result = rs.getString(1); - } - return result; - } finally { - if (rs != null) rs.close(); - if (stmt != null) stmt.close(); - } - } - - private void updateCurrentThemeStatus(Connection connection, String schemaName, short newStatus) + private void updateCurrentThemeStatus(Connection connection, String themeTableName, short newStatus) throws SQLException { StringBuilder sbSQL = new StringBuilder("UPDATE "); sbSQL.append(DataReposVersionManager.XPTVERSIONTABLE_NAME).append(' '); sbSQL.append(" SET vptstatus = "); sbSQL.append(newStatus); sbSQL.append(", vpttimestamp = CURRENT_TIMESTAMP WHERE vptname = '"); - sbSQL.append(schemaName).append("'"); + sbSQL.append(themeTableName).append("'"); Statement stmt = null; try { @@ -677,11 +654,12 @@ } } - private String retrieveCurrentThemeName(Connection connection, short status) throws SQLException { StringBuilder sbSQL = new StringBuilder("SELECT "); - sbSQL.append("vptname, vptstatus, vpttimestamp FROM "); - sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' '); + sbSQL.append("vptname, vpttimestamp, vptstatus FROM "); + sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)); + sbSQL.append(" WHERE vptstatus = "); + sbSQL.append(status); sbSQL.append("ORDER BY vptid"); String result = null; @@ -702,11 +680,10 @@ } } - protected String[] retrieveTargetStoreAllViewNames(Connection connection) { try { final int TABLE_NAME_COL = 3; - List list = new ArrayList(); + List<String> list = new ArrayList<String>(); DatabaseMetaData meta = connection.getMetaData(); // String[] tableType = { "TABLE", "VIEW" }; @@ -755,12 +732,6 @@ pgProperties.put(PostgisNGDataStoreFactory.MINCONN.key, "1"); } - /* - if (!pgProperties.containsKey(PostgisNGDataStoreFactory.WKBENABLED.key)) { - pgProperties.put(PostgisNGDataStoreFactory.WKBENABLED.key, "true"); - } - */ - if (!dataStoreFactory.canProcess(pgProperties)) { getLogger().warn("cannot process properties-"); throw new JobExecutionException("cannot process properties-"); @@ -781,76 +752,6 @@ } } - private String determineTargetSchemaName() throws IOException { - if (targetDataStore == null) return null; - Connection connection = null; - Statement stmt = null; - ResultSet rs = null; - String targetSchema = null; - boolean needCreate = false; - try { - connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); - // Create XGVERSIONTABLE_NAME - rs = connection.getMetaData().getTables(null, _pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME, new String[]{"TABLE"}); - if (!rs.next()) needCreate = true; - if (needCreate) { - rs.close(); - return null; - } - rs.close(); - - StringBuilder sbSQL = new StringBuilder("SELECT "); - sbSQL.append("vsschema, vsstatus FROM "); - sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' '); - sbSQL.append("ORDER BY vsid"); - stmt = connection.createStatement(); - rs = stmt.executeQuery(sbSQL.toString()); - ArrayList<Object[]> tmpSchemas = new ArrayList<Object[]>(); - int i = 0; - int current = -1; - while (rs.next()) { - Object[] values = new Object[2]; - values[0] = rs.getString("vsschema"); - values[1] = rs.getShort("vsstatus"); - tmpSchemas.add(values); - if ((((Short) values[1]) & DataReposVersionManager.VSSTATUS_USING) != 0) { - current = i; - } - i++; - } - - if (current == -1) { - Object[] values = tmpSchemas.get(0); - targetSchema = (String) values[0]; - } else if (current < (tmpSchemas.size() - 1)) { - Object[] values = tmpSchemas.get(current + 1); - targetSchema = (String) values[0]; - } else { - Object[] values = tmpSchemas.get(0); - targetSchema = (String) values[0]; - } - - sbSQL = new StringBuilder("UPDATE "); - sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' '); - sbSQL.append(" SET vsstatus = "); - sbSQL.append(DataReposVersionManager.VSSTATUS_COVERT); - sbSQL.append(" WHERE vsschema = '"); - sbSQL.append(targetSchema).append("'"); - int count = stmt.executeUpdate(sbSQL.toString()); - if (count != 1) { - logger.info("update status for " + targetSchema + " update result count=" - + count); - } - } catch (SQLException e) { - logger.warn(e.getMessage(), e); - } finally { - JDBCUtils.close(rs); - JDBCUtils.close(stmt); - JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); - } - return targetSchema; - } - private String determineTargetThemeTableName() throws IOException { if (targetDataStore == null) return null; Connection connection = null; @@ -864,10 +765,10 @@ needCreate = false; rs = connection.getMetaData().getTables(null, _pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME, new String[]{"TABLE"}); if (!rs.next()) needCreate = true; - if (needCreate) + if (needCreate) { createXPWThemeVersionTable(connection, _pgSchema); + } rs.close(); - rs = null; StringBuilder sbSQL = new StringBuilder("SELECT "); @@ -884,8 +785,10 @@ values[0] = rs.getString("vptname"); values[1] = rs.getShort("vptstatus"); tmpTablenames.add(values); - if ((((Short) values[1]) & DataReposVersionManager.VSSTATUS_USING) != 0) { + if (((Short) values[1]) >= DataReposVersionManager.VSSTATUS_LINKVIEW) { current = i; + currentThemeTable = (String) values[0]; + currentThemeStatus = (Short) values[1]; } i++; } @@ -988,7 +891,7 @@ reader.unread(sb.toString().toCharArray()); cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader); - createTargetTableIndexAndDropTemp(connectionPG, targetTableName, targetTempName); + createTargetTableIndexAndDropTemp(connectionPG, targetTableName, targetTempName, "tid, oid, dyncolor"); logger.info("Execute Copy Count=" + count); } catch (SQLException e) { @@ -1044,7 +947,7 @@ long oid = rs.getLong(2); int ownerId = rs.getInt(3); short dirId = (short) rs.getInt(4); - String flowMark = null; + String flowMark; ConnectivityDirectionEnum dir = ConnectivityDirectionEnum.convertShort(dirId); if ((ConnectivityDirectionEnum.ForwardflowON == dir) || (ConnectivityDirectionEnum.ForwardFixflowON == dir)) { @@ -1079,7 +982,7 @@ reader.unread(sb.toString().toCharArray()); cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader); - createTargetTableIndexAndDropTemp(connectionPG, targetTableName, targetTempName); + createTargetTableIndexAndDropTemp(connectionPG, targetTableName, targetTempName, "tid, oid, fowner, flow"); logger.info("Execute Copy Count=" + count); } catch (SQLException e) { @@ -1195,15 +1098,35 @@ } } - private void createTargetTableIndexAndDropTemp(Connection connection, String tableName, String tempTable) throws SQLException { + private void createTargetTableIndexAndDropTemp(Connection connection, String tableName, String tempTable, + String fields) throws SQLException { Statement stmt = connection.createStatement(); ResultSet rs = null; try { - stmt.execute("CREATE TABLE " + tableName +" AS SELECT * FROM " + tempTable); + boolean found = false; rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"}); if (rs.next()) { - stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) + - " ADD PRIMARY KEY (tid, oid)"); + found = true; + } + JDBCUtils.close(rs); + + if (!found) { + stmt.execute("CREATE TABLE " + tableName +" AS SELECT * FROM " + tempTable); + rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"}); + if (rs.next()) { + stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) + + " ADD PRIMARY KEY (tid, oid)"); + } + } else { + stmt.execute("TRUNCATE "+ tableName + " CASCADE"); + stmt.execute("INSERT INTO " + tableName + "(" + fields + ") SELECT " + + fields + " FROM " + tempTable); + /* + --insert into xpwtheme1_fdyncolor (tid, oid, dyncolor) select tid, oid, dyncolor from xpwtheme2_fdyncolor; + --reindex table xpwtheme1_fdyncolor; + --alter table xpwtheme1_fdyncolor drop constraint xpwtheme1_fdyncolor_pkey; + --alter table xpwtheme1_fdyncolor ADD PRIMARY KEY (tid, oid); + */ } stmt.execute("DROP TABLE " + tempTable); } finally { @@ -1357,4 +1280,46 @@ if (stmt != null) stmt.close(); } } + + protected void transferThemesVersionStatus(Connection connection, + short vsstatusBefore, short vsstatusAfter, boolean exclusive) throws JobExecutionException { + + try { + String currentTargetTheme = retrieveCurrentThemeName(connection, vsstatusBefore); + if (currentTargetTheme == null) { + logger.info("Cannot found target schema in dataStore. status=" + vsstatusBefore); + return; + } + String existTargetSchema = null; + if (exclusive) + existTargetSchema = retrieveCurrentThemeName(connection, vsstatusAfter); + + + updateCurrentThemeStatus(connection, currentTargetTheme, vsstatusAfter); + if ((exclusive) && (existTargetSchema != null)) { + updateCurrentThemeStatus(connection, existTargetSchema, + DataReposVersionManager.VSSTATUS_AVAILABLE); + } + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + throw new JobExecutionException("Update " + DataReposVersionManager.XPTVERSIONTABLE_NAME + + " has error-", e); + } + } + + protected void transferThemesVersionStatus(short vsstatusBefore, short vsstatusAfter, boolean exclusive) throws JobExecutionException { + + if (targetDataStore == null) return; + Connection connection = null; + + try { + connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); + + transferThemesVersionStatus(connection, vsstatusBefore, vsstatusAfter, exclusive); + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } finally { + JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); + } + } } -- Gitblit v0.0.0-SNAPSHOT