/// <summary> /// 生成分页的SQL /// </summary> /// <param name="page">页号</param> /// <param name="pageSize">每页几行(强制大于0,小于500行)</param> /// <param name="order">排序字段</param> /// <param name="desc">是否倒序</param> /// <param name="condition">数据条件</param> /// <returns></returns> private string CreatePageSql(int page, int pageSize, string order, bool desc, string condition) { var orderField = string.IsNullOrWhiteSpace(order) || !FieldDictionary.ContainsKey(order) ? KeyField : FieldDictionary[order]; var sql = new StringBuilder(); sql.Append($@"SELECT {ContextLoadFields} FROM {ContextReadTable}{ConditionSqlCode(condition)} ORDER BY `{orderField}` {(desc ? "DESC" : "ASC")}"); if (pageSize >= 0) { if (page <= 0) { page = 1; } if (pageSize == 0) { pageSize = 20; } else if (pageSize > 500) { pageSize = 500; } sql.Append($" LIMIT {(page - 1) * pageSize},{pageSize}"); } sql.Append(";"); return(sql.ToString()); }
/// <summary> /// 生成分页的SQL /// </summary> /// <param name="page">页号</param> /// <param name="pageSize">每页几行(强制大于0,小于500行)</param> /// <param name="order">排序字段</param> /// <param name="desc">是否倒序</param> /// <param name="condition">数据条件</param> /// <returns></returns> private string CreatePageSql(int page, int pageSize, string order, bool desc, string condition) { var orderField = string.IsNullOrWhiteSpace(order) || !FieldDictionary.ContainsKey(order) ? KeyField : FieldDictionary[order]; var sql = new StringBuilder(); CreateLoadSql(sql, ContextLoadFields, condition, orderField, desc, pageSize, page); return(sql.ToString()); }
/// <summary> /// 生成分页的SQL /// </summary> /// <param name="page">页号</param> /// <param name="pageSize">每页几行(强制大于0,小于500行)</param> /// <param name="order">排序字段</param> /// <param name="desc">是否倒序</param> /// <param name="condition">数据条件</param> /// <returns></returns> private string CreatePageSql(int page, int pageSize, string order, bool desc, string condition) { if (pageSize <= 0 || page < 0) { return(CreateLoadSql(condition, $@" [{order}] {(desc ? "DESC" : "ASC")}")); } var orderField = string.IsNullOrWhiteSpace(order) || !FieldDictionary.ContainsKey(order) ? KeyField : FieldDictionary[order]; return($@"SELECT * FROM ( SELECT {ContextLoadFields}, ROW_NUMBER() OVER (ORDER BY [{orderField}] {(desc ? "DESC" : "ASC")}) AS __rs FROM {ContextReadTable}{ConditionSqlCode(condition)} ) t WHERE __rs > {(page - 1) * pageSize} AND __rs <= {page * pageSize};"); }
/// <summary> /// 用在条件中的字段条件 /// </summary> /// <param name="field">字段</param> /// <param name="expression">条件表达式</param> /// <returns>字段条件</returns> public string FieldConditionSQL(string field, string expression = "=") { Debug.Assert(FieldDictionary.ContainsKey(field)); return($@"[{FieldMap[field]}] {expression} @{field}"); }
/// <summary> /// 生成载入字段值的SQL语句 /// </summary> /// <param name="field">字段</param> /// <param name="condition">条件</param> /// <returns>载入字段值的SQL语句</returns> private string CreateLoadValueSql(string field, string condition) { Debug.Assert(FieldDictionary.ContainsKey(field)); return($@"SELECT [{FieldMap[field]}] FROM {ContextReadTable}{ConditionSqlCode(condition)};"); }
/// <summary> /// Decode the Fields in record (returned from fstat for a file). /// </summary> /// <param name="record">A record returned from fstat for a file</param> /// <param name="p4FileName">The P4 fileName for which this record applies</param> /// <returns>The FileState for the file</returns> private static FileState GetFileStateFromRecordSet(P4Record record, out string p4FileName) { FieldDictionary fields = record.Fields; p4FileName = fields["clientFile"]; p4FileName = p4FileName.Replace('/', '\\'); if (fields.ContainsKey("headAction") && fields["headAction"] == "delete") { return(FileState.DeletedAtHeadRevision); } if (fields.ContainsKey("ourLock")) { return(FileState.Locked); // implies also opened for edit } if (fields.ContainsKey("action")) { string val = fields["action"]; if (val == "edit") { if (fields.ContainsKey("unresolved")) { return(FileState.NeedsResolved); } if (fields.ContainsKey("haveRev") && fields.ContainsKey("headRev") && fields["haveRev"] != fields["headRev"]) { return(FileState.OpenForEditDiffers); } return(FileState.OpenForEdit); } if (val == "add") { if (fields.ContainsKey("movedFile")) { return(FileState.OpenForRenameTarget); } return(FileState.OpenForAdd); } if (val == "delete") { if (fields.ContainsKey("movedFile")) { return(FileState.OpenForRenameSource); } return(FileState.OpenForDelete); } if (val == "move/delete") { return(FileState.OpenForRenameSource); } if (val == "move/add") { return(FileState.OpenForRenameTarget); } if (val == "integrate") { return(FileState.OpenForIntegrate); } if (val == "branch") { return(FileState.OpenForBranch); } } else { // No action field if (fields.ContainsKey("haveRev")) { if (fields.ContainsKey("headRev") && fields["haveRev"] == fields["headRev"]) { return(FileState.CheckedInHeadRevision); } else { return(FileState.CheckedInPreviousRevision); } } } if (fields.ContainsKey("otherOpen")) { ArrayFieldDictionary arrayFields = record.ArrayFields; if (arrayFields.ContainsKey("otherLock")) { return(FileState.LockedByOtherUser); } if (arrayFields.ContainsKey("otherAction")) { string[] array = arrayFields["otherAction"]; if (array.Any(val => val == "edit")) { return(FileState.OpenForEditOtherUser); } if (array.Any(val => val == "delete")) { return(FileState.OpenForDeleteOtherUser); } } } return(FileState.NotSet); }