- apply reporter for exporter. - use utf8 as exported string instead of ordinary string. - finish environment export check.
78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
|
|
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)
|