#!/usr/bin/env python3 from mako.template import Template import sys class Sqlite3Rewriter(object): def rewrite(self, query): return query rewriters = { "sqlite3": Sqlite3Rewriter(), } template = Template("""#ifndef LIGHTNINGD_WALLET_GEN_DB_${f.upper()} #define LIGHTNINGD_WALLET_GEN_DB_${f.upper()} #include #include #if HAVE_${f.upper()} struct db_query db_${f}_queries[] = { % for elem in queries: { .name = "${elem['name']}", .query = "${elem['query']}", .placeholders = ${elem['placeholders']}, .readonly = ${elem['readonly']}, }, % endfor }; #define DB_${f.upper()}_QUERY_COUNT ${len(queries)} #endif /* HAVE_${f.upper()} */ #endif /* LIGHTNINGD_WALLET_GEN_DB_${f.upper()} */ """) def extract_queries(pofile): # Given a po-file, extract all queries and their associated names, and # return them as a list. def chunk(pofile): # Chunk a given file into chunks separated by an empty line with open(pofile, 'r') as f: chunk = [] for line in f: line = line.strip() if line.strip() == "": yield chunk chunk = [] else: chunk.append(line.strip()) if chunk != []: yield chunk queries = [] for c in chunk(pofile): name = c[0][3:] # Skip other comments i = 1 while c[i][0] == '#': i += 1 # Strip header and surrounding quotes query = c[i][7:][:-1] queries.append({ 'name': name, 'query': query, 'placeholders': query.count('?'), 'readonly': "true" if query.upper().startswith("SELECT") else "false", }) return queries if __name__ == "__main__": if len(sys.argv) != 3: print("Usage:\n\t{} ".format(sys.argv[0])) sys.exit(1) dialect = sys.argv[2] if dialect not in rewriters: print("Unknown dialect {}. The following are available: {}".format( dialect, ", ".join(rewriters.keys()) )) sys.exit(1) rewriter = rewriters[dialect] queries = extract_queries(sys.argv[1]) queries = rewriter.rewrite(queries) print(template.render(f=dialect, queries=queries))