コード例 #1
0
ファイル: Controller.Core.cs プロジェクト: mehedi09/GridWork
 ViewPage IDataController.GetPage(string controller, string view, PageRequest request)
 {
     SelectView(controller, view);
     request.AssignContext(controller, this._viewId, _config);
     ViewPage page = new ViewPage(request);
     if (_config.PlugIn != null)
         _config.PlugIn.PreProcessPageRequest(request, page);
     _config.AssignDynamicExpressions(page);
     page.ApplyDataFilter(_config.CreateDataFilter(), request.Controller, request.View, request.LookupContextController, request.LookupContextView, request.LookupContextFieldName);
     BusinessRules rules = InitBusinessRules(request, page);
     using (DbConnection connection = CreateConnection())
     {
         if (_serverRules.RequiresRowCount)
         {
             DbCommand countCommand = CreateCommand(connection);
             ConfigureCommand(countCommand, page, CommandConfigurationType.SelectCount, null);
             if (_serverRules.EnableResultSet)
                 page.TotalRowCount = _serverRules.ResultSetSize;
             else
                 if (YieldsSingleRow(countCommand))
                     page.TotalRowCount = 1;
                 else
                     page.TotalRowCount = Convert.ToInt32(countCommand.ExecuteScalar());
             if (page.RequiresAggregates)
             {
                 DbCommand aggregateCommand = CreateCommand(connection);
                 ConfigureCommand(aggregateCommand, page, CommandConfigurationType.SelectAggregates, null);
                 DbDataReader reader = aggregateCommand.ExecuteReader();
                 if (reader.Read())
                 {
                     object[] aggregates = new object[page.Fields.Count];
                     for (int i = 0; (i < aggregates.Length); i++)
                     {
                         DataField field = page.Fields[i];
                         if (field.Aggregate != DataFieldAggregate.None)
                         {
                             object v = reader[field.Name];
                             if (!(DBNull.Value.Equals(v)))
                             {
                                 if (!(field.FormatOnClient) && !(String.IsNullOrEmpty(field.DataFormatString)))
                                     v = String.Format(field.DataFormatString, v);
                                 aggregates[i] = v;
                             }
                         }
                     }
                     page.Aggregates = aggregates;
                 }
                 reader.Close();
             }
         }
         DbCommand selectCommand = CreateCommand(connection);
         if ((selectCommand == null) && _serverRules.EnableResultSet)
         {
             PopulatePageFields(page);
             EnsurePageFields(page, null);
         }
         if (page.RequiresMetaData)
             PopulatePageCategories(page);
         SyncRequestedPage(request, page, connection);
         ConfigureCommand(selectCommand, page, CommandConfigurationType.Select, null);
         if ((page.PageSize > 0) && !((request.Inserting || request.DoesNotRequireData)))
         {
             EnsureSystemPageFields(request, page, selectCommand);
             DbDataReader reader = ExecuteResultSetReader(page);
             if (reader == null)
                 if (selectCommand == null)
                     reader = ExecuteVirtualReader(request, page);
                 else
                     reader = TransactionManager.ExecuteReader(request, page, selectCommand);
             while (page.SkipNext())
                 reader.Read();
             while (page.ReadNext() && reader.Read())
             {
                 object[] values = new object[page.Fields.Count];
                 for (int i = 0; (i < values.Length); i++)
                 {
                     DataField field = page.Fields[i];
                     object v = reader[field.Name];
                     if (!(DBNull.Value.Equals(v)))
                     {
                         if (field.IsMirror)
                             v = String.Format(field.DataFormatString, v);
                         else
                             if ((field.Type == "Guid") && (v.GetType() == typeof(byte[])))
                                 v = new Guid(((byte[])(v)));
                             else
                                 v = ConvertObjectToValue(v);
                         values[i] = v;
                     }
                     if (!(String.IsNullOrEmpty(field.SourceFields)))
                         values[i] = CreateValueFromSourceFields(field, reader);
                 }
                 if (page.RequiresPivot)
                     page.AddPivotValues(values);
                 else
                     page.Rows.Add(values);
             }
             reader.Close();
         }
         if (request.RequiresFirstLetters && this._viewType != "Form")
             if (!(page.RequiresRowCount))
                 page.FirstLetters = String.Empty;
             else
             {
                 DbCommand firstLettersCommand = CreateCommand(connection);
                 string[] oldFilter = page.Filter;
                 ConfigureCommand(firstLettersCommand, page, CommandConfigurationType.SelectFirstLetters, null);
                 page.Filter = oldFilter;
                 if (!(String.IsNullOrEmpty(page.FirstLetters)))
                 {
                     DbDataReader reader = firstLettersCommand.ExecuteReader();
                     StringBuilder firstLetters = new StringBuilder(page.FirstLetters);
                     while (reader.Read())
                     {
                         firstLetters.Append(",");
                         string letter = Convert.ToString(reader[0]);
                         if (!(String.IsNullOrEmpty(letter)))
                             firstLetters.Append(letter);
                     }
                     reader.Close();
                     page.FirstLetters = firstLetters.ToString();
                 }
             }
     }
     if (_config.PlugIn != null)
         _config.PlugIn.ProcessPageRequest(request, page);
     if (request.Inserting)
         page.NewRow = new object[page.Fields.Count];
     if (request.Inserting)
     {
         if (_serverRules.SupportsCommand("Sql|Code", "New"))
             _serverRules.ExecuteServerRules(request, ActionPhase.Execute, "New", page.NewRow);
     }
     else
         if (_serverRules.SupportsCommand("Sql|Code", "Select"))
             foreach (object[] row in page.Rows)
                 _serverRules.ExecuteServerRules(request, ActionPhase.Execute, "Select", row);
     if (rules != null)
     {
         IRowHandler rowHandler = rules;
         if (request.Inserting)
         {
             if (rowHandler.SupportsNewRow(request))
                 rowHandler.NewRow(request, page, page.NewRow);
         }
         else
             if (rowHandler.SupportsPrepareRow(request))
                 foreach (object[] row in page.Rows)
                     rowHandler.PrepareRow(request, page, row);
         rules.ProcessPageRequest(request, page);
         if (rules.CompleteConfiguration())
             ResetViewPage(page);
     }
     page = page.ToResult(_config, _view);
     if (rules != null)
         rules.AfterSelect(request);
     else
         _serverRules.ExecuteServerRules(request, ActionPhase.After);
     _serverRules.Result.Merge(page);
     return page;
 }