/// <summary> /// 指定ファイルからテーブル定義を読み取る /// </summary> public void Load(string xmlfile_) { xmlfile = xmlfile_; columns = new DBColumnDef[0]; try { using (XmlFile xml = new XmlFile(xmlfile, "table")) { XmlElement root = xml.Root; name = root.GetAttribute("name"); expr = root.GetAttribute("expr"); note = XmlFile.GetText(root, false).Trim(); owner = root.GetAttribute("owner"); orgName = root.GetAttribute("orgname"); foreach (XmlElement el in xml.GetElements(root, "column")) { DBColumnDef coldef = new DBColumnDef(el); coldef.ByteSize = StringUtil.ToInt(el.GetAttribute("bytesize"), 0); coldef.OrgName = el.GetAttribute("orgname"); AddColumn(coldef); } foreach (XmlElement el in xml.GetElements(root, "index")) { AddIndex(new DBIndexDef(xml, el)); } xml.Close(); } } catch (XmlException e) { throw new XmlException(String.Format("XMLファイル({0})の読み取りに失敗しました: {1}", xmlfile, e.Message)); } }
private static string paramString(DBColumnDef col) { switch (col.Type) { case "NUMBER": case "BOOLEAN": return(NumberParamWord); default: return("'" + StringParamWord + "'"); } }
/// <summary> /// 簡易設定 /// </summary> /// <remarks> /// <para> /// 指定したカラム定義に沿って標題と条件式を自動生成する /// </para> /// </remarks> public void Setup(DBColumnDef col) { DBCondition.Code code; int width; switch (col.Type) { case "NUMBER": code = DBCondition.Code.Between; width = col.Length; break; case "BOOLEAN": code = DBCondition.Code.Equals; width = col.Length; break; case "DATETIME": code = DBCondition.Code.Between; width = 19; break; case "DATE": code = DBCondition.Code.Between; width = 10; break; case "TIME": code = DBCondition.Code.Between; width = 8; break; case "VARCHAR": if (col.Length >= 20) { code = DBCondition.Code.Contains; } else { code = DBCondition.Code.Equals; } width = col.Length; break; default: code = DBCondition.Code.Equals; width = col.Length; break; } Setup(col, code); SetParamLength((width > 24)?24:width); }
/// <summary> /// カラム追加 /// </summary> public void AddColumn(DBColumnDef col) { if (columns == null) { columns = new DBColumnDef[1]; columns[0] = col; return; } DBColumnDef[] newcolumns = new DBColumnDef[columns.Length + 1]; for (int i = 0; i < columns.Length; i++) { newcolumns[i] = columns[i]; } newcolumns[newcolumns.Length - 1] = col; columns = newcolumns; }
/// <summary> /// コンバートする /// </summary> public int Convert(string a5erfile, string outdir) { if (!Directory.Exists(outdir)) { Directory.CreateDirectory(outdir); } int count = 0; using (StreamReader sr = FileUtil.Reader(a5erfile, Encoding.UTF8)) { if (sr == null) { throw new IOException("Can't open " + a5erfile + " for reading"); } Regex pat_type = new Regex(@"^[\*@]?(\w+)(\(([0-9,]+)\))?$"); DBTableDef tabledef = null; string line; while ((line = sr.ReadLine()) != null) { line = line.Trim(); if (line.StartsWith("[") && line.EndsWith("]")) { if ((tabledef != null) && (tabledef.Columns != null)) { tabledef.SaveAs(Path.Combine(outdir, tabledef.XmlFileName)); count++; } tabledef = null; } if (line == "[Entity]") { tabledef = new DBTableDef(); continue; } if (tabledef == null) { continue; } string[] kv = line.Split("=".ToCharArray(), 2); if (kv.Length < 2) { continue; } switch (kv[0]) { case "PName": tabledef.Id = kv[1]; tabledef.Name = kv[1]; break; case "LName": tabledef.Expr = kv[1]; break; case "Comment": tabledef.Note = kv[1].Replace(@"\n", "\n"); break; case "Field": { string[] x = StringUtil.SplitCSV(kv[1]); if (x.Length < 7) { throw new Exception("Invalid Field declaration."); } Match mo = pat_type.Match(x[2]); if (!mo.Success) { throw new Exception("Invalid type declaration"); } string type = mo.Groups[1].Value; int length = 0; int fractional = 0; if (mo.Groups[2].Success) { string[] xx = mo.Groups[3].Value.Split(",".ToCharArray()); if (xx.Length < 2) { length = StringUtil.ToInt(xx[0]); fractional = 0; } else { length = StringUtil.ToInt(xx[0]); fractional = StringUtil.ToInt(xx[1]); } } DBColumnDef coldef = new DBColumnDef(x[1], // Name type, length, fractional, x[3] == "", // Nullable x[4] != "", // PK x[5]); coldef.Expr = x[0]; coldef.Note = x[6].Replace(@"\n", "\n"); tabledef.AddColumn(coldef); } break; case "Index": { kv = kv[1].Split("=".ToCharArray(), 2); if (kv.Length < 2) { throw new Exception("Invalid Index declaration."); } string[] x = StringUtil.SplitCSV(kv[1]); if (x.Length < 2) { throw new Exception("Invalid Index declaration.."); } string[] columns = new string[x.Length - 1]; for (int i = 0; i < x.Length - 1; i++) { columns[i] = x[i + 1]; } DBIndexDef inddef = new DBIndexDef(columns, x[0] == "1"); tabledef.AddIndex(inddef); } break; } } if ((tabledef != null) && (tabledef.Columns != null)) { tabledef.SaveAs(Path.Combine(outdir, tabledef.XmlFileName)); count++; } sr.Close(); } return(count); }
/// <summary> /// 簡易設定(条件コードを指定するバージョン) /// </summary> /// <remarks> /// <para> /// 指定したカラム定義に沿って標題と条件式を自動生成する /// </para> /// </remarks> public void Setup(DBColumnDef col, Code code) { title = col.Name + "が" + CodeName(code); expr = col.Name + " "; switch (code) { case Code.Equals: expr += "= " + paramString(col); break; case Code.NotEquals: expr += "<> " + paramString(col); break; case Code.Contains: expr += "LIKE '%" + StringParamWord + "%'"; break; case Code.NotContains: expr += "NOT LIKE '%" + StringParamWord + "%'"; break; case Code.StartsWith: expr += "LIKE '" + StringParamWord + "%'"; break; case Code.EndsWith: expr += "LIKE '%" + StringParamWord + "'"; break; case Code.GreaterOrEqual: expr += ">= " + paramString(col); break; case Code.GreaterThan: expr += "> " + paramString(col); break; case Code.LessOrEqual: expr += "<= " + paramString(col); break; case Code.LessThan: expr += "< " + paramString(col); break; case Code.Between: expr += "BETWEEN " + paramString(col) + " AND " + paramString(col); break; case Code.NotBetween: expr += "NOT BETWEEN " + paramString(col) + " AND " + paramString(col); break; case Code.In: expr += "IN (" + paramString(col) + "," + paramString(col) + "," + paramString(col) + "," + paramString(col) + ")"; break; case Code.NotIn: expr += "NOT IN (" + paramString(col) + "," + paramString(col) + "," + paramString(col) + "," + paramString(col) + ")"; break; case Code.CollateEquals: expr += "= " + paramString(col) + " COLLATE utf8_unicode_ci"; break; case Code.NotCollateEquals: expr += "<> " + paramString(col) + " COLLATE utf8_unicode_ci"; break; case Code.CollateContains: expr += "LIKE '%" + StringParamWord + "%' COLLATE utf8_unicode_ci"; break; case Code.NotCollateContains: expr += "NOT LIKE '%" + StringParamWord + "%' COLLATE utf8_unicode_ci"; break; case Code.CollateStartsWith: expr += "LIKE '" + StringParamWord + "%' COLLATE utf8_unicode_ci"; break; case Code.CollateEndsWith: expr += "LIKE '%" + StringParamWord + "' COLLATE utf8_unicode_ci"; break; default: expr += "IS NOT NULL"; // 適当 break; } setExpr(expr); int len = col.Length + 1; if (len < 3) { len = 3; } if (len > 40) { len = 40; } SetParamLength(len); }
/// <summary> /// 簡易設定コンストラクタ /// </summary> public DBCondition(DBColumnDef col, Code code) { Setup(col, code); }
/// <summary> /// 簡易設定コンストラクタ /// </summary> public DBCondition(DBColumnDef col) { Setup(col); }