Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
embed_schemas.py
1 #!/usr/bin/env python3
2 
3 import io
4 import sys
5 import os
6 
7 heading_text = '''
8 // This is file was autogenerated, do not modify it manually
9 #include <string>
10 #include <vector>
11 #include <map>
12 '''
13 
14 
15 def escape_string(sql):
16  return sql.translate(str.maketrans({'"': r'\"', '\n': '\\n'}))
17 
18 
19 def apend_migration(migration_path, header_file):
20  migration_file = open(migration_path, 'r')
21  header_file.write("\"")
22  migration_content = migration_file.read()
23  header_file.write(escape_string(migration_content))
24 
25 
26 if __name__ == '__main__':
27  if len(sys.argv) != 4:
28  print("\nIncorrect arguments")
29  print("Usage:\n {} {} {} {}\n".format(sys.argv[0], "folder_with_schemas",
30  "generated_file_path", "name_prefix"))
31  sys.exit(-1)
32 
33  sql_folder = sys.argv[1]
34  schemas_header = sys.argv[2]
35  prefix = sys.argv[3]
36  migration_folder = os.path.join(sql_folder, 'migration')
37  rollback_folder = os.path.join(sql_folder, 'rollback')
38  migration_list = sorted(os.listdir(migration_folder))
39  rollback_migrations_list = sorted(os.listdir(rollback_folder))
40 
41  with io.BytesIO() as outf:
42  out_text = io.TextIOWrapper(outf, write_through=True)
43  out_text.write(heading_text)
44  out_text.write("extern const std::vector<std::string> {}_schema_migrations = {{".format(prefix))
45  for migration in migration_list[:-1]:
46  apend_migration(os.path.join(migration_folder, migration), out_text)
47  out_text.write("\",\n")
48  apend_migration(os.path.join(migration_folder, migration_list[-1]), out_text)
49  out_text.write("\"\n};\n")
50 
51  out_text.write("extern const std::vector<std::string> {}_schema_rollback_migrations = {{".format(prefix))
52  if len(rollback_migrations_list) > 0:
53  ver = int(rollback_migrations_list[0].split(".")[1])
54  for i in range(ver):
55  out_text.write("\"\",\n")
56  for migration in rollback_migrations_list[:-1]:
57  apend_migration(os.path.join(rollback_folder, migration), out_text)
58  out_text.write("\",\n")
59  version = int(rollback_migrations_list[-1].split(".")[1])
60  apend_migration(os.path.join(rollback_folder, rollback_migrations_list[-1]), out_text)
61  out_text.write("\"")
62  out_text.write("\n};\n")
63 
64  current_schema = open(os.path.join(sql_folder, "schema.sql"), 'r').read()
65  current_schema_escaped = escape_string(current_schema)
66  out_text.write('extern const std::string %s_current_schema = "%s";' % (prefix, current_schema_escaped));
67  out_text.write('extern const int %s_current_schema_version = %u;' % (prefix ,(len(migration_list)-1)));
68 
69  # compare with current and only overwrite if it was changed
70  new_content = outf.getvalue()
71  try:
72  with open(schemas_header, 'r') as hf:
73  current_content = hf.read().encode()
74  except Exception:
75  current_content = b''
76  if new_content != current_content:
77  with open(schemas_header, 'wb') as hf:
78  hf.write(new_content)