/// <summary> /// Запускает процесс обработки данных курсора и возвращает строку в виде JSON-объекта. /// </summary> /// <param name="cursor">Созданный курсор.</param> /// <param name="logFile"></param> /// <returns>CJsonStoreData</returns> public JsonStoreData Process(CJSCursor cursor, Logger logger = null) { if (logger != null) logger.WriteLn("CSQLtoJSON.Process - start"); var result = new JsonStoreData { EndReached = cursor.rqPacket.EndReached, Start = 0 }; result.MetaData = JsonStoreMetadata.ConstructMetadata(cursor.bioCode, cursor.CursorIniDoc); result.Rows = new JsonStoreRows(); var rowCount = 0; result.Start = cursor.rqPacket.Start; result.Limit = cursor.rqPacket.Limit; result.TotalCount = cursor.rqPacket.TotalCount; // перебираем все записи в курсоре //throw new Exception("FTW!!!"); if (logger != null) logger.WriteLn("CSQLtoJSON.Process - cursor - fettching - start"); while (cursor.Next()) { if (result.Limit == 0 || ++rowCount <= result.Limit) { var newRow = result.AddRow(); // перебираем все поля одной записи if (logger != null) logger.WriteLn("CSQLtoJSON.Process - cursor - fields - fettching - start"); foreach (var fld in cursor.Fields) { var fieldName = fld.FieldName; var v_field = fld; var process = true; if (this.ProcessField != null) process = this.ProcessField(ref fieldName, ref v_field); if (process) { var doEncodeFromAnsi = (v_field.DataType == JSFieldType.Clob) && (v_field.Encoding == FieldEncoding.WINDOWS1251); newRow.Values[result.MetaData.IndexOf(fieldName)] = doEncodeFromAnsi ? Utl.EncodeANSI2UTF(v_field.AsObject as String) : v_field.AsObject; } } if (logger != null) logger.WriteLn("CSQLtoJSON.Process - cursor - fields - fettching - end"); } } if (logger != null) logger.WriteLn("CSQLtoJSON.Process - cursor - fettching - end"); result.EndReached = result.Limit == 0 || rowCount <= result.Limit; result.TotalCount = result.Start + rowCount; if (logger != null) logger.WriteLn("CSQLtoJSON.Process - end"); return result; }
/// <summary> /// Преобразует строку со значениями первичного ключа в параметры. /// </summary> /// <param name="data"></param> /// <param name="row"></param> /// <returns></returns> public Params getPK(JsonStoreData data, JsonStoreRow row) { Params vParams = new Params(); var v_pkDef = this.GetPKFields(); for (int i = 0; i < v_pkDef.Length; i++) { var vType = v_pkDef[i].GetDotNetType(); var vValue = data.GetValue(row, v_pkDef[i].Name); vParams.Add(new Param(v_pkDef[i].Name, vValue, vType, ParamDirection.Input)); } return vParams; }
private void _applyPostingResults(JsonStoreData packet) { foreach (var row in packet.Rows.Where(r => (r.ChangeType == JsonStoreRowChangeType.Added) || (r.ChangeType == JsonStoreRowChangeType.Modified))) { var v_ds_row = this.DS0.Cast<Object>().FirstOrDefault(itm => { return String.Equals((String)TypeFactory.GetValueOfPropertyOfObject(itm, CS_INTERNAL_ROWUID_FIELD_NAME), row.InternalROWUID); }); if (v_ds_row != null) { for (var i = 0; i < packet.MetaData.Fields.Count; i++) { var fd = packet.MetaData.Fields[i]; var v_value = row.Values[i]; var v_prop = TypeFactory.FindPropertyOfObject(v_ds_row, fd.Name); v_prop.SetValue(v_ds_row, v_value, null); } } } }
public void Init( JsonStoreData packet, Params bioParams, JsonStoreFilter filter, JsonStoreSort sorter, String selection, Int32 timeout ) { this.rqPacket = packet; this._rq_bioParams = bioParams; this._rq_filter = filter; this._rq_sorter = sorter; this._rq_selection = selection; if (this.rqPacket == null) this.rqPacket = this._creJSData(); XmlElement SQLtext = detectSQLTextElement(this.CursorIniDoc, this.bioCode); _applyParamsTypes((XmlElement)SQLtext.ParentNode, this.rqBioParams); this.InitCursorFields(); if (this.rqBioParams == null) this._rq_bioParams = new Params(); base.Init(SQLtext.InnerText, this.rqBioParams); String vSQL = this.preparedSQL; Boolean v_filterIsDefined = this._applyFilter(this._rq_filter, ref this._rq_bioParams, ref vSQL); Boolean v_sorterIsDefined = this._applySorter(this._rq_sorter, ref vSQL); if (String.IsNullOrEmpty(this._rq_selection)) { JsonStoreFilter vLocate = (this.rqPacket != null) ? this.rqPacket.Locate : null; if (vLocate != null) { // ищем запрошенную запись var v_min_start = vLocate.FromPosition; String vSQLStr = null; var v_lprms = new Params(); vLocate.BuildSQLConditions(ref vSQLStr, v_lprms); if (!String.IsNullOrEmpty(vSQLStr)) vSQLStr = vSQLStr + " AND"; v_lprms = v_lprms.Merge(this.rqBioParams, true); v_lprms.SetValue("loc_start_from", v_min_start); vSQLStr = String.Format(csLocateNextSQLTemplate, vSQL, vSQLStr); int rnum = Convert.ToInt32(SQLCmd.ExecuteScalarSQL(this.Connection, vSQLStr, v_lprms, timeout)); if (this.rqPacket.Limit > 0) this.rqPacket.Start = Math.Max(((rnum - 1) / this.rqPacket.Limit) * this.rqPacket.Limit, 0); } this._applyPagging(this.rqPacket, !v_filterIsDefined && !v_sorterIsDefined, ref this._rq_bioParams, ref vSQL, timeout); } else { this._buildSelectSelectionSQL(this._rq_selection, this.rqBioParams, ref vSQL); } this.preparedSQL = vSQL; }
private void _applyPagging(JsonStoreData pckt, Boolean decompositEnabled, ref Params bioParams, ref String vSQL, Int32 timeout) { if (bioParams == null) bioParams = new Params(); // разбиваем на страницы Int64 vPgStart = pckt.Start; if (pckt.Limit > 0 || vPgStart == Int32.MaxValue && pckt.Limit > 0) { String vPreparedSQLLevel0 = vSQL; String vPreparedSQLLevel1 = null; if (decompositEnabled) { /* Если не включен Фильтер или сортировка, выделяем запрос 0-ого уровня. * P.S. запрос 0-ого уровня это вложенный запрос, который помечается метками csLevel0SQLLeftComma и csLevel0SQLRightComma. * Если не установлен фильтер или сортер, то условие разделения на страницы будет приметяться именно к запросу нулевого * уровня. Иначе все работает как прежде... */ this.decomposePreparedSQL(ref vPreparedSQLLevel0, ref vPreparedSQLLevel1); } String vPgnSQLTemplate = csPgnSQLTemplate; if (vPgStart == Int64.MaxValue) { vPgnSQLTemplate = csPgnSQLTemplateGoToLast; String vSQLStr = String.Format(csTotalCountSQLTemplate, vPreparedSQLLevel0); //string vSQLStr = String.Format(C_TotalCountSQLTemplate, this.preparedSQL); pckt.TotalCount = Convert.ToInt32(SQLCmd.ExecuteScalarSQL(this.Connection, vSQLStr, bioParams, timeout)); vPgStart = ((pckt.TotalCount - 1L) / pckt.Limit) * pckt.Limit; pckt.Start = vPgStart; } Int64 vPgEnd = vPgStart + pckt.Limit; vPreparedSQLLevel0 = String.Format(vPgnSQLTemplate, vPreparedSQLLevel0); if (!String.IsNullOrEmpty(vPreparedSQLLevel1)) { vSQL = String.Format(vPreparedSQLLevel1, vPreparedSQLLevel0); } else vSQL = vPreparedSQLLevel0; //this.preparedSQL = String.Format(C_PgnSQLTemplate, vPgEnd - vPgStart + 1, this.preparedSQL); //this.preparedSQL = String.Format(C_PgnSQLTemplate, this.preparedSQL); bioParams.Add("rnumto$", vPgEnd + 1); bioParams.Add("rnumfrom$", vPgStart); } }