import org.eclipse.core.resources.IFile; //导入方法依赖的package包/类
public static PgDatabase buildFiles(Collection files, IProgressMonitor monitor,
List funcBodies) throws InterruptedException, IOException, CoreException {
SubMonitor mon = SubMonitor.convert(monitor, files.size());
Set schemaDirnamesLoaded = new HashSet<>();
IPath schemasPath = new Path(WORK_DIR_NAMES.SCHEMA.name());
PgDatabase db = new PgDatabase(false);
db.setArguments(new PgDiffArguments());
for (IFile file : files) {
IPath filePath = file.getProjectRelativePath();
if (!"sql".equals(file.getFileExtension()) || !isInProject(filePath)) { //$NON-NLS-1$
// skip non-sql or non-project files
// still report work
mon.worked(1);
continue;
}
if (schemasPath.isPrefixOf(filePath)) {
IPath relSchemasPath = filePath.makeRelativeTo(schemasPath);
String schemaDirname;
boolean schemaDefSql = relSchemasPath.segmentCount() == 1;
if (schemaDefSql) {
// schema definition SQL-file
schemaDirname = relSchemasPath.removeFileExtension().lastSegment();
} else {
// schema-contained object
// preload its schema so that search_path parses normally
schemaDirname = relSchemasPath.segment(0);
}
if (!schemaDirnamesLoaded.add(schemaDirname)) {
// schema already loaded, skip
if (schemaDefSql) {
// report schema pre-built if the same schema was to be built normally as well
mon.worked(1);
}
continue;
} else if (!schemaDefSql) {
// pre-load schema for object's search path
// otherwise we're dealing with the schema file itself, allow it to load normally
// don't pass progress monitor since this file isn't in the original load-set
loadFile(file.getProject().getFile(schemasPath.append(schemaDirname + ".sql")), //$NON-NLS-1$
null, db, funcBodies, null);
}
}
loadFile(file, mon, db, funcBodies, null);
}
return db;
}