예제 #1
0
    /// <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;
    }
예제 #2
0
 /// <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;
 }
예제 #3
0
 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);
       }
     }
   }
 }
예제 #4
0
    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;
    }
예제 #5
0
    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);
      }
    }