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);
 }
Example #3
0
 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);
 }
Example #12
0
        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);
        }
Example #13
0
            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;
                }
            }
Example #14
0
        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;
                }
            }
Example #16
0
 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));
        }
Example #18
0
 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("/"));
 }
Example #19
0
 /// <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
        }
Example #21
0
 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);
        }
Example #23
0
 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);
        }
Example #25
0
 public virtual Stream PrepareData(string key, Stream stream, ColumnMapper columnMapper)
 {
     return(stream);
 }
Example #26
0
        /// <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);
        }
Example #28
0
        // 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;
        }
Example #29
0
 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);
        }
Example #35
0
        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);
 }
Example #41
0
        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);
        }
Example #43
0
        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;
        }
Example #45
0
 public DatabaseConfigSqlRepository(string dbPath) : base(dbPath)
 {
     ColumnMapper.SetMapper <DatabaseConfigSqlEntity>();
 }