// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.pgsnapshot.v0_6.impl;
import java.util.logging.Logger;
import org.openstreetmap.osmosis.core.database.DatabaseLoginCredentials;
import org.openstreetmap.osmosis.core.database.DatabasePreferences;
import org.openstreetmap.osmosis.pgsnapshot.common.DatabaseContext;
import org.openstreetmap.osmosis.pgsnapshot.common.SchemaVersionValidator;
import org.openstreetmap.osmosis.pgsnapshot.v0_6.PostgreSqlVersionConstants;
/**
* Loads a COPY fileset into a database.
*
* @author Brett Henderson
*/
public class CopyFilesetLoader implements Runnable {
private static final Logger LOG = Logger.getLogger(CopyFilesetLoader.class.getName());
private static String[] appendColumn(String[] columns, String newColumn) {
String[] result;
result = new String[columns.length + 1];
System.arraycopy(columns, 0, result, 0, columns.length);
result[columns.length] = newColumn;
return result;
}
private static final String[] COMMON_COLUMNS = {"id", "version", "user_id", "tstamp", "changeset_id", "tags"};
private static final String[] NODE_COLUMNS = appendColumn(COMMON_COLUMNS, "geom");
private static final String[] WAY_COLUMNS = appendColumn(COMMON_COLUMNS, "nodes");
private static final String[] RELATION_COLUMNS = COMMON_COLUMNS;
private DatabaseLoginCredentials loginCredentials;
private DatabasePreferences preferences;
private CopyFileset copyFileset;
/**
* Creates a new instance.
*
* @param loginCredentials
* Contains all information required to connect to the database.
* @param preferences
* Contains preferences configuring database behaviour.
* @param copyFileset
* The set of COPY files to be loaded into the database.
*/
public CopyFilesetLoader(DatabaseLoginCredentials loginCredentials, DatabasePreferences preferences,
CopyFileset copyFileset) {
this.loginCredentials = loginCredentials;
this.preferences = preferences;
this.copyFileset = copyFileset;
}
/**
* Reads all data from the database and send it to the sink.
*/
public void run() {
try (DatabaseContext dbCtx = new DatabaseContext(loginCredentials)) {
DatabaseCapabilityChecker capabilityChecker;
IndexManager indexManager;
String[] wayColumns;
dbCtx.beginTransaction();
capabilityChecker = new DatabaseCapabilityChecker(dbCtx);
new SchemaVersionValidator(dbCtx.getJdbcTemplate(), preferences)
.validateVersion(PostgreSqlVersionConstants.SCHEMA_VERSION);
wayColumns = WAY_COLUMNS;
if (capabilityChecker.isWayBboxSupported()) {
wayColumns = appendColumn(wayColumns, "bbox");
}
if (capabilityChecker.isWayLinestringSupported()) {
wayColumns = appendColumn(wayColumns, "linestring");
}
indexManager = new IndexManager(dbCtx, false, false);
// Drop all constraints and indexes.
indexManager.prepareForLoad();
LOG.finer("Loading users.");
dbCtx.loadCopyFile(copyFileset.getUserFile(), "users");
LOG.finer("Loading nodes.");
dbCtx.loadCopyFile(copyFileset.getNodeFile(), "nodes", NODE_COLUMNS);
LOG.finer("Loading ways.");
dbCtx.loadCopyFile(copyFileset.getWayFile(), "ways", wayColumns);
LOG.finer("Loading way nodes.");
dbCtx.loadCopyFile(copyFileset.getWayNodeFile(), "way_nodes");
LOG.finer("Loading relations.");
dbCtx.loadCopyFile(copyFileset.getRelationFile(), "relations", RELATION_COLUMNS);
LOG.finer("Loading relation members.");
dbCtx.loadCopyFile(copyFileset.getRelationMemberFile(), "relation_members");
LOG.finer("Committing changes.");
LOG.fine("Data load complete.");
// Add all constraints and indexes.
indexManager.completeAfterLoad();
dbCtx.commitTransaction();
LOG.fine("Clustering database.");
dbCtx.getJdbcTemplate().update("CLUSTER");
LOG.fine("Vacuuming database.");
dbCtx.getJdbcTemplate().update("VACUUM ANALYZE");
LOG.fine("Complete.");
}
}
}