Esempio n. 1
0
def combine(database: Database, table_name, key, input_format, output_format,
            offsets, params):
    output_format["file_id"] = input_format["bin"]
    output_format["bin"] = 1
    output_format["num_bins"] = 1
    output_format["num_files"] = input_format["num_bins"]
    file_name = util.file_name(output_format)
    util.make_folder(output_format)
    [combine, last_file, keys] = util.combine_instance(table_name, key, params)
    if combine:
        msg = "Combining TIMESTAMP {0:f} NONCE {1:d} BIN {2:d} FILE {3:d}"
        msg = msg.format(input_format["timestamp"], input_format["nonce"],
                         input_format["bin"], input_format["file_id"])
        print(msg)

        format_lib = importlib.import_module("formats." +
                                             params["output_format"])
        iterator_class = getattr(format_lib, "Iterator")
        temp_name = "/tmp/{0:s}".format(file_name)
        # Make this deterministic and combine in the same order
        keys.sort()
        entries: List[Entry] = list(
            map(lambda key: database.get_entry(table_name, key), keys))
        metadata: Dict[str, str] = {}
        if database.contains(table_name, file_name):
            return True

        with open(temp_name, "wb+") as f:
            metadata = iterator_class.combine(entries, f, params)

        found = database.contains(table_name, file_name)
        if not found:
            with open(temp_name, "rb") as f:
                database.put(params["bucket"], file_name, f, metadata, True)
        os.remove(temp_name)
        return True
    else:
        return database.contains(table_name, file_name) or key != last_file