Package edu.brown.catalog

Source Code of edu.brown.catalog.PatchCatalog

package edu.brown.catalog;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.voltdb.catalog.CatalogMap;
import org.voltdb.catalog.CatalogProxy;
import org.voltdb.catalog.PlanFragment;
import org.voltdb.catalog.Procedure;
import org.voltdb.catalog.Statement;

import edu.brown.utils.ArgumentsParser;
import edu.brown.utils.FileUtil;

public abstract class PatchCatalog {
    /** java.util.logging logger. */
    private static final Logger LOG = Logger.getLogger(FixCatalog.class.getName());

    /**
     * @param args
     */
    public static void main(String[] vargs) throws Exception {
        ArgumentsParser args = ArgumentsParser.load(vargs);
        assert (args.hasParam(ArgumentsParser.PARAM_CATALOG_OUTPUT));
        String output_path = args.getParam(ArgumentsParser.PARAM_CATALOG_OUTPUT);

        Procedure source_proc = args.catalog_db.getProcedures().get("neworderMultiSite");
        assert (source_proc != null);
        Procedure target_proc = args.catalog_db.getProcedures().get("neworder");
        assert (target_proc != null);

        Map<String, String> fix = new HashMap<String, String>();
        List<String> to_remove = new ArrayList<String>();

        for (Statement target_stmt : target_proc.getStatements()) {
            int idx = target_stmt.getName().indexOf("MultiSite");
            if (idx == -1)
                continue;
            String base_name = target_stmt.getName().substring(0, idx);
            Statement source_stmt = source_proc.getStatements().get(base_name);
            assert (target_stmt != null);

            // Copy fields
            for (String field : source_stmt.getFields()) {
                Object value = source_stmt.getField(field);
                if (!(value instanceof CatalogMap)) {
                    CatalogProxy.set(target_stmt, field, value);
                }
            } // FOR

            // Lines we need to remove
            String orig_catalog_id = null;
            String new_catalog_id = null;
            for (PlanFragment target_frag : target_stmt.getFragments()) {
                assert (orig_catalog_id == null);
                orig_catalog_id = target_frag.getName();
            } // FOR

            // Copy PlanFragments
            for (PlanFragment source_frag : source_stmt.getFragments()) {
                PlanFragment target_frag = target_stmt.getFragments().add(source_frag.getName());

                // Copy fields
                for (String field : source_frag.getFields()) {
                    Object value = source_frag.getField(field);
                    if (!(value instanceof CatalogMap)) {
                        CatalogProxy.set(target_frag, field, value);
                    }
                } // FOR

                if (new_catalog_id == null) {
                    new_catalog_id = target_frag.getName();
                    to_remove.add(target_frag.getName());
                    StringBuilder buffer = new StringBuilder();
                    CatalogProxy.writeCommands(target_frag, buffer);
                    fix.put(orig_catalog_id, buffer.toString().replaceAll(source_proc.getName(), target_proc.getName()));
                }
            } // FOR
        } // FOR

        // LOG.info("LINES TO REMOVE: " + to_remove);
        // LOG.info("IDS TO FIX: " + fix);
        String serialized = args.catalog.serialize();
        StringBuilder buffer = new StringBuilder();
        for (String line : serialized.split("\n")) {
            // Remove
            boolean include = true;
            for (String remove : to_remove) {
                if (line.indexOf(remove) != -1 && line.indexOf(source_proc.getName()) == -1) {
                    include = false;
                    break;
                }
            } // FOR
            if (!include)
                continue;

            // Fix
            String fixed = null;
            for (String orig_catalog_id : fix.keySet()) {
                if (line.indexOf(orig_catalog_id) != -1) {
                    line = fix.get(orig_catalog_id);
                    fixed = orig_catalog_id;
                    break;
                }
            } // FOR
            buffer.append(line);

            if (fixed != null) {
                fix.remove(fixed);
                to_remove.add(fixed);
            } else {
                buffer.append("\n");
            }
        } // FOR

        FileUtil.writeStringToFile(new File(output_path), buffer.toString());
        LOG.info("Wrote updated catalog specification to '" + output_path + "'");

        return;
    }

}
TOP

Related Classes of edu.brown.catalog.PatchCatalog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.