Files
SuperScriptMaterializer/script/sqlite_helper.py

78 lines
2.8 KiB
Python
Raw Normal View History

class DeclPair():
m_DeclType: str
m_DeclName: str
def __init__(self, decl_type: str, decl_name: str):
self.m_DeclType = decl_type
self.m_DeclName = decl_name
def is_string(self):
return self.m_DeclType == 'YYCC::yycc_u8string'
def is_int64(self):
return self.m_DeclType == 'int64_t'
def accept_input() -> tuple[DeclPair, ...]:
cache: list[DeclPair] = list()
blank_line: bool = False
while True:
recv: str = input("> ")
if len(recv) == 0:
# If double blank line, exit
# Otherwise set blank line flag
if blank_line: break
else: blank_line = True
else:
# Reset blank line flag
blank_line = False
# Analyze input
recv = recv.strip('\t\r\n ')
# Skip annotation
if recv.startswith('//'): continue
# Skip invalid decl
if not recv.endswith(';'): continue
recv = recv[:-1]
recv_parts = recv.split(' ')
if len(recv_parts) != 2: continue
# Okey, insert it
cache.append(DeclPair(recv_parts[0], recv_parts[1]))
return tuple(cache)
def generate_result(decls: tuple[DeclPair, ...]) -> tuple[str, str, str]:
# generate sql statement
def conv_sql(decl_pair: DeclPair) -> str:
if decl_pair.is_string(): return f'[{decl_pair.m_DeclName}] TEXT'
else: return f'[{decl_pair.m_DeclName}] INTEGER'
table_string: str = ', '.join(map(conv_sql, decls))
gen_sql_create_statement: str = f'CREATE TABLE [] ({table_string});'
# generate sql insert_statement
table_string = ', '.join(map(lambda _: '?', decls))
gen_sql_insert_statement: str = f'INSERT INTO [] VALUES ({table_string});'
# generate binding c++ statement
def conv_cpp(decl_pair: DeclPair) -> str:
if decl_pair.is_string():
return f'WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.{decl_pair.m_DeclName}), -1, SQLITE_TRANSIENT));'
elif decl_pair.is_int64():
return f'WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.{decl_pair.m_DeclName}));'
else:
return f'WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.{decl_pair.m_DeclName}));'
gen_bind_statement: str = '\n'.join(map(conv_cpp, decls))
return (gen_sql_create_statement, gen_sql_insert_statement, gen_bind_statement)
if __name__ == '__main__':
while True:
decls: tuple[DeclPair, ...] = accept_input()
(sql_create, sql_insert, cpp) = generate_result(decls)
print('SQL Create Table Statement:')
print(sql_create)
print('SQL Insert Statement:')
print(sql_insert)
print('C++ Bind Value Statements:')
print(cpp)