Пример #1
0
 /// <summary>
 /// Process exception when excute Update
 /// </summary>
 /// <param name="ex">Exception</param>
 /// <returns>UpdateDataResult<T></returns>
 public UpdateDataResult <T> ProcessException <T>(NpgsqlException ex, UpdateDataResult <T> updateDataResult)
 {
     //Duplicate unique fields case
     if (((PostgresException)ex).SqlState == "23505")
     {
         string[] fields        = new string[] { };
         string   detail        = ((PostgresException)ex).Detail;
         string   leftStr       = detail.Split('=')[0];
         string   strFieldNames = leftStr.Split('(')[1].Split(')')[0];
         string[] str           = strFieldNames.Split(',');
         fields = str.Select(p => p.Replace(@"""", "")?.Replace(@"\", "")).ToArray();
         updateDataResult.Error = new ErrorAction()
         {
             ErrorType = DataActionErrorTypeEnum.DuplicateData,
             Fields    = fields
         };
     }
     //Require fields are null
     if (((PostgresException)ex).SqlState == "23502")
     {
         string[] fields  = new string[1];
         string   message = ((PostgresException)ex).Message;
         fields[0] = Regex.Split(message, @"\""")[1];
         updateDataResult.Error = new ErrorAction()
         {
             ErrorType = DataActionErrorTypeEnum.MissingFields,
             Fields    = fields
         };
     }
     return(updateDataResult);
 }
Пример #2
0
        /// <summary>
        /// Update data to db
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tableName"></param>
        /// <param name="Where"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public UpdateDataResult <T> UpdateData <T>(string TableName, string StrWhere, List <object> InputParams, T data)
        {
            var type      = typeof(T);
            var pro       = type.GetProperties().ToList();
            var fieldList = pro.Select(p => new {
                name       = p.Name,
                value      = p.GetValue(data),
                paramIndex = pro.IndexOf(p)
            }).ToList();

            var fields  = string.Join(",", fieldList.Select(p => Globals.Compiler.GetQName(p.name)).ToArray());
            var strPro  = string.Join(",", fieldList.Select(p => @"""" + p.name + @"""" + "=" + ":p" + p.paramIndex).ToArray());
            var tblName = Globals.Compiler.GetQName(TableName);

            for (int i = 0; i < InputParams.Count; i++)
            {
                StrWhere = StrWhere.Replace("{" + i + "}", ":p" + (fieldList.Count + i).ToString());
            }
            string sql = string.Format("UPDATE {0} SET {1} WHERE {2}", tblName, strPro, StrWhere);
            UpdateDataResult <T> updateDataResult = new UpdateDataResult <T>();
            // array of fields in table
            var arrField = fieldList.Select(p => p.value).ToArray();
            // array of fields in WHERE clause
            var arrInputParam = InputParams.ToArray();
            // arr total field = array of fields in table + array of fields in WHERE clause
            var arrTotalField = arrField.Concat(arrInputParam).ToArray();

            updateDataResult = UpdateDatabase <T>(sql, arrTotalField);
            return(updateDataResult);
        }
Пример #3
0
        /// <summary>
        /// Update into table, DML statement will be excuted here
        /// </summary>
        /// <param name="sql">This is sql query to update data in to table in database</param>
        /// <returns></returns>
        public UpdateDataResult <T> UpdateDatabase <T>(string SQL, params object[] pars)
        {
            UpdateDataResult <T> updateDataResult = new UpdateDataResult <T>();
            object result = null;

            try
            {
                if (cnn.State != ConnectionState.Open)
                {
                    cnn.Open();
                }
                NpgsqlCommand command    = new NpgsqlCommand(SQL, cnn);
                var           paramIndex = 0;
                foreach (var p in pars)
                {
                    var paramName = string.Format(":p{0}", paramIndex);
                    command.CommandText = command.CommandText.Replace("{" + paramIndex.ToString() + "}", paramName);
                    var sqlParam = new NpgsqlParameter();
                    sqlParam.ParameterName = paramName;
                    if (p != null)
                    {
                        sqlParam.Value = p;
                    }
                    else
                    {
                        sqlParam.Value = DBNull.Value;
                    }
                    command.Parameters.Add(sqlParam);
                    paramIndex++;
                }
                result = command.ExecuteNonQuery();
                //Update successfully
                if (result != null)
                {
                    updateDataResult.Error = new ErrorAction()
                    {
                        ErrorType = DataActionErrorTypeEnum.None
                    };
                }
                if (cnn.State != ConnectionState.Closed)
                {
                    cnn.Close();
                }
            }
            catch (NpgsqlException ex)
            {
                Utils utils = new Utils();
                updateDataResult = utils.ProcessException <T>(ex, updateDataResult);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return(updateDataResult);
        }
Пример #4
0
        public void UpdateData_should_return_success_if_get_update_set_data_are_successful()
        {
            const string path  = "zk/default";
            var          bytes = new byte[] { 0, 1, 1, 2, 3, 5, 8, 13 };

            zooKeeperClient.GetDataAsync(Arg.Any <GetDataRequest>())
            .Returns(GetDataResult.Successful(path, bytes, Stat));

            zooKeeperClient.SetDataAsync(Arg.Any <SetDataRequest>()).Returns(SetDataResult.Successful(path, Stat));

            zooKeeperClient.UpdateData(new UpdateDataRequest(path, dummyUpdate))
            .Should()
            .BeEquivalentTo(UpdateDataResult.Successful(path));
        }
Пример #5
0
        public void UpdateData_should_return_fail_without_retries_if_cant_read_data(ZooKeeperStatus errorStatus)
        {
            const string path = "zk/default";

            zooKeeperClient.GetDataAsync(Arg.Any <GetDataRequest>()).Returns(GetDataResult.Unsuccessful(errorStatus, path, null));

            zooKeeperClient.UpdateData(new UpdateDataRequest(path, dummyUpdate))
            .Should()
            .BeEquivalentTo(UpdateDataResult.Unsuccessful(errorStatus, path, null));

            zooKeeperClient.ReceivedWithAnyArgs(1)
            .GetDataAsync(Arg.Any <GetDataRequest>());
            zooKeeperClient.DidNotReceiveWithAnyArgs()
            .SetDataAsync(Arg.Any <SetDataRequest>());
        }
Пример #6
0
        public void UpdateData_should_return_false_after_one_attempt_if_set_data_fails(ZooKeeperStatus failFastStatus)
        {
            const string path  = "zk/default";
            var          bytes = new byte[] { 0, 1, 1, 2, 3, 5, 8, 13 };

            zooKeeperClient.GetDataAsync(Arg.Any <GetDataRequest>())
            .Returns(GetDataResult.Successful(path, bytes, Stat));

            zooKeeperClient.SetDataAsync(Arg.Any <SetDataRequest>())
            .Returns(SetDataResult.Unsuccessful(failFastStatus, path, null));

            zooKeeperClient.UpdateData(new UpdateDataRequest(path, dummyUpdate))
            .Should()
            .BeEquivalentTo(UpdateDataResult.Unsuccessful(failFastStatus, path, null));

            zooKeeperClient.ReceivedWithAnyArgs(1).SetDataAsync(Arg.Any <SetDataRequest>());
        }
        /// <summary>
        /// <para>Trying to update node data with optimistic concurrency strategy according to given <paramref name="request"/>.</para>
        /// <para>Check returned <see cref="UpdateDataResult"/> to see if operation was successful.</para>
        /// </summary>
        public static async Task <UpdateDataResult> UpdateDataAsync(this IZooKeeperClient zooKeeperClient, UpdateDataRequest request)
        {
            try
            {
                for (var i = 0; i < request.Attempts; i++)
                {
                    var readResult = await zooKeeperClient.GetDataAsync(new GetDataRequest(request.Path)).ConfigureAwait(false);

                    if (!readResult.IsSuccessful)
                    {
                        return(UpdateDataResult.Unsuccessful(readResult.Status, readResult.Path, readResult.Exception));
                    }

                    var newData = request.Update(readResult.Data);

                    if (ByteArrayKey.Equals(readResult.Data, newData))
                    {
                        return(UpdateDataResult.Successful(readResult.Path));
                    }

                    var setDataRequest = new SetDataRequest(request.Path, newData)
                    {
                        Version = readResult.Stat.Version
                    };

                    var updateResult = await zooKeeperClient.SetDataAsync(setDataRequest).ConfigureAwait(false);

                    if (updateResult.Status == ZooKeeperStatus.VersionsMismatch)
                    {
                        continue;
                    }

                    return(updateResult.IsSuccessful ? UpdateDataResult.Successful(updateResult.Path) : UpdateDataResult.Unsuccessful(updateResult.Status, updateResult.Path, updateResult.Exception));
                }

                return(UpdateDataResult.Unsuccessful(ZooKeeperStatus.VersionsMismatch, request.Path, null));
            }
            catch (Exception e)
            {
                return(UpdateDataResult.Unsuccessful(ZooKeeperStatus.UnknownError, request.Path, e));
            }
        }
Пример #8
0
        public void UpdateData_should_make_all_attempts_to_set_data_and_return_fail()
        {
            const string path     = "zk/default";
            const int    attempts = 10;
            var          bytes    = new byte[] { 0, 1, 1, 2, 3, 5, 8, 13 };

            zooKeeperClient.GetDataAsync(Arg.Any <GetDataRequest>())
            .Returns(GetDataResult.Successful(path, bytes, Stat));

            zooKeeperClient.SetDataAsync(Arg.Any <SetDataRequest>())
            .Returns(SetDataResult.Unsuccessful(ZooKeeperStatus.VersionsMismatch, path, null));

            zooKeeperClient.UpdateData(new UpdateDataRequest(path, dummyUpdate)
            {
                Attempts = attempts
            })
            .Should()
            .BeEquivalentTo(UpdateDataResult.Unsuccessful(ZooKeeperStatus.VersionsMismatch, path, null));

            zooKeeperClient.ReceivedWithAnyArgs(attempts)
            .SetDataAsync(Arg.Any <SetDataRequest>());
        }
Пример #9
0
        public void UpdateData_should_not_apply_update_when_bytes_not_changed()
        {
            const string path         = "zk/default";
            const int    attempts     = 10;
            var          bytes        = new byte[] { 0, 1, 1, 2, 3, 5, 8, 13 };
            var          updatedBytes = new byte[] { 0, 1, 1, 2, 3, 5, 8, 13 };

            byte[] UpdateFunc(byte[] oldBytes) =>
            updatedBytes;

            zooKeeperClient.GetDataAsync(Arg.Any <GetDataRequest>())
            .Returns(GetDataResult.Successful(path, bytes, Stat));

            zooKeeperClient.UpdateData(new UpdateDataRequest(path, UpdateFunc)
            {
                Attempts = attempts
            })
            .Should().BeEquivalentTo(UpdateDataResult.Successful(path));

            zooKeeperClient
            .DidNotReceiveWithAnyArgs()
            .SetDataAsync(Arg.Any <SetDataRequest>());
        }
Пример #10
0
        /// <summary>
        /// Updates the users.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="userList">The user list.</param>
        /// <returns>The results of updating the users.</returns>
        public UpdateDataResult UpdateUsers(SessionData session, List<UpdateUser> userList)
        {
            UpdateDataResult results = new UpdateDataResult();

            foreach (UpdateUser updateUser in userList)
            {
                try
                {
                    User existingUser = null;
                    if (!string.IsNullOrEmpty(updateUser.Id))
                    {
                        existingUser = this.workbenchManager.GetUser(session.UserId, updateUser.Id);
                    }
                    else if (!string.IsNullOrEmpty(updateUser.Username))
                    {
                        var search = new UserSearchCriteria
                        {
                            Usernames = new List<string>
                            {
                                updateUser.Username
                            }
                        };
                        UserList users = this.workbenchManager.FindUsers(session.UserId, search);
                        if (users.Count >= 1)
                        {
                            existingUser = users.First();
                        }
                    }

                    if (existingUser == null)
                    {
                        results.AddNotification(updateUser, updateUser.Id ?? updateUser.Username, UpdateMessageType.Error, string.Format(UpdateUserMessages.UserNotFound, updateUser.Username));
                        continue;
                    }

                    bool updatedUserDetails = existingUser.MapUserData(updateUser);
                    RoleList roles = this.workbenchManager.GetRoleList(session.UserId);
                    bool updatedRoles = existingUser.UpdateRoles(updateUser, roles);
                    bool updatedProperties = existingUser.UpdateExtendedProperties(updateUser);

                    if (updatedUserDetails || updatedRoles || updatedProperties)
                    {
                        this.securityService.SaveUser(session, existingUser);
                        results.AddNotification(existingUser, existingUser.Username, UpdateMessageType.Information, string.Format(UpdateUserMessages.Success, existingUser.Username, existingUser.DisplayName));
                    }
                    else
                    {
                        results.AddNotification(existingUser, existingUser.Username, UpdateMessageType.Information, string.Format(UpdateUserMessages.NoChange, existingUser.Username, existingUser.DisplayName));
                    }
                }
                catch (Exception e)
                {
                    results.AddNotification(updateUser, updateUser.Id ?? updateUser.Username, UpdateMessageType.Error, e.Message);
                }
            }

            return results;
        }