internal void GenAllMessageDDL(string file, params string[] groups)
{
HashSet<string> expectGroups = new HashSet<string>(groups);
if (expectGroups.Count <= 0) {
expectGroups.Add(string.Empty);
}
using (StreamWriter sw = new StreamWriter(file, true)) {
sw.WriteLine("#----------------------------------------------------------------------------");
sw.WriteLine("#!!!不要手动修改此文件,此文件由LogicDataGenerator按{0}生成!!!", m_DslFile);
sw.WriteLine("#----------------------------------------------------------------------------");
foreach (string line in m_Explanation) {
sw.WriteLine("#{0}", line);
}
sw.WriteLine();
sw.WriteLine("call SetDSNodeVersion('{0}');", m_Version);
sw.WriteLine();
foreach (var messagePair in m_Messages) {
string message = messagePair.Key;
MessageDef messageDef = messagePair.Value;
if (!messageDef.m_DontGenDB && expectGroups.Contains(messageDef.m_GroupName)) {
string primaryKeyClause = string.Join(",", messageDef.m_PrimaryKeys.ToArray());
sw.WriteLine("create table {0}", messageDef.m_TypeName);
sw.WriteLine("(");
sw.WriteLine("\tAutoKey int not null auto_increment,");
sw.WriteLine("\tIsValid boolean not null,");
sw.WriteLine("\tDataVersion int not null,");
foreach (MemberDef memberDef in messageDef.m_Members) {
string sqlType = GetSqlType(memberDef.m_TypeName);
if (0 == sqlType.CompareTo("varchar")) {
int size;
if (memberDef.m_MaxSize > 0) {
size = memberDef.m_MaxSize;
} else {
size = m_DefVarcharSize;
}
if (memberDef.m_IsPrimaryKey || memberDef.m_IsForeignKey) {
sw.WriteLine("\t{0} varchar({1}) binary not null,", memberDef.m_MemberName, size);
} else {
sw.WriteLine("\t{0} varchar({1}) not null,", memberDef.m_MemberName, size);
}
} else {
sw.WriteLine("\t{0} {1} not null,", memberDef.m_MemberName, sqlType);
}
}
sw.WriteLine("\tprimary key (AutoKey)");
sw.WriteLine(") ENGINE=InnoDB;");
sw.WriteLine("create unique index {0}PrimaryIndex on {1} ({2});", messageDef.m_TypeName, messageDef.m_TypeName, primaryKeyClause);
if (messageDef.m_ForeignKeys.Count > 0) {
sw.WriteLine("create index {0}Index on {1} ({2});", messageDef.m_TypeName, messageDef.m_TypeName, string.Join(",", messageDef.m_ForeignKeys.ToArray()));
}
sw.WriteLine();
}
}
sw.WriteLine();
sw.WriteLine("#----------------------------------------------------------------------------------------------------------------------");
sw.WriteLine();
foreach (var messagePair in m_Messages) {
string message = messagePair.Key;
MessageDef messageDef = messagePair.Value;
if (!messageDef.m_DontGenDB && expectGroups.Contains(messageDef.m_GroupName)) {
string primaryKeyClause = string.Join(",", messageDef.m_PrimaryKeys.ToArray());
sw.WriteLine("drop procedure if exists Save{0};", messageDef.m_TypeName);
sw.WriteLine("delimiter $$");
sw.WriteLine("create procedure Save{0}(", messageDef.m_TypeName);
sw.WriteLine("\tin _IsValid boolean");
sw.WriteLine("\t,in _DataVersion int");
foreach (MemberDef memberDef in messageDef.m_Members) {
string sqlType = GetSqlType(memberDef.m_TypeName);
if (0 == sqlType.CompareTo("varchar")) {
int size;
if (memberDef.m_MaxSize > 0) {
size = memberDef.m_MaxSize;
} else {
size = m_DefVarcharSize;
}
if (memberDef.m_IsPrimaryKey || memberDef.m_IsForeignKey) {
sw.WriteLine("\t,in _{0} varchar({1})", memberDef.m_MemberName, size);
} else {
sw.WriteLine("\t,in _{0} varchar({1})", memberDef.m_MemberName, size);
}
} else {
sw.WriteLine("\t,in _{0} {1}", memberDef.m_MemberName, sqlType);
}
}
sw.WriteLine(")");
sw.WriteLine("begin");
sw.WriteLine("\tinsert into {0} (AutoKey,IsValid,DataVersion,{1})", messageDef.m_TypeName, string.Join(",", messageDef.m_ColumnNames.ToArray()));
sw.WriteLine("\t\tvalues ");
sw.WriteLine("\t\t\t(null,_IsValid,_DataVersion");
foreach (string name in messageDef.m_ColumnNames) {
sw.WriteLine("\t\t\t,_{0}", name);
}
sw.WriteLine("\t\t\t)");
sw.WriteLine("\t\ton duplicate key update ");
sw.WriteLine("\t\t\tIsValid = if(DataVersion < _DataVersion, _IsValid, IsValid),");
foreach (string name in messageDef.m_ColumnNames) {
sw.WriteLine("\t\t\t{0} = if(DataVersion < _DataVersion, _{1}, {2}),", name, name, name);
}
sw.WriteLine("\t\t\tDataVersion = if(DataVersion < _DataVersion, _DataVersion, DataVersion);");
sw.WriteLine("end $$");
sw.WriteLine("delimiter ;");
sw.WriteLine();
}
}
sw.WriteLine();
sw.WriteLine("#----------------------------------------------------------------------------------------------------------------------");
sw.WriteLine();
foreach (var messagePair in m_Messages) {
string message = messagePair.Key;
MessageDef messageDef = messagePair.Value;
if (!messageDef.m_DontGenDB && expectGroups.Contains(messageDef.m_GroupName)) {
sw.WriteLine("drop procedure if exists LoadAll{0};", messageDef.m_TypeName);
sw.WriteLine("delimiter $$");
sw.WriteLine("create procedure LoadAll{0}(in _Start int, in _Count int)", messageDef.m_TypeName);
sw.WriteLine("begin");
sw.WriteLine("\tselect * from {0} where IsValid = 1 limit _Start, _Count;", messageDef.m_TypeName);
sw.WriteLine("end $$");
sw.WriteLine("delimiter ;");
sw.WriteLine();
if (messageDef.m_PrimaryKeys.Count > 0) {
sw.WriteLine("drop procedure if exists LoadSingle{0};", messageDef.m_TypeName);
sw.WriteLine("delimiter $$");
sw.WriteLine("create procedure LoadSingle{0}(", messageDef.m_TypeName);
string prefix = string.Empty;
foreach (MemberDef memberDef in messageDef.m_Members) {
if (memberDef.m_IsPrimaryKey) {
string sqlType = GetSqlType(memberDef.m_TypeName);
if (0 == sqlType.CompareTo("varchar")) {
int size;
if (memberDef.m_MaxSize > 0) {
size = memberDef.m_MaxSize;
} else {
size = m_DefVarcharSize;
}
if (memberDef.m_IsPrimaryKey || memberDef.m_IsForeignKey) {
sw.WriteLine("\t{0}in _{1} varchar({2})", prefix, memberDef.m_MemberName, size);
} else {
sw.WriteLine("\t{0}in _{1} varchar({2})", prefix, memberDef.m_MemberName, size);
}
} else {
sw.WriteLine("\t{0}in _{1} {2}", prefix, memberDef.m_MemberName, sqlType);
}
prefix = ",";
}
}
sw.WriteLine(")");
sw.WriteLine("begin");
sw.WriteLine("\tselect * from {0} where IsValid = 1 ", messageDef.m_TypeName);
foreach (string name in messageDef.m_PrimaryKeys) {
sw.WriteLine("\t\tand {0} = _{1} ", name, name);
}
sw.WriteLine("\t\t;");
sw.WriteLine("end $$");
sw.WriteLine("delimiter ;");
sw.WriteLine();
}
if (messageDef.m_ForeignKeys.Count > 0) {
sw.WriteLine("drop procedure if exists LoadMulti{0};", messageDef.m_TypeName);
sw.WriteLine("delimiter $$");
sw.WriteLine("create procedure LoadMulti{0}(", messageDef.m_TypeName);
string prefix = string.Empty;
foreach (MemberDef memberDef in messageDef.m_Members) {
if (memberDef.m_IsForeignKey) {
string sqlType = GetSqlType(memberDef.m_TypeName);
if (0 == sqlType.CompareTo("varchar")) {
int size;
if (memberDef.m_MaxSize > 0) {
size = memberDef.m_MaxSize;
} else {
size = m_DefVarcharSize;
}
if (memberDef.m_IsPrimaryKey || memberDef.m_IsForeignKey) {
sw.WriteLine("\t{0}in _{1} varchar({2})", prefix, memberDef.m_MemberName, size);
} else {
sw.WriteLine("\t{0}in _{1} varchar({2})", prefix, memberDef.m_MemberName, size);
}
} else {
sw.WriteLine("\t{0}in _{1} {2}", prefix, memberDef.m_MemberName, sqlType);
}
prefix = ",";
}
}
sw.WriteLine(")");
sw.WriteLine("begin");
sw.WriteLine("\tselect * from {0} where IsValid = 1 ", messageDef.m_TypeName);
foreach (string name in messageDef.m_ForeignKeys) {
sw.WriteLine("\t\tand {0} = _{1} ", name, name);
}
sw.WriteLine("\t\t;");
sw.WriteLine("end $$");
sw.WriteLine("delimiter ;");
sw.WriteLine();
}
}
}
sw.Close();
}
}