/// <summary> /// Adds a single new entry to the dictionary. /// </summary> public void NewEntry(CedictEntry entry, string note) { tr = conn.BeginTransaction(); string head, trg; entry.GetCedict(out head, out trg); // Check restrictions - can end up dropped entry checkRestrictions(entry.ChSimpl, trg); // Check for duplicate if (SqlDict.DoesHeadExist(head)) { throw new Exception("Headword already exists: " + head); } // Serialize, store in DB, index int binId = indexEntry(entry); // Populate entries table int entryId = storeEntry(entry.ChSimpl, head, trg, binId); // Record change cmdInsModifNew.Parameters["@timestamp"].Value = DateTime.UtcNow; cmdInsModifNew.Parameters["@user_id"].Value = userId; cmdInsModifNew.Parameters["@note"].Value = note; cmdInsModifNew.Parameters["@entry_id"].Value = entryId; cmdInsModifNew.ExecuteNonQuery(); int modifId = (int)cmdInsModifNew.LastInsertedId; // Also link from entry cmdUpdLastModif.Parameters["@entry_id"].Value = entryId; cmdUpdLastModif.Parameters["@last_modif_id"].Value = modifId; cmdUpdLastModif.ExecuteNonQuery(); // Commit. Otherwise, dispose will roll all this back if it finds non-null transaction. tr.Commit(); tr.Dispose(); tr = null; }
public override void Process() { string simp = Req.Params["simp"]; if (simp == null) { throw new ApiException(400, "Missing 'simp' parameter."); } string trad = Req.Params["trad"]; if (trad == null) { throw new ApiException(400, "Missing 'trad' parameter."); } string pinyin = Req.Params["pinyin"]; if (pinyin == null) { throw new ApiException(400, "Missing 'pinyin' parameter."); } string trg = Req.Params["trg"]; if (trg == null) { throw new ApiException(400, "Missing 'trg' parameter."); } string note = Req.Params["note"]; if (note == null) { throw new ApiException(400, "Missing 'note' parameter."); } Result res = new Result { Success = true }; SqlDict.SimpleBuilder builder = null; try { builder = new SqlDict.SimpleBuilder(0); CedictEntry entry = SqlDict.BuildEntry(simp, trad, pinyin, trg); builder.NewEntry(entry, note); } catch (Exception ex) { DiagLogger.LogError(ex); res.Success = false; } finally { if (builder != null) { builder.Dispose(); } } // Tell our caller Res = res; }
private bool hasHanzi(string query) { foreach (char c in query) { if (SqlDict.IsHanzi(c)) { return(true); } } return(false); }
/// <summary> /// Import new entries from file as a single bulk change. /// </summary> public void BulkAdd(string dictPath, string workingFolder) { CedictParser parser = new CedictParser(); Startup.InitDB(config, null, false); SqlDict dict = new SqlDict(null, mut); int lineNum = 0; DateTime dt = DateTime.Now; string fnLog = "importlog-" + dt.Year + "-" + dt.Month.ToString("00") + "-" + dt.Day.ToString("00") + "!" + dt.Hour.ToString("00") + "-" + dt.Minute.ToString("00") + "-" + dt.Second.ToString("00") + ".txt"; fnLog = Path.Combine(workingFolder, fnLog); using (FileStream fs = new FileStream(dictPath, FileMode.Open, FileAccess.Read)) using (StreamReader sr = new StreamReader(fs)) using (FileStream fsLog = new FileStream(fnLog, FileMode.Create, FileAccess.ReadWrite)) using (StreamWriter swLog = new StreamWriter(fsLog)) { // First two lines are commented and have metainfo // First line: user name // Second line: bulk change's comment string user = sr.ReadLine().Substring(1).Trim(); string note = sr.ReadLine().Substring(1).Trim(); lineNum = 2; using (SqlDict.ImportBuilder builder = dict.GetBulkBuilder(user, note)) { string line; while ((line = sr.ReadLine()) != null) { ++lineNum; if (line == "" || line.StartsWith("#")) { continue; } CedictEntry entry = parser.ParseEntry(line, lineNum, swLog); if (entry == null) { swLog.WriteLine(line); continue; } entry.Status = EntryStatus.Approved; bool ok = builder.AddNewEntry(entry); if (!ok) { swLog.WriteLine("Line " + lineNum + ": Entry rejected by importer."); swLog.WriteLine(line); continue; } } builder.CommitRest(); } } }
/// <summary> /// /// </summary> public override void Process() { // Mucho TO-DO in this action: // - Escape slashes in senses // - Proper checking for all sorts of stuff string simp = Req.Params["simp"]; if (simp == null) { throw new ApiException(400, "Missing 'simp' parameter."); } string trad = Req.Params["trad"]; if (trad == null) { throw new ApiException(400, "Missing 'trad' parameter."); } string pinyin = Req.Params["pinyin"]; if (pinyin == null) { throw new ApiException(400, "Missing 'pinyin' parameter."); } string trg = Req.Params["trg"]; if (trg == null) { throw new ApiException(400, "Missing 'trg' parameter."); } Result res = new Result(); res.Passed = true; CedictEntry entry = SqlDict.BuildEntry(simp, trad, pinyin, trg); StringBuilder sb = new StringBuilder(); using (HtmlTextWriter writer = new HtmlTextWriter(new StringWriter(sb))) { EntryRenderer er = new EntryRenderer(entry, null, null); er.Render(writer); } res.Preview = sb.ToString(); // Tell our caller Res = res; }
/// <summary> /// Verifies if string can serve as a simplified headword. /// </summary> public override void Process() { string simp = Req.Params["simp"]; if (simp == null) { throw new ApiException(400, "Missing 'simp' parameter."); } Result res = new Result(); UniHanziInfo[] uhis = Global.HWInfo.GetUnihanInfo(simp); // Has WS or punctuation bool hasSpaceOrPunct = false; // Chars that are neither hanzi nor A-Z0-9 List <char> notHanziOrLD = new List <char>(); // Unsupported hanzi: no Unihan info List <char> unsupportedHanzi = new List <char>(); // Not simplified List <char> notSimp = new List <char>(); // Check each character for (int i = 0; i != simp.Length; ++i) { char c = simp[i]; UniHanziInfo uhi = uhis[i]; // Space or punct if (char.IsWhiteSpace(c) || char.IsPunctuation(c)) { hasSpaceOrPunct = true; continue; } // Is it even a Hanzi or A-Z0-9? bool isHanziOrLD = SqlDict.IsHanzi(c) || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'); if (!isHanziOrLD) { notHanziOrLD.Add(c); continue; } // No info? if (uhi == null) { unsupportedHanzi.Add(c); continue; } // Cannot be simplified? if (!uhi.CanBeSimp) { notSimp.Add(c); continue; } } // Passed or not if (!hasSpaceOrPunct && notHanziOrLD.Count == 0 && unsupportedHanzi.Count == 0 && notSimp.Count == 0) { res.Passed = true; } else { // Compile our errors res.Passed = false; res.Errors = new List <string>(); if (hasSpaceOrPunct) { res.Errors.Add(errSpacePunct); } if (notHanziOrLD.Count != 0) { string err = errNotHanzi; foreach (char c in notHanziOrLD) { err += ' '; err += c; } res.Errors.Add(err); } if (unsupportedHanzi.Count != 0) { string err = errUnsupported; foreach (char c in unsupportedHanzi) { err += ' '; err += c; } res.Errors.Add(err); } if (notSimp.Count != 0) { string err = errNotSimp; foreach (char c in notSimp) { err += ' '; err += c; } res.Errors.Add(err); } } // Tell our caller Res = res; }
private void histRenderChange(HtmlTextWriter writer, SqlDict.ChangeItem ci, bool trailingSeparator) { writer.WriteLine(); writer.AddAttribute("class", "historyItem"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddAttribute("class", "changeHead"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddAttribute("class", "fa fa-lightbulb-o ctNew"); writer.RenderBeginTag(HtmlTextWriterTag.I); writer.RenderEndTag(); writer.AddAttribute("class", "changeSummary"); writer.RenderBeginTag(HtmlTextWriterTag.Div); string changeMsg; string changeCls = "changeType"; if (ci.ChangeType == SqlDict.ChangeType.New) { changeMsg = "Új szócikk"; } else if (ci.ChangeType == SqlDict.ChangeType.Edit) { changeMsg = "Szerkesztve"; } else if (ci.ChangeType == SqlDict.ChangeType.Note) { changeMsg = "Megjegyzés"; } else { changeMsg = ci.ChangeType.ToString(); } changeMsg += ": "; writer.AddAttribute("class", changeCls); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.WriteEncodedText(changeMsg); writer.RenderEndTag(); writer.AddAttribute("class", "changeUser"); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.WriteEncodedText(ci.User); writer.RenderEndTag(); writer.Write(" • "); writer.AddAttribute("class", "changeTime"); writer.RenderBeginTag(HtmlTextWriterTag.Span); DateTime dt = TimeZoneInfo.ConvertTimeFromUtc(ci.When, Global.TimeZoneInfo); string dtFmt = "{0}-{1:00}-{2:00} {3:00}:{4:00}"; dtFmt = string.Format(dtFmt, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute); writer.WriteEncodedText(dtFmt); writer.RenderEndTag(); writer.RenderEndTag(); writer.AddAttribute("class", "changeNote"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.WriteEncodedText(ci.Note); writer.RenderEndTag(); writer.RenderEndTag(); writer.AddAttribute("class", "changeEntry"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddAttribute("class", "histEntryOps"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddAttribute("class", "opHistEdit fa fa-pencil-square-o"); writer.RenderBeginTag(HtmlTextWriterTag.I); writer.RenderEndTag(); writer.AddAttribute("class", "opHistComment fa fa-commenting-o"); writer.RenderBeginTag(HtmlTextWriterTag.I); writer.RenderEndTag(); writer.AddAttribute("class", "opHistFlag fa fa-flag-o"); writer.RenderBeginTag(HtmlTextWriterTag.I); writer.RenderEndTag(); writer.RenderEndTag(); CedictEntry entry = SqlDict.BuildEntry(ci.EntryHead, ci.EntryBody); EntryRenderer er = new EntryRenderer(entry); er.OneLineHanziLimit = 12; er.Render(writer); writer.RenderEndTag(); writer.RenderEndTag(); if (trailingSeparator) { writer.AddAttribute("class", "historySep"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.RenderEndTag(); } }
/// <summary> /// Import dictionary data including version history. /// Only used to initialize from scratch. /// </summary> public void ImportDict(string dictPath, string workingFolder) { Startup.InitDB(config, null, false); SqlDict dict = new SqlDict(null, mut); List <EntryVersion> vers = new List <EntryVersion>(); using (FileStream fs = new FileStream(dictPath, FileMode.Open, FileAccess.Read)) using (StreamReader sr = new StreamReader(fs)) { EntryBlockParser ebp = new EntryBlockParser(sr); // Two passes. In the first we collect user names and bulk changes. var users = new HashSet <string>(); var bulks = new Dictionary <int, SqlDict.ImportBuilder.BulkChangeInfo>(); while (true) { vers.Clear(); int id = ebp.ReadBlock(vers); if (id == -1) { break; } for (int i = 0; i != vers.Count; ++i) { var ver = vers[i]; users.Add(ver.User); // First change referencing this bulk if (ver.BulkRef != -1 && !bulks.ContainsKey(ver.BulkRef)) { SqlDict.ImportBuilder.BulkChangeInfo bci = new SqlDict.ImportBuilder.BulkChangeInfo { Timestamp = ver.Timestamp, UserName = ver.User, Comment = ver.Comment, NewEntries = i == 0 ? 1 : 0, ChangedEntries = i != 0 ? 1 : 0, }; bulks[ver.BulkRef] = bci; } // Bulk, and seen before else if (ver.BulkRef != -1) { if (i == 0) { ++bulks[ver.BulkRef].NewEntries; } else { ++bulks[ver.BulkRef].ChangedEntries; } } } } // Enrich known built-in user names with "about" HashSet <string> richUsers = new HashSet <string>(); foreach (string x in users) { if (x == "HanDeDict") { richUsers.Add(x + "\t" + "Platzhalter für das ursprüngliche HanDeDict-Team"); } if (x == "zydeo-robot") { richUsers.Add(x + "\t" + "Platzhalter für automatische Datenverarbeitung"); } else { richUsers.Add(x + "\t"); } } // Second pass. Actual import. fs.Position = 0; using (SqlDict.ImportBuilder builder = dict.GetBulkBuilder(richUsers, bulks)) { while (true) { vers.Clear(); int id = ebp.ReadBlock(vers); if (id == -1) { break; } builder.AddEntry(id, vers); } builder.CommitRest(); } } }
protected override void Render(HtmlTextWriter writer) { writer.WriteLine(); writer.AddAttribute("class", "historyItem"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddAttribute("class", "changeHead"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddAttribute("class", "changeSummary"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddAttribute("class", "changeUser"); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.WriteEncodedText(ci.User); writer.RenderEndTag(); writer.Write(" • "); writer.AddAttribute("class", "changeTime"); writer.RenderBeginTag(HtmlTextWriterTag.Span); DateTime dt = TimeZoneInfo.ConvertTimeFromUtc(ci.When, Global.TimeZoneInfo); string dtFmt = "{0}-{1:00}-{2:00} {3:00}:{4:00}:{5:00}"; dtFmt = string.Format(dtFmt, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second); writer.WriteEncodedText(dtFmt); writer.RenderEndTag(); writer.Write(" • "); string changeMsg; string changeCls = "changeType"; if (ci.ChangeType == SqlDict.ChangeType.New) { changeMsg = "új szócikk"; changeCls += " ctNew"; } else if (ci.ChangeType == SqlDict.ChangeType.Edit) { changeMsg = "szerkesztve"; changeCls += " ctEdit"; } else if (ci.ChangeType == SqlDict.ChangeType.Note) { changeMsg = "megjegyzés"; changeCls += " ctNote"; } else { changeMsg = ci.ChangeType.ToString(); } writer.AddAttribute("class", changeCls); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.WriteEncodedText(changeMsg); writer.RenderEndTag(); writer.RenderEndTag(); writer.AddAttribute("class", "changeNote"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.WriteEncodedText("~~ " + ci.Note); writer.RenderEndTag(); writer.RenderEndTag(); writer.AddAttribute("class", "entry"); writer.RenderBeginTag(HtmlTextWriterTag.Div); CedictEntry entry = SqlDict.BuildEntry(ci.EntryHead, ci.EntryBody); EntryRenderer er = new EntryRenderer(entry, null, null); er.Render(writer); writer.RenderEndTag(); writer.RenderEndTag(); }