Пример #1
0
        public void Convert_ToFloat(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <float>(input);

            Assert.IsType <float>(o1);
            Assert.Equal((float)12.177, o1);
        }
Пример #2
0
        public void Convert_ToInt16(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <short>(input);

            Assert.IsType <short>(o1);
            Assert.Equal((short)12, o1);
        }
Пример #3
0
        public void Convert_ToDouble(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <double>(input);

            Assert.IsType <double>(o1);
            Assert.Equal((double)12.177, o1);
        }
Пример #4
0
        public void Convert_ToInt64(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <Int64>(input);

            Assert.IsType <Int64>(o1);
            Assert.Equal((Int64)12, o1);
        }
Пример #5
0
        public void Convert_ToChar(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <char>(input);

            Assert.IsType <char>(o1);
            Assert.Equal('a', o1);
        }
Пример #6
0
        public void Convert_ToDecimal_Invariant(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <decimal>(input);

            Assert.IsType <decimal>(o1);
            Assert.Equal((decimal)12.177, o1);
        }
Пример #7
0
        public void Convert_ToUInt32(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <UInt32>(input);

            Assert.IsType <UInt32>(o1);
            Assert.Equal((UInt32)12, o1);
        }
Пример #8
0
        public void Convert_ToGuid(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <Guid>(input);

            Assert.IsType <Guid>(o1);
            Assert.Equal(new Guid("ddb67ac3-89df-430e-ad65-cbe691d237d8"), o1);
        }
Пример #9
0
        public void Convert_ToBoolean_False(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <bool>(input);

            Assert.IsType <bool>(o1);
            Assert.False(o1);
        }
Пример #10
0
        public void Convert_ToSByte(object input)
        {
            var o1 = SyncTypeConverter.TryConvertTo <sbyte>(input);

            Assert.IsType <sbyte>(o1);
            Assert.Equal((sbyte)12, o1);
        }
Пример #11
0
        public void Convert_ToByteArray(object input)
        {
            var o1       = SyncTypeConverter.TryConvertTo <byte[]>(input);
            var expected = BitConverter.GetBytes((dynamic)input);


            Assert.Equal(expected, o1);
        }
Пример #12
0
        public void Convert_ToDateTime(object input)
        {
            var cultureInfo = CultureInfo.GetCultureInfo("fr-FR");
            var o1          = SyncTypeConverter.TryConvertTo <DateTime>(input, cultureInfo);

            Assert.IsType <DateTime>(o1);
            Assert.Equal(new DateTime(2020, 02, 10), o1);
        }
Пример #13
0
        public void Convert_Byte_ArrayToGuid()
        {
            var bytearray = new Guid("ddb67ac3-89df-430e-ad65-cbe691d237d8").ToByteArray();

            var o1 = SyncTypeConverter.TryConvertTo <Guid>(bytearray);

            Assert.IsType <Guid>(o1);
            Assert.Equal(new Guid("ddb67ac3-89df-430e-ad65-cbe691d237d8"), o1);
        }
Пример #14
0
        public void Convert_ToTimeSpan(object input)
        {
            TimeSpan ts = new TimeSpan(100000);

            var o1 = SyncTypeConverter.TryConvertTo <TimeSpan>(input);

            Assert.IsType <TimeSpan>(o1);
            Assert.Equal(ts, o1);
        }
Пример #15
0
        public async Task <List <ScopeInfo> > GetAllClientScopesAsync(string scopeName, DbConnection connection, DbTransaction transaction)
        {
            List <ScopeInfo> scopes = new List <ScopeInfo>();

            var commandText =
                $@"SELECT sync_scope_id
                           , sync_scope_name
                           , sync_scope_schema
                           , sync_scope_setup
                           , sync_scope_version
                           , scope_last_sync
                           , scope_last_server_sync_timestamp
                           , scope_last_sync_timestamp
                           , scope_last_sync_duration
                    FROM  {scopeTableName.Quoted().ToString()}
                    WHERE sync_scope_name = @sync_scope_name";

            using (var command = new MySqlCommand(commandText, (MySqlConnection)connection, (MySqlTransaction)transaction))
            {
                var p = command.CreateParameter();
                p.ParameterName = "@sync_scope_name";
                p.Value         = scopeName;
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                using (DbDataReader reader = await command.ExecuteReaderAsync().ConfigureAwait(false))
                {
                    if (reader.HasRows)
                    {
                        // read only the first one
                        while (reader.Read())
                        {
                            var scopeInfo = new ScopeInfo();
                            scopeInfo.Name                    = reader["sync_scope_name"] as String;
                            scopeInfo.Schema                  = reader["sync_scope_schema"] == DBNull.Value ? null : JsonConvert.DeserializeObject <SyncSet>((string)reader["sync_scope_schema"]);
                            scopeInfo.Setup                   = reader["sync_scope_setup"] == DBNull.Value ? null : JsonConvert.DeserializeObject <SyncSetup>((string)reader["sync_scope_setup"]);
                            scopeInfo.Version                 = reader["sync_scope_version"] as string;
                            scopeInfo.Id                      = SyncTypeConverter.TryConvertTo <Guid>(reader["sync_scope_id"]);
                            scopeInfo.LastSync                = reader["scope_last_sync"] != DBNull.Value ? (DateTime?)reader["scope_last_sync"] : null;
                            scopeInfo.LastSyncDuration        = reader["scope_last_sync_duration"] != DBNull.Value ? (long)reader["scope_last_sync_duration"] : 0L;
                            scopeInfo.LastServerSyncTimestamp = reader["scope_last_server_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_server_sync_timestamp"] : 0L;
                            scopeInfo.LastSyncTimestamp       = reader["scope_last_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_sync_timestamp"] : 0L;
                            scopes.Add(scopeInfo);
                        }
                    }
                }

                return(scopes);
            }
        }
