mirror of
https://github.com/rbock/sqlpp11.git
synced 2026-04-28 23:19:27 -05:00
Allow table name in ticks
This is what mysqldump generates for instance.
This commit is contained in:
+30
-11
@@ -34,6 +34,27 @@ import pprint
|
||||
from pyparsing import CaselessLiteral, Literal, SkipTo, restOfLine, oneOf, ZeroOrMore, Optional, Combine, Suppress, \
|
||||
WordStart, WordEnd, Word, alphas, alphanums, nums, QuotedString, nestedExpr, MatchFirst, OneOrMore, delimitedList, Or, Group
|
||||
|
||||
def usage():
|
||||
print('Usage: ddl2cpp [-no-timestamp-warning] <path to ddl> <path to target (without extension, e.g. /tmp/MyTable)> <namespace>')
|
||||
|
||||
if len(sys.argv) not in (4,5):
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
firstPositional = 1
|
||||
timestampWarning = True
|
||||
if len(sys.argv) == 5:
|
||||
if sys.argv[1] == '-no-timestamp-warning':
|
||||
firstPositional += 1
|
||||
timestampWarning = False
|
||||
else:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
pathToDdl = sys.argv[firstPositional]
|
||||
pathToHeader = sys.argv[firstPositional + 1] + '.h'
|
||||
namespace = sys.argv[firstPositional + 2]
|
||||
|
||||
INCLUDE = 'sqlpp11'
|
||||
NAMESPACE = 'sqlpp'
|
||||
|
||||
@@ -63,6 +84,7 @@ ddlString = Or([QuotedString("'"), QuotedString("\"", escQuote='""'), QuotedSt
|
||||
negativeSign = Literal('-')
|
||||
ddlNum = Combine(Optional(negativeSign) + Word(nums + "."))
|
||||
ddlTerm = Word(alphas, alphanums + "_$")
|
||||
ddlName = Or([ddlTerm, ddlString])
|
||||
ddlArguments = "(" + delimitedList(Or([ddlString, ddlTerm, ddlNum])) + ")"
|
||||
ddlNotNull = Group(ddlWord("NOT") + ddlWord("NULL")).setResultsName("notNull")
|
||||
ddlDefaultValue = ddlWord("DEFAULT").setResultsName("hasDefaultValue");
|
||||
@@ -77,7 +99,7 @@ ddlConstraint = Or([
|
||||
ddlWord("UNIQUE"),
|
||||
])
|
||||
ddlColumn = Group(Optional(ddlConstraint).setResultsName("isConstraint") + OneOrMore(MatchFirst([ddlNotNull, ddlAutoValue, ddlDefaultValue, ddlTerm, ddlNum, ddlColumnComment, ddlString, ddlArguments])))
|
||||
createTable = Group(ddlWord("CREATE") + ddlWord("TABLE") + ddlTerm.setResultsName("tableName") + "(" + Group(delimitedList(ddlColumn)).setResultsName("columns") + ")").setResultsName("create")
|
||||
createTable = Group(ddlWord("CREATE") + ddlWord("TABLE") + ddlName.setResultsName("tableName") + "(" + Group(delimitedList(ddlColumn)).setResultsName("columns") + ")").setResultsName("create")
|
||||
|
||||
|
||||
ddl = ZeroOrMore(Suppress(SkipTo(createTable, False)) + createTable)
|
||||
@@ -105,19 +127,14 @@ types = {
|
||||
'float': 'floating_point',
|
||||
'date' : 'day_point',
|
||||
'datetime' : 'time_point',
|
||||
'timestamp' : 'time_point',
|
||||
}
|
||||
|
||||
|
||||
# PROCESS DDL
|
||||
if (len(sys.argv) != 4):
|
||||
print('Usage: ddl2cpp <path to ddl> <path to target (without extension, e.g. /tmp/MyTable)> <namespace>')
|
||||
sys.exit(1)
|
||||
tableCreations = ddl.parseFile(pathToDdl)
|
||||
|
||||
pathToDdl = sys.argv[1]
|
||||
pathToHeader = sys.argv[2] + '.h'
|
||||
namespace = sys.argv[3]
|
||||
ddlFile = open(pathToDdl, 'r')
|
||||
header = open(pathToHeader, 'w')
|
||||
|
||||
print('// generated by ' + ' '.join(sys.argv), file=header)
|
||||
print('#ifndef '+get_include_guard_name(namespace, pathToHeader), file=header)
|
||||
print('#define '+get_include_guard_name(namespace, pathToHeader), file=header)
|
||||
@@ -129,8 +146,6 @@ print('', file=header)
|
||||
print('namespace ' + namespace, file=header)
|
||||
print('{', file=header)
|
||||
|
||||
tableCreations = ddl.parseFile(pathToDdl)
|
||||
|
||||
for create in tableCreations:
|
||||
sqlTableName = create.tableName
|
||||
tableClass = toClassName(sqlTableName)
|
||||
@@ -147,6 +162,10 @@ for create in tableCreations:
|
||||
tableTemplateParameters += ',\n ' + tableNamespace + '::' + columnClass
|
||||
columnMember = toMemberName(sqlColumnName)
|
||||
sqlColumnType = column[1].lower()
|
||||
if sqlColumnType == 'timestamp' and timestampWarning:
|
||||
print("Warning: timestamp is mapped to sqlpp::time_point like datetime")
|
||||
print("Warning: You have to take care of timezones yourself")
|
||||
print("You can disable this warning using -no-timestamp-warning")
|
||||
columnCanBeNull = not column.notNull
|
||||
print(' struct ' + columnClass, file=header)
|
||||
print(' {', file=header)
|
||||
|
||||
Reference in New Issue
Block a user