/// <summary> /// Construtor padrão. /// </summary> /// <param name="dataSource"></param> /// <param name="recordValues">Instancia do registro que será processado.</param> /// <param name="recordDescriptor"></param> /// <param name="entityTypeName">Nome do tipo da entidade associada.</param> public RegisterRecordAsyncTask(DynamicQueryDataSource dataSource, object[] recordValues, Record.RecordDescriptor recordDescriptor, Colosoft.Reflection.TypeName entityTypeName) { _dataSource = dataSource; _recordValues = recordValues; _recordDescriptor = recordDescriptor; _entityTypeName = entityTypeName; }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="dataSource">Oridem dos dados.</param> /// <param name="descriptor">Descritor dos registros.</param> /// <param name="firstRecord">Instancia do primeiro registro.</param> /// <param name="enumerator">Enumerador dos registros.</param> public GetRecordsEnumerator(GenericSqlQueryDataSource dataSource, Record.RecordDescriptor descriptor, Record firstRecord, IEnumerator <GDADataRecord> enumerator) { _dataSource = dataSource; _descriptor = descriptor; _enumerator = enumerator; _firstRecord = firstRecord; }
/// <summary> /// Cria o comparador para ordena os resultado da consulta. /// </summary> /// <param name="query">Informações da consulta.</param> /// <param name="descriptor">Descritor com assinatura dos dados do resultado.</param> /// <returns></returns> private static IComparer <Record> CreateSortComparer(QueryInfo query, Record.RecordDescriptor descriptor) { IComparer <Record> comparer = null; var fields = new List <Colosoft.Query.RecordSortComparer.Field>(); foreach (var sortPart in query.Sort) { var sortPartName = sortPart.Name; if (string.IsNullOrEmpty(sortPartName)) { throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.NotSupportedException_InvalidSortEntryFormat).Format()); } for (var i = 0; i < descriptor.Count; i++) { if (descriptor[i].Name == sortPartName) { fields.Add(new Colosoft.Query.RecordSortComparer.Field(i, sortPart.Reverse)); break; } } } if (fields.Count > 0) { comparer = new Colosoft.Query.RecordSortComparer(fields); } return(comparer); }
/// <summary> /// Gera um <see cref="Record"/> a partir de um parâmetro de persistência /// </summary> /// <returns><see cref="Record"/> gerado</returns> public Record ToRecord() { List <Record.Field> fields = new List <Record.Field>(); object[] values = new object[Parameters != null ? Parameters.Length : 0]; for (int i = 0; i < values.Length; i++) { fields.Add(new Record.Field(Parameters[i].Name, (Parameters[i].Value != null) ? Parameters[i].Value.GetType() : typeof(object))); values[i] = Parameters[i].Value; } Record.RecordDescriptor descriptor = new Record.RecordDescriptor("descriptor", fields); return(descriptor.CreateRecord(values)); }
protected virtual QueryResult ExecuteStoredProcedure(GDASession session, QueryInfo queryInfo) { var da = new DataAccess(session.ProviderConfiguration); IEnumerable <int> outputParametersIndexes; var procedure = GenerateGDAStoredProcedure(queryInfo, out outputParametersIndexes); procedure.CommandTimeout = queryInfo.CommandTimeout; IEnumerator <GDADataRecord> dataRecordEnumerator = da.LoadResult(session, procedure).GetEnumerator(); IEnumerable <Record> records = null; Record.RecordDescriptor descriptor = null; foreach (int index in outputParametersIndexes) { queryInfo.Parameters[index].Value = procedure[index]; } if (dataRecordEnumerator.MoveNext()) { var dataRecord = dataRecordEnumerator.Current; var fields = new List <Record.Field>(); for (int i = 0; i < dataRecord.FieldCount; i++) { var value = dataRecord[i].GetValue(); var name = dataRecord.GetName(i); if (string.IsNullOrEmpty(name)) { name = DataAccessConstants.ReturnValueColumnName; } fields.Add(new Record.Field(name, dataRecord.GetFieldType(i))); } descriptor = new Record.RecordDescriptor("descriptor", fields); var firstRecord = GetRecord(descriptor, dataRecord); records = GetRecords(descriptor, firstRecord, dataRecordEnumerator); } else { records = new Record[0]; } var result = new QueryResult(descriptor, records, queryInfo, f => Execute(session, f)); result.Validate().ThrowInvalid(); return(result); }
/// <summary> /// Recupera os dados do registro. /// </summary> /// <param name="descriptor"></param> /// <param name="record"></param> /// <returns></returns> protected Record GetRecord(Record.RecordDescriptor descriptor, GDADataRecord record) { var values = new object[descriptor.Count]; for (int i = 0; i < values.Length; i++) { var field = descriptor[i]; var fieldName = field.Name; if (fieldName == DataAccessConstants.ReturnValueColumnName) { fieldName = ""; } values[i] = GetValue(i, record, field.Type); if (field.Type == typeof(object) && values[i] is byte[]) { field.ChangeFieldType(typeof(byte[])); } } return(descriptor.CreateRecord(values)); }
private QueryResult ExecuteQuery(GDASession session, string commandText, QueryInfo queryInfo) { var query = new GDA.Sql.NativeQuery(commandText) { Query.QueryParameter.GetParameters(queryInfo, false).Select(f => CreateParameter(f.Name, f.Value)).GroupBy(f => f.ParameterName).Where(f => ContainsParameter(commandText, f.Key)).Select(f => f.FirstOrDefault()) }; query.CommandTimeout = queryInfo.CommandTimeout; if (queryInfo.TakeParameters != null) { if (queryInfo.TakeParameters.Skip > 0) { query.Skip(queryInfo.TakeParameters.Skip); } if (queryInfo.TakeParameters.Take > 0) { query.Take(queryInfo.TakeParameters.Take); } } IEnumerator <GDADataRecord> dataRecordEnumerator = query.ToDataRecords(session).GetEnumerator(); IEnumerable <Record> records = null; Record.RecordDescriptor descriptor = null; if (dataRecordEnumerator.MoveNext()) { var dataRecord = dataRecordEnumerator.Current; descriptor = GetRecordDescriptor(queryInfo, query, dataRecord); var firstRecord = GetRecord(descriptor, dataRecord); records = GetRecords(descriptor, firstRecord, dataRecordEnumerator); } else { records = new Record[0]; } var result = new QueryResult(descriptor, records, queryInfo, f => Execute(session, f)); result.Validate().ThrowInvalid(); return(result); }
/// <summary> /// Recupera a enumeração /// </summary> /// <param name="descriptor">Descritor dos campos dos registros.</param> /// <param name="firstRecord">Instancia do primeiro registro encontrado.</param> /// <param name="recordsEnumerator">Enumerador dos registros</param> /// <returns></returns> protected IEnumerable <Record> GetRecords(Record.RecordDescriptor descriptor, Record firstRecord, IEnumerator <GDADataRecord> recordsEnumerator) { return(new RecordsEnumerable(this, descriptor, firstRecord, recordsEnumerator)); }
protected override QueryResult ExecuteStoredProcedure(GDASession a, QueryInfo b) { DataAccess c = a != null ? new DataAccess(a.ProviderConfiguration) : new DataAccess(); var d = new List <int> (); var e = (TranslatedStoredProcedureName)Translator.GetName(b.StoredProcedureName); var f = "BEGIN " + (!string.IsNullOrEmpty(e.Schema) ? string.Format("\"{0}\".\"{1}\"", e.Schema, e.Name) : string.Format("\"{0}\"", e.Name)) + " ("; for (var g = 1; g <= b.Parameters.Count + 1; g++) { f += ":" + g + ","; } f = f.Substring(0, f.Length - 1) + "); END;"; var h = new GDA.Collections.GDAParameterCollection(); for (int g = 0; g < b.Parameters.Count; g++) { var i = (System.Data.ParameterDirection)((int)b.Parameters [g].Direction); h.Add(new GDAParameter(":" + (g + 1), b.Parameters [g].Value, i)); if (b.Parameters [g].Direction != ParameterDirection.Input) { d.Add(g); } } #if DEVART // Cria o parametro é que referência do cursor var j = new GDAParameter(":" + (b.Parameters.Count + 1), null) { NativeDbType = Devart.Data.Oracle.OracleDbType.Cursor, Direction = System.Data.ParameterDirection.Output }; #else var j = new GDAParameter(":" + (b.Parameters.Count + 1), null) { DbType = (System.Data.DbType) 13, Direction = System.Data.ParameterDirection.Output }; #endif h.Add(j); c.ExecuteCommand(a, System.Data.CommandType.Text, b.CommandTimeout, f, h.ToArray()); IEnumerator <GDADataRecord> k = NavigateRefCursor(j).GetEnumerator(); IEnumerable <Record> l = null; Record.RecordDescriptor m = null; foreach (int index in d) { b.Parameters [index].Value = h [index].Value; } try { if (k.MoveNext()) { var n = k.Current; var o = new List <Record.Field> (); for (int g = 0; g < n.FieldCount; g++) { var p = n [g].GetValue(); var q = n.GetName(g); if (string.IsNullOrEmpty(q)) { q = "return_value"; } o.Add(new Record.Field(q, n.GetFieldType(g))); } m = new Record.RecordDescriptor("descriptor", o); var r = GetRecord(m, n); l = GetRecords(m, r, k); } else { k.Dispose(); l = new Record[0]; } } catch { k.Dispose(); throw; } var s = new QueryResult(m, l, b, t => Execute(a, t)); s.Validate().ThrowInvalid(); return(s); }
protected override QueryResult ExecuteStoredProcedure(GDASession session, QueryInfo queryInfo) { DataAccess da = session != null ? new DataAccess(session.ProviderConfiguration) : new DataAccess(); var indexes = new List <int>(); var storedProcedureName = (TranslatedStoredProcedureName)Translator.GetName(queryInfo.StoredProcedureName); var script = "BEGIN " + (!string.IsNullOrEmpty(storedProcedureName.Schema) ? string.Format("\"{0}\".\"{1}\"", storedProcedureName.Schema, storedProcedureName.Name) : string.Format("\"{0}\"", storedProcedureName.Name)) + " ("; for (var i = 1; i <= queryInfo.Parameters.Count + 1; i++) { script += ":" + i + ","; } script = script.Substring(0, script.Length - 1) + "); END;"; var parameters = new GDA.Collections.GDAParameterCollection(); for (int i = 0; i < queryInfo.Parameters.Count; i++) { var paramDirection = (System.Data.ParameterDirection)((int)queryInfo.Parameters[i].Direction); parameters.Add(new GDAParameter(":" + (i + 1), queryInfo.Parameters[i].Value, paramDirection)); if (queryInfo.Parameters[i].Direction != ParameterDirection.Input) { indexes.Add(i); } } #if DEVART // Cria o parametro é que referência do cursor var refCursorParameter = new GDAParameter(":" + (queryInfo.Parameters.Count + 1), null) { NativeDbType = Devart.Data.Oracle.OracleDbType.Cursor, Direction = System.Data.ParameterDirection.Output }; #else var refCursorParameter = new GDAParameter(":" + (queryInfo.Parameters.Count + 1), null) { DbType = (System.Data.DbType) 13, Direction = System.Data.ParameterDirection.Output }; #endif parameters.Add(refCursorParameter); da.ExecuteCommand(session, System.Data.CommandType.Text, queryInfo.CommandTimeout, script, parameters.ToArray()); IEnumerator <GDADataRecord> dataRecordEnumerator = NavigateRefCursor(refCursorParameter).GetEnumerator(); IEnumerable <Record> records = null; Record.RecordDescriptor descriptor = null; foreach (int index in indexes) { queryInfo.Parameters[index].Value = parameters[index].Value; } try { if (dataRecordEnumerator.MoveNext()) { var dataRecord = dataRecordEnumerator.Current; var fields = new List <Record.Field>(); for (int i = 0; i < dataRecord.FieldCount; i++) { var value = dataRecord[i].GetValue(); var name = dataRecord.GetName(i); if (string.IsNullOrEmpty(name)) { name = "return_value"; } fields.Add(new Record.Field(name, dataRecord.GetFieldType(i))); } descriptor = new Record.RecordDescriptor("descriptor", fields); var firstRecord = GetRecord(descriptor, dataRecord); records = GetRecords(descriptor, firstRecord, dataRecordEnumerator); } else { dataRecordEnumerator.Dispose(); records = new Record[0]; } } catch { dataRecordEnumerator.Dispose(); throw; } var result = new QueryResult(descriptor, records, queryInfo, f => Execute(session, f)); result.Validate().ThrowInvalid(); return(result); }
/// <summary> /// Cria um registro com base nas chaves do resultado da consulta. /// </summary> /// <param name="entities"></param> /// <param name="keys"></param> /// <returns></returns> private Record CreateRecord(EntityInfo[] entities, object[] keys) { var entries = new object[entities.Length]; for (var i = 0; i < keys.Length; i++) { if (keys[i] != null) { var entry = _cache[keys[i]]; if (entry is UserBinaryObject) { var binaryObject = (UserBinaryObject)entry; using (var ms = new System.IO.MemoryStream(binaryObject.GetFullObject(), false)) entry = Colosoft.Serialization.Formatters.CompactBinaryFormatter.Deserialize(ms, _cache.Name); } entries[i] = entry; } } PropertyInfo[][] propertyInfos = null; if (_descriptor == null) { var descriptor = new Record.RecordDescriptor(); _projectionPositions = new List <KeyValuePair <int, string> >(); if (_query == null || _query.Projection == null || _query.Projection.Count == 0) { var entitiesIndex = new List <int>(); if (_query != null) { foreach (var info in _query.Entities) { var index = Array.FindIndex(entities, f => !string.IsNullOrEmpty(f.Alias) ? f.Alias == info.Alias : f.FullName == info.FullName); if (index >= 0) { entitiesIndex.Add(index); } } } else { for (var i = 0; i < entities.Length; i++) { entitiesIndex.Add(i); } } foreach (var i in entitiesIndex) { var typeMetadata = GetTypeMetadata(entities[i]); if (typeMetadata == null) { throw new InvalidOperationException(string.Format("Not found TypeMetadata for entity '{0}'", entities[i])); } foreach (var property in typeMetadata) { var index = 0; while (descriptor.Contains(property.Name + (index > 0 ? index.ToString() : ""))) { index++; } descriptor.Add(new Record.Field(property.Name + (index > 0 ? index.ToString() : ""), Type.GetType(property.PropertyType, true))); _projectionPositions.Add(new KeyValuePair <int, string>(i, property.Name)); } if (typeMetadata.IsVersioned && !descriptor.Contains("RowVersion")) { descriptor.Add(new Record.Field("RowVersion", typeof(long))); _projectionPositions.Add(new KeyValuePair <int, string>(i, "RowVersion")); } } } else { var typeMetadatas = new Dictionary <int, ITypeMetadata>(); foreach (var projectionEntry in _query.Projection) { var columnInfo = projectionEntry.GetColumnInfo(); if (columnInfo == null) { continue; } var entityInfo = _query.Entities.Where(f => f.Alias == columnInfo.Owner).FirstOrDefault(); if (entityInfo == null) { entityInfo = _query.Entities.FirstOrDefault(); } var entityIndex = -1; for (var i = 0; i < entities.Length; i++) { if (EntityInfoAliasComparer.Instance.Equals(entities[i], entityInfo)) { entityIndex = i; break; } } var name = columnInfo.Alias ?? columnInfo.Name; var index = 0; while (descriptor.Contains(name + (index > 0 ? index.ToString() : ""))) { index++; } if (index > 0) { name += index.ToString(); } if (entityIndex < 0) { descriptor.Add(new Record.Field(name, typeof(string))); _projectionPositions.Add(new KeyValuePair <int, string>(-1, null)); continue; } ITypeMetadata typeMetadata = null; if (!typeMetadatas.TryGetValue(entityIndex, out typeMetadata)) { typeMetadata = GetTypeMetadata(entities[entityIndex]); if (typeMetadata == null) { throw new InvalidOperationException(string.Format("Not found TypeMetadata for entity '{0}'", entities[entityIndex])); } typeMetadatas.Add(entityIndex, typeMetadata); } if (columnInfo.Name == "TableId") { var identityProperty = typeMetadata.GetKeyProperties().FirstOrDefault(); if (identityProperty != null) { descriptor.Add(new Record.Field(name, Type.GetType(identityProperty.PropertyType))); _projectionPositions.Add(new KeyValuePair <int, string>(entityIndex, identityProperty.Name)); } } else if (columnInfo.Name == Colosoft.Query.DataAccessConstants.RowVersionPropertyName && typeMetadata.IsVersioned) { descriptor.Add(new Record.Field(name, typeof(long))); _projectionPositions.Add(new KeyValuePair <int, string>(entityIndex, Colosoft.Query.DataAccessConstants.RowVersionPropertyName)); break; } else { foreach (var property in typeMetadata) { if (property.Name == columnInfo.Name) { descriptor.Add(new Record.Field(name, Type.GetType(property.PropertyType))); _projectionPositions.Add(new KeyValuePair <int, string>(entityIndex, property.Name)); break; } } } } } _descriptor = descriptor; } object[] values = new object[_descriptor.Count]; for (var projIndex = 0; projIndex < _projectionPositions.Count; projIndex++) { var projPosition = _projectionPositions[projIndex]; if (projPosition.Key < 0) { continue; } var entry = entries[projPosition.Key]; if (entry == null) { continue; } if (entry is ICacheItemRecord) { var itemRecord = (ICacheItemRecord)entry; if (itemRecord.Descriptor.Contains(projPosition.Value)) { values[projIndex] = itemRecord.GetValue(projPosition.Value); } } else { if (propertyInfos == null) { propertyInfos = new PropertyInfo[entries.Length][]; } if (propertyInfos[projPosition.Key] == null && entry != null) { propertyInfos[projPosition.Key] = entry.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(f => f.Name).ToArray(); } if (entry != null) { var propertyInfo = propertyInfos[projPosition.Key].Where(f => f.Name == projPosition.Value).FirstOrDefault(); if (propertyInfo != null) { values[projIndex] = propertyInfo.GetValue(entry, null); } } } } return(_descriptor.CreateRecord(values)); }
/// <summary> /// Cria um record a partir de um valor. /// </summary> /// <param name="cache">Instancia do cache onde está os dados.</param> /// <param name="key">Chave da entrada do cache.</param> /// <param name="descriptor">Descritor do resultado.</param> /// <param name="info"></param> /// <returns></returns> internal static Record CreateRecord(Cache cache, object key, ref Record.RecordDescriptor descriptor, QueryInfo info) { var resultValue = cache[key]; if (resultValue is UserBinaryObject) { var binaryObject = (UserBinaryObject)resultValue; using (var ms = new System.IO.MemoryStream(binaryObject.GetFullObject(), false)) resultValue = Colosoft.Serialization.Formatters.CompactBinaryFormatter.Deserialize(ms, cache.Name); } if (resultValue is ICacheItemRecord) { var itemRecord = (ICacheItemRecord)resultValue; if (descriptor.Count == 0) { if (info != null && info.Projection != null) { descriptor = new Record.RecordDescriptor(); foreach (var field in itemRecord.Descriptor) { if (info.Projection.Any(p => { var column = p.GetColumnInfo(); return(column != null && column.Name == field.Name); })) { descriptor.Add(field); } } } else { descriptor = itemRecord.Descriptor; } } object[] values = new object[descriptor.Count]; for (int i = 0; i < descriptor.Count; i++) { values[i] = itemRecord.GetValue(descriptor[i].Name); } return(descriptor.CreateRecord(values)); } else { var propertyInfos = resultValue.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(f => f.Name).ToArray(); if (descriptor.Count == 0) { List <Record.Field> fields = new List <Record.Field>(); for (int i = 0; i < propertyInfos.Length; i++) { fields.Add(new Record.Field(propertyInfos[i].Name, propertyInfos[i].ReflectedType)); } descriptor = new Record.RecordDescriptor("descriptor", fields); } object[] values = new object[descriptor.Count]; for (int i = 0; i < values.Length; i++) { values[i] = propertyInfos[i].GetValue(resultValue, null); } return(descriptor.CreateRecord(values)); } }
public IQueryResult Execute(QueryInfo query) { query.Require("query").NotNull(); #if DEBUG var queryText = query.ToString().Replace("\r\n", " "); var executeNumber = _executeCount++; var stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); #endif try { var cacheResult = ExecuteInCache(query); Record.RecordDescriptor descriptor = new Record.RecordDescriptor(); if (query.Projection != null && query.Projection.Count == 1 && IsCountFunction(query.Projection[0])) { var projectionColumn = query.Projection[0]; descriptor.Add(new Record.Field(projectionColumn.Alias, typeof(int))); return(new QueryResult(descriptor, new Record[] { descriptor.CreateRecord(new object[] { cacheResult.SearchKeysResult.Count }) }, query, Execute)); } var records = new List <Record>(); IComparer <Record> comparer = null; var comparerInitialized = false; using (var recordsEnumerator = new QueryResultSetRecordEnumerator(this._typeSchema, this.Cache, cacheResult, query)) { while (recordsEnumerator.MoveNext()) { var record = recordsEnumerator.Current; descriptor = recordsEnumerator.Descriptor; if (!comparerInitialized && query.Sort != null) { comparerInitialized = true; comparer = CreateSortComparer(query, descriptor); } if (comparerInitialized) { var index = records.BinarySearch(record, comparer); if (index < 0) { index = ~index; } records.Insert(index, record); } else { records.Add(record); } } } return(new QueryResult(descriptor, new RecordsResult(records), query, Execute)); } catch (Exception) { throw; } finally { #if DEBUG stopwatch.Stop(); RegisterEndExecute(stopwatch, queryText, executeNumber); #endif } }