Пример #16
0
        public void Convert_ToDouble_WithNfi(object input)
        {
            var cultureInfo = CultureInfo.GetCultureInfo("fr-FR");

            var o1 = SyncTypeConverter.TryConvertTo <double>(input, cultureInfo);

            Assert.IsType <double>(o1);
            Assert.Equal((double)12.177, o1);

            var o2 = SyncTypeConverter.TryConvertTo <double>(input, cultureInfo);

            Assert.IsType <double>(o2);
            Assert.Equal((double)12.177, o2);
        }
Пример #17
0
        public void Convert_ToFloat_OtherCulture(object input)
        {
            var cultureInfo = CultureInfo.GetCultureInfo("en-US");

            var o1 = SyncTypeConverter.TryConvertTo <float>(input, cultureInfo);

            Assert.IsType <float>(o1);
            Assert.Equal((float)12.177, o1);

            SyncGlobalization.DataSourceNumberDecimalSeparator = ",";
            var o2 = SyncTypeConverter.TryConvertTo <float>(input);

            Assert.IsType <float>(o2);
            Assert.Equal((float)12.177, o2);
            SyncGlobalization.DataSourceNumberDecimalSeparator = CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator;
        }
Пример #18
0
        public void Convert_Base64String_ToByteArray()
        {
            string s = "I'm a drummer";

            byte[] sByt    = Encoding.UTF8.GetBytes(s);
            string sBase64 = Convert.ToBase64String(sByt);

            var o1 = SyncTypeConverter.TryConvertTo <byte[]>(sBase64);

            Assert.IsType <byte[]>(o1);
            Assert.Equal(sByt, o1);

            var b = Encoding.UTF8.GetString(o1);

            Assert.Equal(s, b);
        }
Пример #19
0
        /// <summary>
        /// Set a parameter value
        /// </summary>
        public static void SetParameterValue(DbCommand command, string parameterName, object value)
        {
            var parameter = GetParameter(command, parameterName);

            if (parameter == null)
            {
                return;
            }

            if (value == null || value == DBNull.Value)
            {
                parameter.Value = DBNull.Value;
            }
            else
            {
                parameter.Value = SyncTypeConverter.TryConvertFromDbType(value, parameter.DbType);
            }
        }
Пример #20
0
        public async Task <List <ServerHistoryScopeInfo> > GetAllServerHistoryScopesAsync(string scopeName, DbConnection connection, DbTransaction transaction)
        {
            var tableName = $"{scopeTableName.Unquoted().Normalized().ToString()}_history";
            List <ServerHistoryScopeInfo> scopes = new List <ServerHistoryScopeInfo>();

            var commandText =
                $@"SELECT  sync_scope_id
                           , sync_scope_name
                           , scope_last_sync_timestamp
                           , scope_last_sync_duration
                           , scope_last_sync           
                    FROM  `{tableName}`
                    WHERE sync_scope_name = @sync_scope_name";

            using (var command = new MySqlCommand(commandText, (MySqlConnection)connection, (MySqlTransaction)transaction))
            {
                var p = command.CreateParameter();
                p.ParameterName = "@sync_scope_name";
                p.Value         = scopeName;
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                using (DbDataReader reader = await command.ExecuteReaderAsync().ConfigureAwait(false))
                {
                    if (reader.HasRows)
                    {
                        // read only the first one
                        while (reader.Read())
                        {
                            var serverScopeInfo = new ServerHistoryScopeInfo();
                            serverScopeInfo.Id                = SyncTypeConverter.TryConvertTo <Guid>(reader["sync_scope_id"]);
                            serverScopeInfo.Name              = reader["sync_scope_name"] as string;
                            serverScopeInfo.LastSync          = reader["scope_last_sync"] != DBNull.Value ? (DateTime?)reader["scope_last_sync"] : null;
                            serverScopeInfo.LastSyncDuration  = reader["scope_last_sync_duration"] != DBNull.Value ? (long)reader["scope_last_sync_duration"] : 0;
                            serverScopeInfo.LastSyncTimestamp = reader["scope_last_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_sync_timestamp"] : 0;
                            scopes.Add(serverScopeInfo);
                        }
                    }
                }

                return(scopes);
            }
        }
