Allow table name in ticks

This is what mysqldump generates for instance.
This commit is contained in:
rbock
2016-03-19 19:46:51 +01:00
parent 9bc9575723
commit 1b2020a5d2
+30 -11
View File
@@ -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)