Example #1
0
        public static void InitStatusDatabase(string connectString)
        {
            using (var conn = new MySqlConnection(connectString))
            {
                try
                {
                    conn.Execute("CREATE DATABASE IF NOT EXISTS `dotnetspider` DEFAULT CHARACTER SET utf8;");

                    var dbEngine = MySqlEngine.IsSupportToku(conn) ? "TokuDB" : "InnoDB";
                    var sql      = $"CREATE TABLE IF NOT EXISTS `dotnetspider`.`status` (`identity` varchar(120) NOT NULL,`node` varchar(120) NOT NULL,`logged` timestamp NULL DEFAULT NULL,`status` varchar(20) DEFAULT NULL,`thread` int(13),`left` bigint(20),`success` bigint(20),`error` bigint(20),`total` bigint(20),`avgdownloadspeed` float,`avgprocessorspeed` bigint(20),`avgpipelinespeed` bigint(20), PRIMARY KEY (`identity`,`node`)) ENGINE={dbEngine} DEFAULT CHARSET=utf8;";
                    conn.Execute(sql);

                    var trigger = conn.QueryFirstOrDefault($"SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME =  'status_AFTER_UPDATE' and EVENT_OBJECT_SCHEMA='dotnetspider' and EVENT_OBJECT_TABLE='status'");
                    if (trigger == null)
                    {
                        var timeTrigger = $"CREATE TRIGGER `dotnetspider`.`status_AFTER_UPDATE` BEFORE UPDATE ON `status` FOR EACH ROW BEGIN set NEW.logged = NOW(); END";
                        conn.Execute(timeTrigger);
                    }
                }
                catch (Exception e)
                {
                    Logger.MyLog("Prepare dotnetspider.status failed.", LogLevel.Error, e);
                    throw e;
                }
            }
        }
 private string GenerateSql(MySqlEngine engine, BulkCopyOptions options, Func<string> statementGenerator)
 {
     switch (engine)
     {
         case MySqlEngine.InnoDB:
             return GenerateInnoDbOptimizations(options, statementGenerator);
         case MySqlEngine.MyISAM:
             return statementGenerator();
         default:
             return statementGenerator();
     }
 }