Пример #21
0
        /// <summary>
        /// Set a parameter value
        /// </summary>
        public static void SetParameterValue(DbCommand command, string parameterName, object value)
        {
            var parameter = GetParameter(command, parameterName);

            if (parameter == null)
            {
                return;
            }

            if (value != null && value != DBNull.Value)
            {
                var columnType = parameter.DbType;
                var valueType  = value.GetType();

                try
                {
                    if (columnType == DbType.Guid && valueType != typeof(Guid) && (value as string) != null)
                    {
                        value = new Guid(value.ToString());
                    }
                    else if (columnType == DbType.Guid && valueType != typeof(Guid) && value.GetType() == typeof(byte[]))
                    {
                        value = new Guid((byte[])value);
                    }
                    else if (columnType == DbType.Int32 && valueType != typeof(int))
                    {
                        value = Convert.ToInt32(value);
                    }
                    else if (columnType == DbType.UInt32 && valueType != typeof(uint))
                    {
                        value = Convert.ToUInt32(value);
                    }
                    else if (columnType == DbType.UInt16 && valueType != typeof(short))
                    {
                        value = Convert.ToInt16(value);
                    }
                    else if (columnType == DbType.UInt16 && valueType != typeof(ushort))
                    {
                        value = Convert.ToUInt16(value);
                    }
                    else if (columnType == DbType.Int64 && valueType != typeof(long))
                    {
                        value = Convert.ToInt64(value);
                    }
                    else if (columnType == DbType.UInt64 && valueType != typeof(ulong))
                    {
                        value = Convert.ToUInt64(value);
                    }
                    else if (columnType == DbType.Byte && valueType != typeof(byte))
                    {
                        value = Convert.ToByte(value);
                    }
                    else if (columnType == DbType.Currency && valueType != typeof(Decimal))
                    {
                        value = Convert.ToDecimal(value);
                    }
                    else if (columnType == DbType.DateTime && valueType != typeof(DateTime))
                    {
                        value = Convert.ToDateTime(value);
                    }
                    else if (columnType == DbType.DateTime2 && valueType != typeof(DateTime))
                    {
                        value = Convert.ToDateTime(value);
                    }
                    else if (columnType == DbType.DateTimeOffset && valueType != typeof(DateTimeOffset))
                    {
                        value = SyncTypeConverter.TryConvertTo <DateTimeOffset>(value);
                    }
                    else if (columnType == DbType.Decimal && valueType != typeof(decimal))
                    {
                        value = Convert.ToDecimal(value);
                    }
                    else if (columnType == DbType.Double && valueType != typeof(double))
                    {
                        value = Convert.ToDouble(value);
                    }
                    else if (columnType == DbType.SByte && valueType != typeof(sbyte))
                    {
                        value = Convert.ToSByte(value);
                    }
                    else if (columnType == DbType.VarNumeric && valueType != typeof(float))
                    {
                        value = Convert.ToSingle(value);
                    }
                    else if (columnType == DbType.String && valueType != typeof(string))
                    {
                        value = Convert.ToString(value);
                    }
                    else if (columnType == DbType.StringFixedLength && valueType != typeof(string))
                    {
                        value = Convert.ToString(value);
                    }
                    else if (columnType == DbType.AnsiString && valueType != typeof(string))
                    {
                        value = Convert.ToString(value);
                    }
                    else if (columnType == DbType.AnsiStringFixedLength && valueType != typeof(string))
                    {
                        value = Convert.ToString(value);
                    }
                    else if (columnType == DbType.Boolean && valueType != typeof(bool))
                    {
                        value = Convert.ToBoolean(value);
                    }
                }
                catch
                {
                    // if execption, just try to set the value, directly
                }
            }

            parameter.Value = value;
        }
        public async Task <ServerHistoryScopeInfo> InsertOrUpdateServerHistoryScopeInfoAsync(ServerHistoryScopeInfo serverHistoryScopeInfo)
        {
            bool alreadyOpened = connection.State == ConnectionState.Open;
            bool exist;
            var  tableName = $"{scopeTableName.Unquoted().Normalized().ToString()}_history";

            try
            {
                using (var command = connection.CreateCommand())
                {
                    if (transaction != null)
                    {
                        command.Transaction = transaction;
                    }

                    if (!alreadyOpened)
                    {
                        await connection.OpenAsync().ConfigureAwait(false);
                    }

                    command.CommandText = $@"Select count(*) from `{tableName}` where sync_scope_id = @sync_scope_id";

                    var p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_id";
                    p.Value         = serverHistoryScopeInfo.Id;
                    p.DbType        = DbType.Guid;
                    command.Parameters.Add(p);

                    exist = ((long)await command.ExecuteScalarAsync().ConfigureAwait(false)) > 0;
                }

                string stmtText = exist
                    ? $"Update `{tableName}` set sync_scope_name=@sync_scope_name, scope_last_sync_timestamp=@scope_last_sync_timestamp, scope_last_sync=@scope_last_sync, scope_last_sync_duration=@scope_last_sync_duration where sync_scope_id=@sync_scope_id"
                    : $"Insert into `{tableName}` (sync_scope_id, sync_scope_name, scope_last_sync_timestamp, scope_last_sync, scope_last_sync_duration) values (@sync_scope_id, @sync_scope_name, @scope_last_sync_timestamp, @scope_last_sync, @scope_last_sync_duration)";

                using (var command = connection.CreateCommand())
                {
                    if (transaction != null)
                    {
                        command.Transaction = transaction;
                    }

                    command.CommandText = stmtText;

                    var p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_name";
                    p.Value         = serverHistoryScopeInfo.Name;
                    p.DbType        = DbType.String;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@scope_last_sync_timestamp";
                    p.Value         = serverHistoryScopeInfo.LastSyncTimestamp;
                    p.DbType        = DbType.Int64;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@scope_last_sync";
                    p.Value         = serverHistoryScopeInfo.LastSync.HasValue ? (object)serverHistoryScopeInfo.LastSync.Value : DBNull.Value;
                    p.DbType        = DbType.DateTime;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@scope_last_sync_duration";
                    p.Value         = serverHistoryScopeInfo.LastSyncDuration;
                    p.DbType        = DbType.Int64;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_id";
                    p.Value         = serverHistoryScopeInfo.Id;
                    p.DbType        = DbType.Guid;
                    command.Parameters.Add(p);

                    using (DbDataReader reader = command.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                serverHistoryScopeInfo.Id                = SyncTypeConverter.TryConvertTo <Guid>(reader["sync_scope_id"]);
                                serverHistoryScopeInfo.Name              = reader["sync_scope_name"] as string;
                                serverHistoryScopeInfo.LastSyncDuration  = reader["scope_last_sync_duration"] != DBNull.Value ? (long)reader["scope_last_sync_duration"] : 0L;
                                serverHistoryScopeInfo.LastSyncTimestamp = reader["scope_last_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_sync_timestamp"] : 0L;
                                serverHistoryScopeInfo.LastSync          = reader["scope_last_sync"] != DBNull.Value ? (DateTime?)reader["scope_last_sync"] : null;
                            }
                        }
                    }

                    return(serverHistoryScopeInfo);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Error during InsertOrUpdateServerHistoryScopeInfoAsync : {ex}");
                throw;
            }
            finally
            {
                if (!alreadyOpened && connection.State != ConnectionState.Closed)
                {
                    connection.Close();
                }
            }
        }
        public async Task <ScopeInfo> InsertOrUpdateClientScopeInfoAsync(ScopeInfo scopeInfo)
        {
            bool alreadyOpened = connection.State == ConnectionState.Open;
            bool exist;

            try
            {
                using (var command = connection.CreateCommand())
                {
                    if (transaction != null)
                    {
                        command.Transaction = transaction;
                    }

                    if (!alreadyOpened)
                    {
                        await connection.OpenAsync().ConfigureAwait(false);
                    }

                    command.CommandText = $@"Select count(*) from {scopeTableName.Quoted().ToString()} where sync_scope_id = @sync_scope_id";

                    var p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_id";
                    p.Value         = scopeInfo.Id.ToString();
                    p.DbType        = DbType.String;
                    command.Parameters.Add(p);

                    exist = ((long)await command.ExecuteScalarAsync().ConfigureAwait(false)) > 0;
                }

                string stmtText = exist
                    ? $"Update {scopeTableName.Quoted().ToString()} set sync_scope_name=@sync_scope_name, sync_scope_schema=@sync_scope_schema,  sync_scope_setup=@sync_scope_setup, sync_scope_version=@sync_scope_version, scope_last_sync=@scope_last_sync, scope_last_server_sync_timestamp=@scope_last_server_sync_timestamp, scope_last_sync_timestamp=@scope_last_sync_timestamp, scope_last_sync_duration=@scope_last_sync_duration  where sync_scope_id=@sync_scope_id"
                    : $"Insert into {scopeTableName.Quoted().ToString()} (sync_scope_name, sync_scope_schema, sync_scope_setup, sync_scope_version, scope_last_sync, sync_scope_id, scope_last_server_sync_timestamp, scope_last_sync_timestamp, scope_last_sync_duration) values (@sync_scope_name, @sync_scope_schema, @sync_scope_setup, @sync_scope_version, @scope_last_sync, @sync_scope_id, @scope_last_server_sync_timestamp, @scope_last_sync_timestamp, @scope_last_sync_duration)";

                using (var command = connection.CreateCommand())
                {
                    if (transaction != null)
                    {
                        command.Transaction = transaction;
                    }

                    command.CommandText = stmtText;

                    var p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_name";
                    p.Value         = scopeInfo.Name;
                    p.DbType        = DbType.String;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_schema";
                    p.Value         = scopeInfo.Schema == null ? DBNull.Value : (object)JsonConvert.SerializeObject(scopeInfo.Schema);
                    p.DbType        = DbType.String;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_setup";
                    p.Value         = scopeInfo.Setup == null ? DBNull.Value : (object)JsonConvert.SerializeObject(scopeInfo.Setup);
                    p.DbType        = DbType.String;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_version";
                    p.Value         = scopeInfo.Version;
                    p.DbType        = DbType.String;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@scope_last_sync";
                    p.Value         = scopeInfo.LastSync.HasValue ? (object)scopeInfo.LastSync.Value : DBNull.Value;
                    p.DbType        = DbType.DateTime;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@scope_last_sync_timestamp";
                    p.Value         = scopeInfo.LastSyncTimestamp;
                    p.DbType        = DbType.Int64;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@scope_last_server_sync_timestamp";
                    p.Value         = scopeInfo.LastServerSyncTimestamp;
                    p.DbType        = DbType.Int64;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@scope_last_sync_duration";
                    p.Value         = scopeInfo.LastSyncDuration;
                    p.DbType        = DbType.Int64;
                    command.Parameters.Add(p);

                    p = command.CreateParameter();
                    p.ParameterName = "@sync_scope_id";
                    p.Value         = scopeInfo.Id.ToString();
                    p.DbType        = DbType.String;
                    command.Parameters.Add(p);

                    using (DbDataReader reader = command.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                scopeInfo.Name                    = reader["sync_scope_name"] as string;
                                scopeInfo.Schema                  = reader["sync_scope_schema"] == DBNull.Value ? null : JsonConvert.DeserializeObject <SyncSet>((string)reader["sync_scope_schema"]);
                                scopeInfo.Setup                   = reader["sync_scope_setup"] == DBNull.Value ? null : JsonConvert.DeserializeObject <SyncSetup>((string)reader["sync_scope_setup"]);
                                scopeInfo.Version                 = reader["sync_scope_version"] as string;
                                scopeInfo.Id                      = SyncTypeConverter.TryConvertTo <Guid>(reader["sync_scope_id"]);
                                scopeInfo.LastSyncDuration        = reader["scope_last_sync_duration"] != DBNull.Value ? (long)reader["scope_last_sync_duration"] : 0L;
                                scopeInfo.LastServerSyncTimestamp = reader["scope_last_server_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_server_sync_timestamp"] : 0L;
                                scopeInfo.LastSyncTimestamp       = reader["scope_last_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_sync_timestamp"] : 0L;
                                scopeInfo.LastSync                = reader["scope_last_sync"] != DBNull.Value ? (DateTime?)reader["scope_last_sync"] : null;
                            }
                        }
                    }

                    return(scopeInfo);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Error during InsertOrUpdateClientScopeInfoAsync : {ex}");
                throw;
            }
            finally
            {
                if (!alreadyOpened && connection.State != ConnectionState.Closed)
                {
                    connection.Close();
                }
            }
        }
        public async Task <List <ServerHistoryScopeInfo> > GetAllServerHistoryScopesAsync(string scopeName)
        {
            var command = connection.CreateCommand();

            if (transaction != null)
            {
                command.Transaction = transaction;
            }

            bool alreadyOpened = connection.State == ConnectionState.Open;

            var tableName = $"{scopeTableName.Unquoted().Normalized().ToString()}_history";

            List <ServerHistoryScopeInfo> scopes = new List <ServerHistoryScopeInfo>();

            try
            {
                if (!alreadyOpened)
                {
                    await connection.OpenAsync().ConfigureAwait(false);
                }

                command.CommandText =
                    $@"SELECT  sync_scope_id
                           , sync_scope_name
                           , scope_last_sync_timestamp
                           , scope_last_sync_duration
                           , scope_last_sync           
                    FROM  `{tableName}`
                    WHERE sync_scope_name = @sync_scope_name";

                var p = command.CreateParameter();
                p.ParameterName = "@sync_scope_name";
                p.Value         = scopeName;
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                using (DbDataReader reader = await command.ExecuteReaderAsync().ConfigureAwait(false))
                {
                    if (reader.HasRows)
                    {
                        // read only the first one
                        while (reader.Read())
                        {
                            var serverScopeInfo = new ServerHistoryScopeInfo();
                            serverScopeInfo.Id                = SyncTypeConverter.TryConvertTo <Guid>(reader["sync_scope_id"]);
                            serverScopeInfo.Name              = reader["sync_scope_name"] as string;
                            serverScopeInfo.LastSync          = reader["scope_last_sync"] != DBNull.Value ? (DateTime?)reader["scope_last_sync"] : null;
                            serverScopeInfo.LastSyncDuration  = reader["scope_last_sync_duration"] != DBNull.Value ? (long)reader["scope_last_sync_duration"] : 0;
                            serverScopeInfo.LastSyncTimestamp = reader["scope_last_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_sync_timestamp"] : 0;
                            scopes.Add(serverScopeInfo);
                        }
                    }
                }

                return(scopes);
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Error during GetAllServerHistoryScopes : {ex}");
                throw;
            }
            finally
            {
                if (!alreadyOpened && connection.State != ConnectionState.Closed)
                {
                    connection.Close();
                }

                if (command != null)
                {
                    command.Dispose();
                }
            }
        }
