public static TRow TryFirst <TRow>(this IDbConnection connection, Action <SqlQuery> editQuery) where TRow : class, IRow, new() { var row = new TRow() { TrackWithChecks = true }; var query = new SqlQuery().From(row); editQuery(query); if (query.GetFirst(connection)) { return(row); } return(null); }
internal static string ProcessReplaceFields(string s, Dictionary<string, Field> replaceFields, ISaveRequestHandler handler) { if (replaceFields == null) return s; var row = handler.Row; // foreign / calculated fields might not be available yet in new row // so load them from database // TODO: if referenced foreign fields changed on update, // values might be wrong in before update where we set filename // so need to handle update in AfterSave just like create if (handler.IsCreate && replaceFields.Values.Any(x => !x.IsTableField())) { var idField = (Field)(((IIdRow)handler.Row).IdField); row = handler.Row.Clone(); var query = new SqlQuery() .From(row); foreach (var field in replaceFields.Values) query.Select(field); query.Where(idField == new ValueCriteria(idField.AsObject(row))); query.GetFirst(handler.Connection); } foreach (var p in replaceFields) { var val = p.Value.AsObject(row); string str; var colon = p.Key.IndexOf(":"); if (colon >= 0) str = String.Format("{0:" + p.Key.Substring(colon + 1, p.Key.Length - colon - 2) + "}", val); else str = Convert.ToString(val ?? "", CultureInfo.InvariantCulture); str = StringHelper.SanitizeFilename(str).Replace('\\', '_').Replace("..", "_"); if (string.IsNullOrWhiteSpace(str)) str = "_"; while (str.EndsWith(".")) str = str.Substring(0, str.Length - 1) + "_"; s = s.Replace(p.Key, str); } while (s.IndexOf("//") > 0) s = s.Replace("//", "/_/"); return s; }