protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value) { //we insert tenant as suspended so it can't be accessed before restore operation is finished if (table.Name.Equals("tenants_tenants", StringComparison.InvariantCultureIgnoreCase) && columnName.Equals("status", StringComparison.InvariantCultureIgnoreCase)) { value = (int)TenantStatus.Restoring; return true; } if (table.Name.Equals("tenants_quotarow", StringComparison.InvariantCultureIgnoreCase) && columnName.Equals("last_modified", StringComparison.InvariantCultureIgnoreCase)) { value = DateTime.UtcNow; return true; } if ((table.Name == "core_user" || table.Name == "core_group") && columnName == "last_modified") { value = DateTime.UtcNow.AddMinutes(2); return true; } return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value); }
protected override bool TryPrepareRow(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, DataRowInfo row, out Dictionary<string, object> preparedRow) { if (table.Name == "tenants_tenants" && string.IsNullOrEmpty(Convert.ToString(row["payment_id"]))) { var oldTenantID = Convert.ToInt32(row["id"]); row["payment_id"] = Core.CoreContext.Configuration.GetKey(oldTenantID); } return base.TryPrepareRow(connection, columnMapper, table, row, out preparedRow); }
public void Init(ColumnMapper columnMapper, Type baseType) { var otherColumns = columnMapper.Map(TargetType); var reference = otherColumns.FirstOrDefault(c => c.ReferenceTable != null && c.ReferenceTable.BaseType == baseType); if (reference != null) { //1-to-many } else { //many-to-many, auto cross reference table needed //collection.AddCrossTable(); } }
public override bool TryAdjustFilePath(ColumnMapper columnMapper, ref string filePath) { var match = Regex.Match(filePath, @"^thumbs/\d+/\d+/\d+/(?'fileId'\d+)\.jpg$"); if (match.Success) { var fileId = columnMapper.GetMapping("files_file", "id", match.Groups["fileId"].Value); if (fileId == null) return false; var s = fileId.ToString().PadRight(6, '0'); filePath = string.Format("thumbs/{0}/{1}/{2}/{3}.jpg", s.Substring(0, 2), s.Substring(2, 2), s.Substring(4), fileId); return true; } return false; }
public override bool TryAdjustFilePath(ColumnMapper columnMapper, ref string filePath) { var pathMatch = Regex.Match(filePath, @"^photos/\d+/\d+/\d+/contact_(?'contactId'\d+)(?'sizeExtension'_\d+_\d+\.\w+)$", RegexOptions.Compiled); if (pathMatch.Success) { var contactId = columnMapper.GetMapping("crm_contact", "id", pathMatch.Groups["contactId"].Value); if (contactId == null) return false; var s = contactId.ToString().PadLeft(6, '0'); filePath = string.Format("photos/{0}/{1}/{2}/contact_{3}{4}", s.Substring(0, 2), s.Substring(2, 2), s.Substring(4), contactId, pathMatch.Groups["sizeExtension"].Value); return true; } return false; }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value) { if (relation.ParentTable == "crm_organisation_logo") { bool success = true; value = Regex.Replace( Convert.ToString(value), @"(?<=""CompanyLogoID"":)\d+", match => { var mappedMessageId = Convert.ToString(columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, match.Value)); success = !string.IsNullOrEmpty(mappedMessageId) || Convert.ToInt32(match.Value) == 0; return mappedMessageId; }); return success; } return base.TryPrepareValue(connection, columnMapper, relation, ref value); }
public IDbCommand CreateInsertCommand(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, DataRowInfo row) { if (table.InsertMethod == InsertMethod.None) return null; Dictionary<string, object> valuesForInsert; if (!TryPrepareRow(connection, columnMapper, table, row, out valuesForInsert)) return null; var insertCommantText = string.Format("{0} into {1}({2}) values({3});", table.InsertMethod != InsertMethod.Ignore ? table.InsertMethod.ToString().ToLower() : "insert ignore", table.Name, string.Join(",", valuesForInsert.Keys), string.Join(",", valuesForInsert.Keys.Select(x => "@" + x))); IDbCommand command = connection.CreateCommand(insertCommantText); foreach (var parameter in valuesForInsert) { command.AddParameter(parameter.Key, parameter.Value); } return command; }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value) { if (table.Name == "files_file" && columnName == "id") { //In `files_file` possible multiple rows with the same value of the column `id`. //If such row was not inserted before current iteration then we need to create value for the `id` first. var fileId = columnMapper.GetMapping(table.Name, columnName, value); if (fileId == null) { fileId = connection .CreateCommand("select max(id) from files_file;") .WithTimeout(120) .ExecuteScalar<int>() + 1; columnMapper.SetMapping(table.Name, columnName, value, fileId); } value = fileId; return true; } return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value); }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value) { relations = relations.ToList(); if (relations.All(x => x.ChildTable == "forum_attachment" && x.ChildColumn == "path")) { value = PreparePath(columnMapper, "\\", Convert.ToString(value)); return value != null; } return base.TryPrepareValue(connection, columnMapper, table, columnName, relations, ref value); }
public override bool TryAdjustFilePath(ColumnMapper columnMapper, ref string filePath) { var match = Regex.Match(filePath, @"^folder_\d+/file_(?'fileId'\d+)/(?'versionExtension'v\d+/[\.\w]+)$", RegexOptions.Compiled); if (match.Success) { var fileId = columnMapper.GetMapping("files_file", "id", match.Groups["fileId"].Value); if (fileId == null) return false; filePath = string.Format("folder_{0}/file_{1}/{2}", (Convert.ToInt32(fileId)/1000 + 1)*1000, fileId, match.Groups["versionExtension"].Value); return true; } return false; }
public override bool TryAdjustFilePath(ColumnMapper columnMapper, ref string filePath) { var match = Regex.Match(filePath, @"(?<=folder_\d+/message_)\d+(?=\.html)"); //todo: if (match.Success) { var mappedMessageId = Convert.ToString(columnMapper.GetMapping("mail_mail", "id", match.Value)); if (string.IsNullOrEmpty(mappedMessageId)) return false; filePath = string.Format("folder_{0}/message_{1}.html", (Convert.ToInt32(mappedMessageId)/1000 + 1)*1000, mappedMessageId); return true; } return base.TryAdjustFilePath(columnMapper, ref filePath); }
private static TableMapper LoadSQLServer(String TableName) { var TableMapper = new TableMapper(); var Query = "SELECT " + "UPPER(A.COLUMN_NAME) COLUMN_NAME, " + "LOWER(A.IS_NULLABLE) IS_NULLABLE, " + "LOWER(A.DATA_TYPE) DATA_TYPE, " + "LOWER(A.CHARACTER_MAXIMUM_LENGTH) MAXIMUM_LENGTH, " + "B.COLUMN_KEY " + "FROM " + "INFORMATION_SCHEMA.COLUMNS A LEFT JOIN " + "(SELECT UPPER(KCU.TABLE_NAME) AS TABLE_NAME, " + " UPPER(KCU.COLUMN_NAME) AS COLUMN_NAME, " + " CASE WHEN LOWER(TC.CONSTRAINT_TYPE) = 'PRIMARY KEY' THEN 'pk' " + " WHEN LOWER(TC.CONSTRAINT_TYPE) = 'FOREIGN KEY' THEN 'fk' " + " WHEN LOWER(TC.CONSTRAINT_TYPE) = 'UNIQUE' THEN NULL " + " WHEN LOWER(TC.CONSTRAINT_TYPE) = NULL THEN NULL " + " END AS COLUMN_KEY " + " FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU " + " LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC " + " ON KCU.TABLE_NAME = TC.TABLE_NAME " + " AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA " + " AND KCU.TABLE_CATALOG = TC.TABLE_CATALOG " + " AND KCU.CONSTRAINT_CATALOG = TC.CONSTRAINT_CATALOG " + " AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME " + " LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC " + " ON RC.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA " + " AND RC.CONSTRAINT_CATALOG = TC.CONSTRAINT_CATALOG " + " AND RC.CONSTRAINT_NAME = TC.CONSTRAINT_NAME " + " LEFT JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU " + " ON RC.UNIQUE_CONSTRAINT_SCHEMA = CCU.CONSTRAINT_SCHEMA " + " AND RC.UNIQUE_CONSTRAINT_CATALOG = CCU.CONSTRAINT_CATALOG " + " AND RC.UNIQUE_CONSTRAINT_NAME = CCU.CONSTRAINT_NAME) B " + " ON A.TABLE_NAME = B.TABLE_NAME AND A.COLUMN_NAME = B.COLUMN_NAME " + "WHERE " + "A.TABLE_NAME = '" + TableName.ToLower() + "'"; using (var Conexao = new ConnectionSqlServer(Query)) { if (Conexao.Open()) { TableMapper.TableName = TableName; var CollectionColumnMapper = new List <ColumnMapper>(); while (Conexao.LerRegistro()) { var Column = new ColumnMapper(); Column.ColumnName = Conexao.Ler("COLUMN_NAME").ToString(); Column.IsNullable = Conexao.Ler("IS_NULLABLE").ToString(); Column.DataType = Conexao.Ler("DATA_TYPE").ToString(); Column.MaxLenght = Conexao.Ler("MAXIMUM_LENGTH").ToString(); Column.ColumnKey = Conexao.Ler("COLUMN_KEY").ToString(); CollectionColumnMapper.Add(Column); } TableMapper.CollectionColumn = CollectionColumnMapper; } } return(TableMapper); }
public void RunJob() { Tenant tenant = null; var tempFile = PathHelper.GetTempFileName(TempFolder); try { NotifyHelper.SendAboutRestoreStarted(TenantId, Notify); var storage = BackupStorageFactory.GetBackupStorage(StorageType, TenantId, StorageParams); storage.Download(StoragePath, tempFile); if (!CoreContext.Configuration.Standalone) { var backupHash = GetBackupHash(tempFile); var repo = BackupStorageFactory.GetBackupRepository(); var record = repo.GetBackupRecord(backupHash, TenantId); if (record == null) { throw new Exception(BackupResource.BackupNotFound); } } Percentage = 10; tenant = CoreContext.TenantManager.GetTenant(TenantId); tenant.SetStatus(TenantStatus.Restoring); CoreContext.TenantManager.SaveTenant(tenant); var columnMapper = new ColumnMapper(); columnMapper.SetMapping("tenants_tenants", "alias", tenant.TenantAlias, ((Guid)Id).ToString("N")); columnMapper.Commit(); var restoreTask = new RestorePortalTask(Log, TenantId, configPaths[currentRegion], tempFile, columnMapper, upgradesPath); restoreTask.ProgressChanged += (sender, args) => Percentage = (10d + 0.65 * args.Progress); restoreTask.RunJob(); Tenant restoredTenant = null; if (restoreTask.Dump) { AscCache.OnClearCache(); if (Notify) { var tenants = CoreContext.TenantManager.GetTenants(); foreach (var t in tenants) { NotifyHelper.SendAboutRestoreCompleted(t.TenantId, Notify); } } } else { CoreContext.TenantManager.RemoveTenant(tenant.TenantId); restoredTenant = CoreContext.TenantManager.GetTenant(columnMapper.GetTenantMapping()); restoredTenant.SetStatus(TenantStatus.Active); restoredTenant.TenantAlias = tenant.TenantAlias; restoredTenant.PaymentId = string.Empty; if (string.IsNullOrEmpty(restoredTenant.MappedDomain) && !string.IsNullOrEmpty(tenant.MappedDomain)) { restoredTenant.MappedDomain = tenant.MappedDomain; } CoreContext.TenantManager.SaveTenant(restoredTenant); // sleep until tenants cache expires Thread.Sleep(TimeSpan.FromMinutes(2)); NotifyHelper.SendAboutRestoreCompleted(restoredTenant.TenantId, Notify); } Percentage = 75; File.Delete(tempFile); Percentage = 100; } catch (Exception error) { Log.Error(error); Error = error; if (tenant != null) { tenant.SetStatus(TenantStatus.Active); CoreContext.TenantManager.SaveTenant(tenant); } } finally { if (File.Exists(tempFile)) { File.Delete(tempFile); } IsCompleted = true; } }
private static void mergeFeature(FeatureDataTable target, IFeatureDataRecord srcFeature, FeatureDataRow targetFeature, ColumnMapper columnMapper, ICoordinateTransformation transform, IGeometryFactory geoFactory, Boolean preserveChanges) { if (targetFeature == null) { targetFeature = target.NewRow(); setFeatureRowFromIFeatureDataRecord(srcFeature, targetFeature, columnMapper, transform, geoFactory); target.AddRow(targetFeature); } else { if (preserveChanges && targetFeature.RowState == DataRowState.Modified) { throw new NotImplementedException("Merging updates to original features " + "state not yet implemented."); } setFeatureRowFromIFeatureDataRecord(srcFeature, targetFeature, columnMapper, transform, geoFactory); } }
public void RunJob() { Tenant tenant = null; var tempFile = PathHelper.GetTempFileName(tempFolder); try { NotifyHelper.SendAboutRestoreStarted(TenantId, Notify); var storage = BackupStorageFactory.GetBackupStorage(StorageType, TenantId); storage.Download(StoragePath, tempFile); Percentage = 10; tenant = CoreContext.TenantManager.GetTenant(TenantId); tenant.SetStatus(TenantStatus.Restoring); CoreContext.TenantManager.SaveTenant(tenant); var columnMapper = new ColumnMapper(); columnMapper.SetMapping("tenants_tenants", "alias", tenant.TenantAlias, ((Guid)Id).ToString("N")); columnMapper.Commit(); var restoreTask = new RestorePortalTask(Log, TenantId, configPaths[currentRegion], tempFile, columnMapper); restoreTask.IgnoreTable("tenants_tariff"); restoreTask.ProgressChanged += (sender, args) => Percentage = (10d + 0.65 * args.Progress); restoreTask.RunJob(); CoreContext.TenantManager.RemoveTenant(tenant.TenantId); var restoredTenant = CoreContext.TenantManager.GetTenant(columnMapper.GetTenantMapping()); restoredTenant.SetStatus(TenantStatus.Active); restoredTenant.TenantAlias = tenant.TenantAlias; restoredTenant.PaymentId = string.Empty; if (string.IsNullOrEmpty(restoredTenant.MappedDomain) && !string.IsNullOrEmpty(tenant.MappedDomain)) { restoredTenant.MappedDomain = tenant.MappedDomain; } CoreContext.TenantManager.SaveTenant(restoredTenant); Percentage = 75; File.Delete(tempFile); // sleep until tenants cache expires Thread.Sleep(TimeSpan.FromMinutes(2)); Percentage = 100; NotifyHelper.SendAboutRestoreCompleted(restoredTenant.TenantId, Notify); } catch (Exception error) { Log.Error(error); Error = error; if (tenant != null) { tenant.SetStatus(TenantStatus.Active); CoreContext.TenantManager.SaveTenant(tenant); } } finally { if (File.Exists(tempFile)) { File.Delete(tempFile); } IsCompleted = true; } }
public virtual bool TryAdjustFilePath(ColumnMapper columnMapper, ref string filePath) { return(true); }
protected override bool TryPrepareValue(System.Data.IDbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value) { if (relation.ChildTable == "crm_relationship_event" && relation.ChildColumn == "content") { bool success = true; value = Regex.Replace( Convert.ToString(value), @"(?<=""message_id"":|/products/crm/httphandlers/filehandler\.ashx\?action=mailmessage&message_id=)\d+", match => { var mappedMessageId = Convert.ToString(columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, match.Value)); success = !string.IsNullOrEmpty(mappedMessageId); return(mappedMessageId); }); return(success); } return(base.TryPrepareValue(connection, columnMapper, relation, ref value)); }
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath) { //todo: hack: will be changed later filePath = Regex.Replace(filePath, @"^[-\w]+(?=/)", match => dump ? match.Value : columnMapper.GetUserMapping(match.Value)); return(!filePath.StartsWith("/")); }
/// <summary> /// Finds a list of accounts matching a prefix /// </summary> /// <returns>The account username prefix.</returns> /// <param name="search">Search prefix.</param> public static string[] FindAccountsByPrefix(string search) { using (var ctx = DatabaseFactory.CreateConnection()) { using (var txn = ctx.BeginTransaction()) return(ctx.Query <APIAccount>($"select * from {TableMapper.TypeToName<APIAccount>()} where {ColumnMapper.Enclose("Username")} like @Username", new { Username = search + '%' }, transaction: txn) .Select(x => x.Username) .ToArray()); } }
/// <summary> /// Finds a list of users matching a prefix /// </summary> /// <returns>The users by prefix.</returns> /// <param name="search">Search.</param> public static string[] FindPlayersByPrefix(string search, bool includeOp = false) { #if DAPPER using (var ctx = DatabaseFactory.CreateConnection()) { using (var txn = ctx.BeginTransaction()) return(ctx.Query <DbPlayer>($"select * from {TableMapper.TypeToName<DbPlayer>()} where {ColumnMapper.Enclose("Name")} like @Name", new { Name = '%' + search + '%' }, transaction: txn) .Select(x => includeOp && x.Operator ? x.Name + " [Op]" : x.Name) .ToArray()); } #else using (var ctx = new TContext()) { #if ENTITY_FRAMEWORK_6 if (OTA.Data.EF6.OTAContext.IsSQLite) { var lowered = search.ToLower(); return(ctx.Players .Where(x => x.Name.Length >= search.Length && x.Name.Substring(0, search.Length).ToLower() == lowered) .Select(x => x.Name) .ToArray()); } else { #endif return(ctx.Players .Where(x => x.Name.StartsWith(search)) .Select(x => x.Name) .ToArray()); #if ENTITY_FRAMEWORK_6 } #endif #endif }
private static void AutoSelectUpdatable <T>(ColumnMapper columnMapper, T source, T target) { columnMapper.AutoSelectUpdatable(); }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value) { if (relation.ChildTable == "files_bunch_objects" && relation.ChildColumn == "right_node" || relation.ChildTable == "files_tag" && relation.ChildColumn == "name") { var strValue = Convert.ToString(value); string start = GetStart(strValue); if (start == null) return false; var entityId = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, strValue.Substring(start.Length)); if (entityId == null) return false; value = strValue.Substring(0, start.Length) + entityId; return true; } return base.TryPrepareValue(connection, columnMapper, relation, ref value); }
protected virtual bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable <RelationInfo> relations, ref object value) { return(TryPrepareValue(connection, columnMapper, relations.Single(), ref value)); }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value) { if (relation.ChildTable == "core_acl" && relation.ChildColumn == "object") { var valParts = Convert.ToString(value).Split('|'); var entityId = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, valParts[1]); if (entityId == null) return false; value = string.Format("{0}|{1}", valParts[0], entityId); return true; } return base.TryPrepareValue(connection, columnMapper, relation, ref value); }
public virtual Stream PrepareData(string key, Stream stream, ColumnMapper columnMapper) { return(stream); }
/// <summary> /// 配置 /// </summary> /// <param name="services"></param> public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); //获取IP services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); #region swagger和JWT //添加swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = "通用框架2019", Version = "V1 ", Description = "Sparkle831143", Contact = new Contact { Name = "Sparkle:", Url = "/views/test.html", Email = "*****@*****.**" } }); // 添加JWT(Bearer 输入框) var security = new Dictionary <string, IEnumerable <string> > { { "Sparkle_Framework2019", new string[] { } }, }; // 校验方案 c.AddSecurityRequirement(security); c.AddSecurityDefinition("Sparkle_Framework2019", new ApiKeyScheme { Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token}(注意两者之间是一个空格)\"", Name = "Authorization", //jwt默认的参数名称 In = "header", //jwt默认存放Authorization信息的位置(请求头中) Type = "apiKey" }); //添加Swagger xml说明文档 var basepath = Path.GetDirectoryName(typeof(Program).Assembly.Location); var xmlpath = Path.Combine(basepath, "Sparkle_Framework2019.xml"); c.IncludeXmlComments(xmlpath); }); #region JWT //认证 services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(o => { o.TokenValidationParameters = new TokenValidationParameters { // 是否开启签名认证 ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Token.SecurityKey)), // 发行人验证,这里要和token类中Claim类型的发行人保持一致 ValidateIssuer = true, ValidIssuer = "Sparkle",//发行人 // 接收人验证 ValidateAudience = true, ValidAudience = "User",//订阅人 ValidateLifetime = true, ClockSkew = TimeSpan.Zero, }; }); #endregion #endregion #region 跨域 //添加跨域访问 services.AddCors(options => { options.AddPolicy("Cors", builder => builder.AllowAnyOrigin() //添加跨域访问规则 .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials()); }); #endregion #region 实体映射 //实体映射 ColumnMapper.SetMapper(); #endregion #region 获取token //获取请求头 services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>(); #endregion #region 依赖注入 var IOCbuilder = new ContainerBuilder();//建立容器 List <Assembly> programlist = new List <Assembly> { Assembly.Load("Common"), Assembly.Load("DAL") }; //批量反射程序集 foreach (var q in programlist) { IOCbuilder.RegisterAssemblyTypes(q).AsImplementedInterfaces(); //注册容器 } IOCbuilder.Populate(services); //将service注入到容器 var ApplicationContainner = IOCbuilder.Build(); //登记创建容器 return(new AutofacServiceProvider(ApplicationContainner)); //IOC接管 #endregion }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value) { if (relation.ParentTable == "crm_tag" && relation.ChildColumn == "id_tag" && (relation.ChildTable == "mail_tag_mail" || relation.ChildTable == "mail_tag_addresses")) { var crmTagId = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, -Convert.ToInt32(value)); if (crmTagId == null) return false; value = -Convert.ToInt32(crmTagId); return true; } return base.TryPrepareValue(connection, columnMapper, relation, ref value); }
// FIX_PERF private static void setFeatureRowFromIFeatureDataRecord(IFeatureDataRecord srcFeature, FeatureDataRow targetFeature, ColumnMapper columnMapper, ICoordinateTransformation transform, IGeometryFactory geoFactory) { //for (Int32 i = 0; i < srcFeature.FieldCount; i++) //{ // String colName = srcFeature.GetName(i); // targetFeature[colName] = srcFeature.GetValue(i); //} if (transform != null)//jd: to prevent case when transform is null - probably because a test was done earlier. need to check { if (srcFeature.Geometry.SpatialReference.EqualParams(transform.Target)) { transform = null; } } srcFeature.GetValues(columnMapper.SourceValues); targetFeature.ItemArray = columnMapper.Map(); targetFeature.Geometry = transform == null ? srcFeature.Geometry : transform.Transform(srcFeature.Geometry, geoFactory); targetFeature.IsFullyLoaded = targetFeature.IsFullyLoaded || srcFeature.IsFullyLoaded; }
public override bool TryAdjustFilePath(ColumnMapper columnMapper, ref string filePath) { filePath = PreparePath(columnMapper, "/", filePath); return(filePath != null); }
protected override bool TryPrepareValue(System.Data.IDbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value) { if (relation.ChildTable == "crm_relationship_event" && relation.ChildColumn == "content") { bool success = true; value = Regex.Replace( Convert.ToString(value), @"(?<=""message_id"":|/products/crm/httphandlers/filehandler\.ashx\?action=mailmessage&message_id=)\d+", match => { var mappedMessageId = Convert.ToString(columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, match.Value)); success = !string.IsNullOrEmpty(mappedMessageId); return mappedMessageId; }); return success; } return base.TryPrepareValue(connection, columnMapper, relation, ref value); }
public virtual bool TryAdjustFilePath(ColumnMapper columnMapper, ref string filePath) { return true; }
public override bool TryAdjustFilePath(ColumnMapper columnMapper, ref string filePath) { filePath = PreparePath(columnMapper, "/", filePath); return filePath != null; }
protected virtual bool TryPrepareRow(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, DataRowInfo row, out Dictionary<string, object> preparedRow) { preparedRow = new Dictionary<string, object>(); var parentRelations = TableRelations .Where(x => x.FitsForRow(row) && x.Importance != RelationImportance.Low) .GroupBy(x => x.ChildColumn) .ToDictionary(x => x.Key); foreach (var columnName in row.ColumnNames) { if (table.IdType == IdType.Autoincrement && columnName.Equals(table.IdColumn, StringComparison.OrdinalIgnoreCase)) continue; var val = row[columnName]; if (!parentRelations.ContainsKey(columnName)) { if (!TryPrepareValue(connection, columnMapper, table, columnName, ref val)) return false; } else { if (!TryPrepareValue(connection, columnMapper, table, columnName, parentRelations[columnName], ref val)) return false; } preparedRow.Add(columnName, val); } return true; }
private static string PreparePath(ColumnMapper columnMapper, string partsSeparator, string path) { string[] parts = path.Split(new[] {partsSeparator}, StringSplitOptions.None); if (parts.Length != 4) return null; var categoryId = columnMapper.GetMapping("forum_category", "id", parts[0]); if (categoryId == null) return null; var threadId = columnMapper.GetMapping("forum_thread", "id", parts[1]); if (threadId == null) return null; parts[0] = categoryId.ToString(); parts[1] = threadId.ToString(); return string.Join(partsSeparator, parts); }
protected override Expression VisitProjection(ProjectionExpression proj) { SelectExpression save = this.currentSelect; this.currentSelect = proj.Select; try { if (!this.isTopLevel) { if (this.CanJoinOnClient(this.currentSelect)) { // make a query that combines all the constraints from the outer queries into a single select SelectExpression newOuterSelect = (SelectExpression)QueryDuplicator.Duplicate(save); // remap any references to the outer select to the new alias; SelectExpression newInnerSelect = (SelectExpression)ColumnMapper.Map(proj.Select, newOuterSelect.Alias, save.Alias); // add outer-join test ProjectionExpression newInnerProjection = this.language.AddOuterJoinTest(new ProjectionExpression(newInnerSelect, proj.Projector)); newInnerSelect = newInnerProjection.Select; Expression newProjector = newInnerProjection.Projector; TableAlias newAlias = new TableAlias(); var pc = ColumnProjector.ProjectColumns(this.language, newProjector, null, newAlias, newOuterSelect.Alias, newInnerSelect.Alias); JoinExpression join = new JoinExpression(JoinType.OuterApply, newOuterSelect, newInnerSelect, null); SelectExpression joinedSelect = new SelectExpression(newAlias, pc.Columns, join, null, null, null, proj.IsSingleton, null, null, false); // apply client-join treatment recursively this.currentSelect = joinedSelect; newProjector = this.Visit(pc.Projector); // compute keys (this only works if join condition was a single column comparison) List <Expression> outerKeys = new List <Expression>(); List <Expression> innerKeys = new List <Expression>(); if (this.GetEquiJoinKeyExpressions(newInnerSelect.Where, newOuterSelect.Alias, outerKeys, innerKeys)) { // outerKey needs to refer to the outer-scope's alias var outerKey = outerKeys.Select(k => ColumnMapper.Map(k, save.Alias, newOuterSelect.Alias)); // innerKey needs to refer to the new alias for the select with the new join var innerKey = innerKeys.Select(k => ColumnMapper.Map(k, joinedSelect.Alias, ((ColumnExpression)k).Alias)); ProjectionExpression newProjection = new ProjectionExpression(joinedSelect, newProjector, proj.Aggregator); return(new ClientJoinExpression(newProjection, outerKey, innerKey)); } } else { bool saveJoin = this.canJoinOnClient; this.canJoinOnClient = false; var result = base.VisitProjection(proj); this.canJoinOnClient = saveJoin; return(result); } } else { this.isTopLevel = false; } return(base.VisitProjection(proj)); } finally { this.currentSelect = save; } }
protected override bool TryPrepareRow(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, DataRowInfo row, out Dictionary<string, object> preparedRow) { if (row.TableName == "files_thirdparty_id_mapping") { //todo: think... preparedRow = new Dictionary<string, object>(); object folderId = null; var sboxId = Regex.Replace(row[1].ToString(), @"(?<=sbox-)\d+", match => { folderId = columnMapper.GetMapping("files_thirdparty_account", "id", match.Value); return Convert.ToString(folderId); }, RegexOptions.Compiled); if (folderId == null) return false; var hashBytes = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(sboxId)); var hashedId = BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); preparedRow.Add("hash_id", hashedId); preparedRow.Add("id", sboxId); preparedRow.Add("tenant_id", columnMapper.GetTenantMapping()); columnMapper.SetMapping("files_thirdparty_id_mapping", "hash_id", row["hash_id"], hashedId); return true; } return base.TryPrepareRow(connection, columnMapper, table, row, out preparedRow); }
protected virtual bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value) { return TryPrepareValue(connection, columnMapper, relations.Single(), ref value); }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value) { var relationList = relations.ToList(); if (relationList.All(x => x.ChildTable == "files_security" && x.ChildColumn == "subject")) { //note: value could be ShareForEveryoneID and in that case result should be always false var strVal = Convert.ToString(value); if (Helpers.IsEmptyOrSystemUser(strVal) || Helpers.IsEmptyOrSystemGroup(strVal)) return true; foreach (var relation in relationList) { var mapping = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, value); if (mapping != null) { value = mapping; return true; } } return false; } return base.TryPrepareValue(connection, columnMapper, table, columnName, relationList, ref value); }
protected virtual bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value) { var mappedValue = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, value); if (mappedValue != null) { value = mappedValue; return true; } Guid guidVal; int intVal; return value == null || (Guid.TryParse(Convert.ToString(value), out guidVal) && guidVal == Guid.Empty) || (int.TryParse(Convert.ToString(value), out intVal) && intVal <= 0); }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value) { if (table.Name == "core_usergroup" && columnName == "last_modified") { value = DateTime.UtcNow; return true; } return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value); }
private void mergeSchemaIfNeeded(IFeatureDataRecord record, IGeometryFactory factory) { if ((SchemaMergeAction & SchemaMergeAction.AddAll) != SchemaMergeAction.None) { // HACK: Parsing and setting the schema should be less clunky here. // We probably need to just do the schema merge ourselves without // having to rely on System.Data.Merger FeatureDataTable schemaModel = record is FeatureDataRow ? (record as FeatureDataRow).Table : createModelFromFeature(record, factory); MergeSchema(schemaModel); Int32 sourceCount = schemaModel.Columns.Count; Int32 targetCount = _targetDataTable.Columns.Count; if (targetCount != sourceCount) { _columnMap = generateColumnMapper(schemaModel); return; } for (Int32 i = 0; i < _targetDataTable.Columns.Count; i++) { //jd: this seems to fix an issue where the columns would be mapped incorrectly.. //however I think there is another issue where the destination table is one column short.. string columnName = _targetDataTable.Columns[i].ColumnName; if (_targetDataTable.Columns[i].Ordinal != schemaModel.Columns[columnName].Ordinal) { _columnMap = generateColumnMapper(schemaModel); return; } //jd:the following test is always true //if (_targetDataTable.Columns[i].Ordinal != schemaModel.Columns[i].Ordinal) //{ // _columnMap = generateColumnMapper(schemaModel); // return; //} } } _columnMap = generateDefaultColumnMapper(); }
protected override bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value) { var relationList = relations.ToList(); if (relationList.All(x => x.ChildTable == "core_subscription" && x.ChildColumn == "object" && x.ParentTable.StartsWith("projects_"))) { var valParts = Convert.ToString(value).Split('_'); var projectId = columnMapper.GetMapping("projects_projects", "id", valParts[2]); if (projectId == null) return false; var firstRelation = relationList.First(x => x.ParentTable != "projects_projects"); var entityId = columnMapper.GetMapping(firstRelation.ParentTable, firstRelation.ParentColumn, valParts[1]); if (entityId == null) return false; value = string.Format("{0}_{1}_{2}", valParts[0], entityId, projectId); return true; } if (relationList.All(x => x.ChildTable == "core_subscription" && x.ChildColumn == "recipient") || relationList.All(x => x.ChildTable == "core_subscriptionmethod" && x.ChildColumn == "recipient") || relationList.All(x => x.ChildTable == "core_acl" && x.ChildColumn == "subject")) { var strVal = Convert.ToString(value); if (Helpers.IsEmptyOrSystemUser(strVal) || Helpers.IsEmptyOrSystemGroup(strVal)) return true; foreach (var relation in relationList) { var mapping = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, value); if (mapping != null) { value = mapping; return true; } } return false; } return base.TryPrepareValue(connection, columnMapper, table, columnName, relationList, ref value); }
private ColumnMapper generateColumnMapper(FeatureDataTable schemaModel) { Int32 targetCount = _targetDataTable.Columns.Count; Int32 sourceCount = schemaModel.Columns.Count; ColumnMapper mapper = new ColumnMapper(sourceCount, targetCount); foreach (DataColumn column in schemaModel.Columns) { int trgtOrdinal = _targetDataTable.Columns[column.ColumnName].Ordinal; if (trgtOrdinal == -1 && (_mergeAction & SchemaMergeAction.CaseInsensitive) != SchemaMergeAction.None) { foreach (DataColumn c in _targetDataTable.Columns) { if (String.Compare(c.ColumnName, column.ColumnName, StringComparison.CurrentCultureIgnoreCase) == 0) { trgtOrdinal = c.Ordinal; break; } } } mapper.AddMapping(column.Ordinal, trgtOrdinal); } return mapper; }
protected virtual bool TryPrepareValue(IDbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value) { if (columnName.Equals(table.TenantColumn, StringComparison.OrdinalIgnoreCase)) { int tenantMapping = columnMapper.GetTenantMapping(); if (tenantMapping < 1) return false; value = tenantMapping; return true; } if (table.UserIDColumns.Any(x => columnName.Equals(x, StringComparison.OrdinalIgnoreCase))) { var strVal = Convert.ToString(value); string userMapping = columnMapper.GetUserMapping(strVal); if (userMapping == null) return Helpers.IsEmptyOrSystemUser(strVal); value = userMapping; return true; } var mapping = columnMapper.GetMapping(table.Name, columnName, value); if (mapping != null) value = mapping; return true; }
public DatabaseConfigSqlRepository(string dbPath) : base(dbPath) { ColumnMapper.SetMapper <DatabaseConfigSqlEntity>(); }