Пример #25
0
        /// <summary>
        /// Executing a batch command
        /// </summary>
        public override async Task ExecuteBatchCommandAsync(DbCommand cmd, Guid senderScopeId, IEnumerable <SyncRow> applyRows, SyncTable schemaChangesTable,
                                                            SyncTable failedRows, long?lastTimestamp, DbConnection connection, DbTransaction transaction = null)
        {
            var applyRowsCount = applyRows.Count();

            if (applyRowsCount <= 0)
            {
                return;
            }

            var dataRowState = DataRowState.Unchanged;

            var records = new List <SqlDataRecord>(applyRowsCount);

            SqlMetaData[] metadatas = new SqlMetaData[schemaChangesTable.Columns.Count];

            for (int i = 0; i < schemaChangesTable.Columns.Count; i++)
            {
                metadatas[i] = GetSqlMetadaFromType(schemaChangesTable.Columns[i]);
            }

            try
            {
                foreach (var row in applyRows)
                {
                    dataRowState = row.RowState;

                    var record = new SqlDataRecord(metadatas);

                    int sqlMetadataIndex = 0;

                    for (int i = 0; i < schemaChangesTable.Columns.Count; i++)
                    {
                        var schemaColumn = schemaChangesTable.Columns[i];

                        // Get the default value
                        //var columnType = schemaColumn.GetDataType();
                        dynamic defaultValue = schemaColumn.GetDefaultValue();
                        dynamic rowValue     = row[i];

                        // metadatas don't have readonly values, so get from sqlMetadataIndex
                        var sqlMetadataType = metadatas[sqlMetadataIndex].SqlDbType;

                        if (rowValue != null)
                        {
                            var columnType = rowValue.GetType();

                            switch (sqlMetadataType)
                            {
                            case SqlDbType.BigInt:
                                if (columnType != typeof(long))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <long>(rowValue);
                                }
                                break;

                            case SqlDbType.Bit:
                                if (columnType != typeof(bool))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <bool>(rowValue);
                                }
                                break;

                            case SqlDbType.Date:
                            case SqlDbType.DateTime:
                            case SqlDbType.DateTime2:
                            case SqlDbType.SmallDateTime:
                                if (columnType != typeof(DateTime))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <DateTime>(rowValue);
                                }
                                break;

                            case SqlDbType.DateTimeOffset:
                                if (columnType != typeof(DateTimeOffset))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <DateTimeOffset>(rowValue);
                                }
                                break;

                            case SqlDbType.Decimal:
                                if (columnType != typeof(decimal))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <decimal>(rowValue);
                                }
                                break;

                            case SqlDbType.Float:
                                if (columnType != typeof(double))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <double>(rowValue);
                                }
                                break;

                            case SqlDbType.Real:
                                if (columnType != typeof(float))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <float>(rowValue);
                                }
                                break;

                            case SqlDbType.Image:
                            case SqlDbType.Binary:
                            case SqlDbType.VarBinary:
                                if (columnType != typeof(byte[]))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <byte[]>(rowValue);
                                }
                                break;

                            case SqlDbType.Variant:
                                break;

                            case SqlDbType.Int:
                                if (columnType != typeof(int))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <int>(rowValue);
                                }
                                break;

                            case SqlDbType.Money:
                            case SqlDbType.SmallMoney:
                                if (columnType != typeof(decimal))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <decimal>(rowValue);
                                }
                                break;

                            case SqlDbType.NChar:
                            case SqlDbType.NText:
                            case SqlDbType.VarChar:
                            case SqlDbType.Xml:
                            case SqlDbType.NVarChar:
                            case SqlDbType.Text:
                            case SqlDbType.Char:
                                if (columnType != typeof(string))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <string>(rowValue);
                                }
                                break;

                            case SqlDbType.SmallInt:
                                if (columnType != typeof(short))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <short>(rowValue);
                                }
                                break;

                            case SqlDbType.Time:
                                if (columnType != typeof(TimeSpan))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <TimeSpan>(rowValue);
                                }
                                break;

                            case SqlDbType.Timestamp:
                                break;

                            case SqlDbType.TinyInt:
                                if (columnType != typeof(byte))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <byte>(rowValue);
                                }
                                break;

                            case SqlDbType.Udt:
                                throw new ArgumentException($"Can't use UDT as SQL Type");

                            case SqlDbType.UniqueIdentifier:
                                if (columnType != typeof(Guid))
                                {
                                    rowValue = SyncTypeConverter.TryConvertTo <Guid>(rowValue);
                                }
                                break;
                            }
                        }

                        if (rowValue == null)
                        {
                            rowValue = DBNull.Value;
                        }

                        record.SetValue(sqlMetadataIndex, rowValue);
                        sqlMetadataIndex++;
                    }

                    records.Add(record);
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException($"Can't create a SqlRecord based on the rows we have: {ex.Message}");
            }

            ((SqlParameterCollection)cmd.Parameters)["@changeTable"].TypeName     = string.Empty;
            ((SqlParameterCollection)cmd.Parameters)["@changeTable"].Value        = records;
            ((SqlParameterCollection)cmd.Parameters)["@sync_min_timestamp"].Value = lastTimestamp.HasValue ? (object)lastTimestamp.Value : DBNull.Value;
            ((SqlParameterCollection)cmd.Parameters)["@sync_scope_id"].Value      = senderScopeId;

            bool alreadyOpened = connection.State == ConnectionState.Open;

            try
            {
                if (!alreadyOpened)
                {
                    await connection.OpenAsync().ConfigureAwait(false);
                }

                cmd.Transaction = transaction;

                using var dataReader = await cmd.ExecuteReaderAsync().ConfigureAwait(false);

                while (dataReader.Read())
                {
                    //var itemArray = new object[dataReader.FieldCount];
                    var itemArray = new object[failedRows.Columns.Count];
                    for (var i = 0; i < dataReader.FieldCount; i++)
                    {
                        var columnValueObject = dataReader.GetValue(i);
                        var columnName        = dataReader.GetName(i);

                        var columnValue = columnValueObject == DBNull.Value ? null : columnValueObject;

                        var failedColumn      = failedRows.Columns[columnName];
                        var failedIndexColumn = failedRows.Columns.IndexOf(failedColumn);
                        itemArray[failedIndexColumn] = columnValue;
                    }

                    // don't care about row state
                    // Since it will be requested by next request from GetConflict()
                    failedRows.Rows.Add(itemArray, dataRowState);
                }

                dataReader.Close();
            }
            catch (DbException ex)
            {
                Debug.WriteLine(ex.Message);
                throw;
            }
            finally
            {
                records.Clear();

                if (!alreadyOpened && connection.State != ConnectionState.Closed)
                {
                    connection.Close();
                }
            }
        }
