public bool UpdatePlayersPassword(string username, string old_password, string new_password)
        {
            try
            {
                TableServiceContext service_context = _client.GetDataServiceContext();

                var p_pass_query = service_context.CreateQuery<Domain.Entities.PlayerPassword>(_player_password_table_name);
                var old_temp_player = new Domain.Entities.PlayerPassword(username, new_password);
                var old_hashedpass = old_temp_player.RowKey;

                var new_temp_player_pass = new Domain.Entities.PlayerPassword(username, new_password);
                var new_hashedpass = new_temp_player_pass.RowKey;

                //check if old pass works out
                string player_username = (from pp in p_pass_query
                                          where pp.PartitionKey == username.ToLower()
                                              && pp.RowKey == old_hashedpass
                                          select username).SingleOrDefault();
                if (string.IsNullOrWhiteSpace(player_username))
                {
                    return false;
                }
                if (player_username.ToLower() == username.ToLower())
                {
                    service_context.UpdateObject(new_temp_player_pass);
                    service_context.SaveChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                throw;
            }
        }
        public Domain.Entities.Player CreatePlayerWithPassword(string username, string password, string device_id = null)
        {
            bool created_player = false;
            bool created_player_pass_link = false;

            Domain.Entities.Player player = null;
            Domain.Entities.PlayerPassword player_password = null;
            TableServiceContext service_context = _client.GetDataServiceContext();

            username = username.ToLower();

            try
            {
                if (IsUsernameAvailable(username))
                {
                    player = new Domain.Entities.Player(username);
                    player.DeviceID = device_id;
                    service_context.AddObject(_table_name, player);
                    service_context.SaveChanges();
                    created_player = true;

                    player_password = new Domain.Entities.PlayerPassword(username, password);
                    service_context.AddObject(_player_password_table_name, player_password);
                    service_context.SaveChanges();

                    created_player_pass_link = true;
                    return player;
                }
                else
                {
                    throw new ArgumentException("Username already registered.", "username");
                }
            }
            catch
            {
                try
                {
                    if (service_context != null)
                    {
                        //revert on any error if possible
                        if (created_player)
                        {
                            service_context.DeleteObject(player);
                            service_context.SaveChanges();
                        }

                        if (created_player_pass_link && player_password != null)
                        {
                            service_context.DeleteObject(player_password);
                            service_context.SaveChanges();
                        }
                    }
                }
                catch
                {
                }

                throw;
            }
        }
        public Domain.Entities.Player GetPlayerByUsernameAndPassword(string username, string password)
        {
            try
            {
                TableServiceContext service_context = _client.GetDataServiceContext();
                var p_pass_query = service_context.CreateQuery<Domain.Entities.PlayerPassword>(_player_password_table_name);
                var temp_player = new Domain.Entities.PlayerPassword(username, password);
                var hashedpass = temp_player.RowKey;
                string player_username = (from pp in p_pass_query
                                          where pp.PartitionKey == username.ToLower()
                                              && pp.RowKey == hashedpass
                                          select username).SingleOrDefault();
                if (string.IsNullOrWhiteSpace(player_username))
                {
                    return null;
                }

                var query = service_context.CreateQuery<Domain.Entities.Player>(_table_name);

                Domain.Entities.Player player = (from p in query
                                                 where p.PartitionKey == player_username.Substring(0, 1).ToUpper()
                                                     && p.RowKey == player_username
                                                 select p).SingleOrDefault();

                return player;
            }
            catch
            {
                throw;
            }
        }