#!/usr/bin/env python3 # flags # -a append to data file (default off = truncate) # -p pad sizes within data file to next block size (default off) # parameters # stdin - input containing list of files (e.g. FX.CONF) # stdout - binary OKVS data structure # 1 - output filename for data file # 2 - input directory of files to merge into data file # 3 - (optional) output filename for log of key,offset,size import argparse import os import os.path import struct import sys kStandardFilename = 'STANDARD' kFileMode = {False: 'wb', True: 'ab'} def build(records, args): if args.append: output_file_size = os.path.getsize(args.output_file) else: output_file_size = 0 standard_offset = standard_size = 0 standard_filename = os.path.join(args.input_directory, kStandardFilename) with open(args.output_file, kFileMode[args.append]) as output_file_handle: if os.path.exists(standard_filename): standard_offset = output_file_size standard_size = os.path.getsize(standard_filename) with open(standard_filename, 'rb') as standard_handle: output_file_handle.write(standard_handle.read()) output_file_size += standard_size # yield OKVS header (2 x 2 bytes, unsigned int, little-endian) yield struct.pack('L', rec_offset)[1:] # yield record size (2 bytes, little-endian, unsigned short) yield struct.pack('