Пример #26
0
        public async Task <ServerHistoryScopeInfo> InsertOrUpdateServerHistoryScopeInfoAsync(ServerHistoryScopeInfo serverHistoryScopeInfo, DbConnection connection, DbTransaction transaction)
        {
            var tableName   = $"{scopeTableName.Unquoted().Normalized().ToString()}_history";
            var commandText = $@"Select count(*) from `{tableName}` where sync_scope_id = @sync_scope_id";

            bool exist;

            using (var command = new MySqlCommand(commandText, (MySqlConnection)connection, (MySqlTransaction)transaction))
            {
                var p = command.CreateParameter();
                p.ParameterName = "@sync_scope_id";
                p.Value         = serverHistoryScopeInfo.Id;
                p.DbType        = DbType.Guid;
                command.Parameters.Add(p);

                exist = ((long)await command.ExecuteScalarAsync().ConfigureAwait(false)) > 0;
            }

            string stmtText = exist
                ? $"Update `{tableName}` set sync_scope_name=@sync_scope_name, scope_last_sync_timestamp=@scope_last_sync_timestamp, scope_last_sync=@scope_last_sync, scope_last_sync_duration=@scope_last_sync_duration where sync_scope_id=@sync_scope_id"
                : $"Insert into `{tableName}` (sync_scope_id, sync_scope_name, scope_last_sync_timestamp, scope_last_sync, scope_last_sync_duration) values (@sync_scope_id, @sync_scope_name, @scope_last_sync_timestamp, @scope_last_sync, @scope_last_sync_duration)";

            using (var command = new MySqlCommand(stmtText, (MySqlConnection)connection, (MySqlTransaction)transaction))
            {
                var p = command.CreateParameter();
                p.ParameterName = "@sync_scope_name";
                p.Value         = serverHistoryScopeInfo.Name;
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@scope_last_sync_timestamp";
                p.Value         = serverHistoryScopeInfo.LastSyncTimestamp;
                p.DbType        = DbType.Int64;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@scope_last_sync";
                p.Value         = serverHistoryScopeInfo.LastSync.HasValue ? (object)serverHistoryScopeInfo.LastSync.Value : DBNull.Value;
                p.DbType        = DbType.DateTime;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@scope_last_sync_duration";
                p.Value         = serverHistoryScopeInfo.LastSyncDuration;
                p.DbType        = DbType.Int64;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@sync_scope_id";
                p.Value         = serverHistoryScopeInfo.Id;
                p.DbType        = DbType.Guid;
                command.Parameters.Add(p);

                using (DbDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            serverHistoryScopeInfo.Id                = SyncTypeConverter.TryConvertTo <Guid>(reader["sync_scope_id"]);
                            serverHistoryScopeInfo.Name              = reader["sync_scope_name"] as string;
                            serverHistoryScopeInfo.LastSyncDuration  = reader["scope_last_sync_duration"] != DBNull.Value ? (long)reader["scope_last_sync_duration"] : 0L;
                            serverHistoryScopeInfo.LastSyncTimestamp = reader["scope_last_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_sync_timestamp"] : 0L;
                            serverHistoryScopeInfo.LastSync          = reader["scope_last_sync"] != DBNull.Value ? (DateTime?)reader["scope_last_sync"] : null;
                        }
                    }
                }

                return(serverHistoryScopeInfo);
            }
        }