Example #3
0
        public DbMonitor(string identity)
        {
            Identity = identity;

            NetworkCenter.Current.Execute("dm", () =>
            {
                using (var conn = new MySqlConnection(Config.ConnectString))
                {
                    try
                    {
                        conn.Execute("CREATE DATABASE IF NOT EXISTS `dotnetspider` DEFAULT CHARACTER SET utf8;");

                        var dbEngine = MySqlEngine.IsSupportToku(conn) ? "TokuDB" : "InnoDB";
                        var sql      = $"CREATE TABLE IF NOT EXISTS `dotnetspider`.`status` (`identity` varchar(120) NOT NULL,`node` varchar(120) NOT NULL,`logged` timestamp NULL DEFAULT NULL,`status` varchar(20) DEFAULT NULL,`thread` int(13),`left` bigint(20),`success` bigint(20),`error` bigint(20),`total` bigint(20),`avgdownloadspeed` float,`avgprocessorspeed` bigint(20),`avgpipelinespeed` bigint(20), PRIMARY KEY (`identity`,`node`)) ENGINE={dbEngine} DEFAULT CHARSET=utf8;";
                        conn.Execute(sql);


                        var trigger = conn.QueryFirstOrDefault($"SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME =  'status_AFTER_UPDATE' and EVENT_OBJECT_SCHEMA='dotnetspider' and EVENT_OBJECT_TABLE='status'");
                        if (trigger == null)
                        {
                            var timeTrigger = $"CREATE TRIGGER `dotnetspider`.`status_AFTER_UPDATE` BEFORE UPDATE ON `status` FOR EACH ROW BEGIN set NEW.logged = NOW(); END";
                            conn.Execute(timeTrigger);
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.MyLog("Prepare dotnetspider.status failed.", LogLevel.Error, e);
                        throw e;
                    }

                    var insertSql = $"insert ignore into dotnetspider.status (`identity`, `node`, `logged`, `status`, `thread`, `left`, `success`, `error`, `total`, `avgdownloadspeed`, `avgprocessorspeed`, `avgpipelinespeed`) values (@identity, @node, current_timestamp, @status, @thread, @left, @success, @error, @total, @avgdownloadspeed, @avgprocessorspeed, @avgpipelinespeed);";
                    conn.Execute(insertSql,
                                 new
                    {
                        identity          = identity,
                        node              = NodeId.Id,
                        status            = "INIT",
                        left              = 0,
                        total             = 0,
                        success           = 0,
                        error             = 0,
                        avgDownloadSpeed  = 0,
                        avgProcessorSpeed = 0,
                        avgPipelineSpeed  = 0,
                        thread            = 0
                    });
                }
            });
        }
Example #4
0
        protected override sealed IDataStoreEngine GetEngine()
        {
            try
            {
                var connectionForParsing = new MySqlConnectionStringBuilder(ConnectionString);
                _ = Log.InfoAsync($"{nameof(MySqlDataContext)} connecting to {connectionForParsing.Database}");
            }
            catch
            {
                _ = Log.InfoAsync($"{nameof(MySqlDataContext)} failed to parse {ConnectionString}");
            }
            var engine = new MySqlEngine(ConnectionString);

            return(engine);
        }
Example #5
0
        public static LolipopEngine CreateNewEngine(DataEngine engine)
        {
            LolipopEngine en = null;

            switch (engine)
            {
            case DataEngine.MySqlDataEngine:
                en = new MySqlEngine();
                break;

            case DataEngine.SqlDataEngine:
                en = new SqlEngine();
                break;
            }

            return(en);
        }
Example #6
0
        protected override string GetCreateTableSql(EntityDbMetadata metadata)
        {
            StringBuilder builder    = new StringBuilder($"CREATE TABLE IF NOT EXISTS `{metadata.Table.Database }`.`{metadata.Table.Name}` (");
            string        columNames = string.Join(", ", metadata.Columns.Select(p => $"`{p.Name}` {GetDataTypeSql(p)} "));

            builder.Append(columNames);
            builder.Append(",`cdate` timestamp NULL DEFAULT CURRENT_TIMESTAMP");
            if (metadata.Table.Primary.ToLower() == Core.Infrastructure.Environment.IdColumn)
            {
                builder.Append($", `{Core.Infrastructure.Environment.IdColumn}` bigint AUTO_INCREMENT");
            }

            if (metadata.Table.Indexs != null)
            {
                foreach (var index in metadata.Table.Indexs)
                {
                    var    columns         = index.Split(',');
                    string name            = string.Join("_", columns.Select(c => c));
                    string indexColumNames = string.Join(", ", columns.Select(c => $"`{c}`"));
                    builder.Append($", KEY `index_{name}` ({indexColumNames.Substring(0, indexColumNames.Length)})");
                }
            }
            if (metadata.Table.Uniques != null)
            {
                foreach (var unique in metadata.Table.Uniques)
                {
                    var    columns          = unique.Split(',');
                    string name             = string.Join("_", columns.Select(c => c));
                    string uniqueColumNames = string.Join(", ", columns.Select(c => $"`{c}`"));
                    builder.Append($", UNIQUE KEY `unique_{name}` ({uniqueColumNames.Substring(0, uniqueColumNames.Length)})");
                }
            }
            builder.Append($", PRIMARY KEY ({ metadata.Table.Primary})");
            using (var conn = new MySqlConnection(ConnectString))
            {
                var dbEngine = MySqlEngine.IsSupportToku(conn) ? "TokuDB" : "InnoDB";
                builder.Append($") ENGINE={dbEngine} AUTO_INCREMENT=1  DEFAULT CHARSET=utf8");
                string sql = builder.ToString();
                return(sql);
            }
        }
 private string CreateInsertBatchText(string insertHeader, List <string> rows, MySqlEngine engine)
 {
     return(GenerateSql(engine, Options.BulkCopyOptions, () => insertHeader + " " + string.Join(",", rows) + ";"));
     //return new StringBuilder(insertHeader)
     //    .Append(string.Join(",", rows))
     //    .Append(";")
     //    .AppendLine("COMMIT;")
     //    .ToString();
 }
        // MySql only.
        // TODO: Fix for MSSql & SQLite
        public async Task <bool> CreateAsync <TEntity>(MySqlEngine dbEngine = MySqlEngine.MyISAM, bool replaceTable = false) where TEntity : Entity, new()
        {
            if (Type != DatabaseType.MySql)
            {
                return(false);
            }

            // Check if table exists or is allowed to be replaced.
            if (!await ExistsAsync <TEntity>() || replaceTable)
            {
                // Exclude foreign key and non db related properties.
                var properties = typeof(TEntity).GetReadWriteProperties();
                var fields     = new Dictionary <string, PropertyInfo>();
                var query      = new QueryBuilder <TEntity>(connectorQuery, properties);
                var entity     = new TEntity();

                // Key: GroupStartIndex, Value: GroupCount
                var groups              = new ConcurrentDictionary <int, int>();
                var lastGroupName       = "";
                var lastGroupStartIndex = 0;

                // Get Groups
                for (var i = 0; i < properties.Length; i++)
                {
                    var group = properties[i].GetCustomAttribute <GroupAttribute>();

                    if (group != null)
                    {
                        if (group.Name == lastGroupName)
                        {
                            groups[lastGroupStartIndex] += 1;
                        }
                        else
                        {
                            lastGroupName       = group.Name;
                            lastGroupStartIndex = i;

                            groups.TryAdd(lastGroupStartIndex, 1);
                        }
                    }
                }

                for (var i = 0; i < properties.Length; i++)
                {
                    var groupCount = 0;

                    if (!properties[i].PropertyType.IsArray)
                    {
                        fields.Add(properties[i].GetName(), properties[i]);
                    }
                    else
                    {
                        if (groups.TryGetValue(i, out groupCount))
                        {
                            var arr = properties[i].GetValue(Activator.CreateInstance(typeof(TEntity))) as Array;

                            for (var k = 1; k <= arr.Length; k++)
                            {
                                for (var j = 0; j < groupCount; j++)
                                {
                                    fields.Add(properties[i + j].GetName() + k, properties[i + j]);
                                }
                            }

                            i += groupCount - 1;
                        }
                        else
                        {
                            var arr = (query.PropertyGetter[i](entity) as Array);

                            for (var j = 1; j <= arr.Length; j++)
                            {
                                fields.Add(properties[i].GetName() + j, properties[i]);
                            }
                        }
                    }
                }

                return(await ExecuteAsync(query.BuildTableCreate(fields, dbEngine)));
            }

            return(false);
        }
 public bool Create <TEntity>(MySqlEngine dbEngine = MySqlEngine.MyISAM, bool replaceTable = false) where TEntity : Entity, new()
 {
     return(CreateAsync <TEntity>(dbEngine, replaceTable).GetAwaiter().GetResult());
 }
Example #10
0
        internal string BuildTableCreate(Dictionary <string, PropertyInfo> fields, MySqlEngine dbEngine)
        {
            var pluralized = Helper.Pluralize <T>();

            sqlQuery.Append($"DROP TABLE IF EXISTS `{pluralized}`;");
            sqlQuery.Append($"CREATE TABLE `{pluralized}` (");

            var primaryKeys = fields.Values.Where(p => p.HasAttribute <PrimaryKeyAttribute>()).ToArray();

            foreach (var f in fields)
            {
                var isAutoIncrement = f.Value.HasAttribute <AutoIncrementAttribute>();
                var fieldOptions    = f.Value.GetCustomAttribute <FieldAttribute>();
                var fieldType       = f.Value.PropertyType.IsArray ? f.Value.PropertyType.GetElementType() : f.Value.PropertyType;
                var fieldSize       = fieldOptions?.Size ?? Helper.GetDefaultFieldSize(fieldType);
                var defaultValue    = fieldOptions?.Default ?? Helper.GetDefault(fieldType);
                var nullAllowed     = fieldOptions?.Null ?? false;
                var typeDefinition  = "";

                switch (fieldType.Name)
                {
                case "Boolean":
                    typeDefinition = $"tinyint({fieldSize})";
                    break;

                case "SByte":
                    typeDefinition = $"tinyint({fieldSize})";
                    break;

                case "Byte":
                    typeDefinition = $"tinyint({fieldSize}) unsigned";
                    break;

                case "Int16":
                    typeDefinition = $"smallint({fieldSize})";
                    break;

                case "UInt16":
                    typeDefinition = $"smallint({fieldSize}) unsigned";
                    break;

                case "Int32":
                    typeDefinition = $"int({fieldSize})";
                    break;

                case "UInt32":
                    typeDefinition = $"int({fieldSize}) unsigned";
                    break;

                case "Int64":
                    typeDefinition = $"bigint({fieldSize})";
                    break;

                case "UInt64":
                    typeDefinition = $"bigint({fieldSize}) unsigned";
                    break;

                case "Single":
                    typeDefinition = $"float({fieldSize})";
                    break;

                case "Double":
                    typeDefinition = $"double({fieldSize})";
                    break;

                case "String":
                    nullAllowed = true;

                    if (fieldSize <= 255)
                    {
                        typeDefinition = $"varchar({fieldSize})";
                    }
                    else
                    {
                        typeDefinition = "text(0)";
                    }
                    break;

                default:
                    break;
                }

                if (!nullAllowed)
                {
                    typeDefinition += " NOT NULL";
                }

                typeDefinition += $" DEFAULT '{defaultValue}'";

                if (isAutoIncrement)
                {
                    typeDefinition += " AUTO_INCREMENT";
                }

                sqlQuery.Append($"  `{f.Key}` {typeDefinition},");
            }

            if (primaryKeys.Length > 0)
            {
                sqlQuery.Append("PRIMARY KEY (");
            }

            for (var i = 0; i < primaryKeys.Length; i++)
            {
                if (i == primaryKeys.Length - 1)
                {
                    sqlQuery.Append($"`{primaryKeys[i].Name}`)");
                }
                else
                {
                    sqlQuery.Append($"`{primaryKeys[i].Name}`,");
                }
            }

            sqlQuery.Append($") ENGINE={Enum.GetName(typeof(MySqlEngine), dbEngine)} DEFAULT CHARSET=utf8;");
            sqlQuery.Replace("', ),", "'),");
            sqlQuery.Replace("', );", "');");
            sqlQuery.Replace("',)", "')");

            return(sqlQuery.ToString());
        }
 private string CreateUpdateBatchText(StringBuilder updateSql, MySqlEngine engine)
 {
     return GenerateSql(engine, Options.BulkCopyOptions, () => updateSql.ToString());
 }
Example #12
0
 public bool Create <TEntity>(MySqlEngine dbEngine = MySqlEngine.MyISAM, bool replaceTable = false) where TEntity : Entity, new()
 {
     return(RunSync(() => CreateAsync <TEntity>(dbEngine, replaceTable)));
 }