Пример #27
0
        public async Task <ScopeInfo> InsertOrUpdateClientScopeInfoAsync(ScopeInfo scopeInfo, DbConnection connection, DbTransaction transaction)
        {
            bool exist;
            var  commandText = $@"Select count(*) from {scopeTableName.Quoted().ToString()} where sync_scope_id = @sync_scope_id";

            using (var command = new MySqlCommand(commandText, (MySqlConnection)connection, (MySqlTransaction)transaction))
            {
                var p = command.CreateParameter();
                p.ParameterName = "@sync_scope_id";
                p.Value         = scopeInfo.Id.ToString();
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                exist = ((long)await command.ExecuteScalarAsync().ConfigureAwait(false)) > 0;
            }

            string stmtText = exist
                ? $"Update {scopeTableName.Quoted().ToString()} set sync_scope_name=@sync_scope_name, sync_scope_schema=@sync_scope_schema,  sync_scope_setup=@sync_scope_setup, sync_scope_version=@sync_scope_version, scope_last_sync=@scope_last_sync, scope_last_server_sync_timestamp=@scope_last_server_sync_timestamp, scope_last_sync_timestamp=@scope_last_sync_timestamp, scope_last_sync_duration=@scope_last_sync_duration  where sync_scope_id=@sync_scope_id"
                : $"Insert into {scopeTableName.Quoted().ToString()} (sync_scope_name, sync_scope_schema, sync_scope_setup, sync_scope_version, scope_last_sync, sync_scope_id, scope_last_server_sync_timestamp, scope_last_sync_timestamp, scope_last_sync_duration) values (@sync_scope_name, @sync_scope_schema, @sync_scope_setup, @sync_scope_version, @scope_last_sync, @sync_scope_id, @scope_last_server_sync_timestamp, @scope_last_sync_timestamp, @scope_last_sync_duration)";

            using (var command = new MySqlCommand(stmtText, (MySqlConnection)connection, (MySqlTransaction)transaction))
            {
                var p = command.CreateParameter();
                p.ParameterName = "@sync_scope_name";
                p.Value         = scopeInfo.Name;
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@sync_scope_schema";
                p.Value         = scopeInfo.Schema == null ? DBNull.Value : (object)JsonConvert.SerializeObject(scopeInfo.Schema);
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@sync_scope_setup";
                p.Value         = scopeInfo.Setup == null ? DBNull.Value : (object)JsonConvert.SerializeObject(scopeInfo.Setup);
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@sync_scope_version";
                p.Value         = scopeInfo.Version;
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@scope_last_sync";
                p.Value         = scopeInfo.LastSync.HasValue ? (object)scopeInfo.LastSync.Value : DBNull.Value;
                p.DbType        = DbType.DateTime;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@scope_last_sync_timestamp";
                p.Value         = scopeInfo.LastSyncTimestamp;
                p.DbType        = DbType.Int64;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@scope_last_server_sync_timestamp";
                p.Value         = scopeInfo.LastServerSyncTimestamp;
                p.DbType        = DbType.Int64;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@scope_last_sync_duration";
                p.Value         = scopeInfo.LastSyncDuration;
                p.DbType        = DbType.Int64;
                command.Parameters.Add(p);

                p = command.CreateParameter();
                p.ParameterName = "@sync_scope_id";
                p.Value         = scopeInfo.Id.ToString();
                p.DbType        = DbType.String;
                command.Parameters.Add(p);

                using (DbDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            scopeInfo.Name                    = reader["sync_scope_name"] as string;
                            scopeInfo.Schema                  = reader["sync_scope_schema"] == DBNull.Value ? null : JsonConvert.DeserializeObject <SyncSet>((string)reader["sync_scope_schema"]);
                            scopeInfo.Setup                   = reader["sync_scope_setup"] == DBNull.Value ? null : JsonConvert.DeserializeObject <SyncSetup>((string)reader["sync_scope_setup"]);
                            scopeInfo.Version                 = reader["sync_scope_version"] as string;
                            scopeInfo.Id                      = SyncTypeConverter.TryConvertTo <Guid>(reader["sync_scope_id"]);
                            scopeInfo.LastSyncDuration        = reader["scope_last_sync_duration"] != DBNull.Value ? (long)reader["scope_last_sync_duration"] : 0L;
                            scopeInfo.LastServerSyncTimestamp = reader["scope_last_server_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_server_sync_timestamp"] : 0L;
                            scopeInfo.LastSyncTimestamp       = reader["scope_last_sync_timestamp"] != DBNull.Value ? (long)reader["scope_last_sync_timestamp"] : 0L;
                            scopeInfo.LastSync                = reader["scope_last_sync"] != DBNull.Value ? (DateTime?)reader["scope_last_sync"] : null;
                        }
                    }
                }

                return(scopeInfo);
            }
        }