Example #1
0
        public static MySqlDataReader ExecuteReaderRpll(this MySqlCommand cmd, bool tryagain = true)
        {
            try
            {
                var copy = new ConcurrentDictionary <ulong, List <Tuple <long, MySqlDataReader> > >(_mMySqlDataReaders);
                foreach (var readerIP in copy)
                {
                    foreach (var reader in readerIP.Value)
                    {
                        if (reader == null)
                        {
                            continue;
                        }
                        if (reader.Item1 + 600 > DateTimeOffset.UtcNow.ToUnixTimeSeconds())
                        {
                            break;
                        }
                        reader.Item2.Close();
                        reader.Item2.Dispose();
                    }

                    _mMySqlDataReaders[readerIP.Key].Clear();
                    _mMySqlDataReaders.Remove(readerIP.Key);
                }
            }
            catch { }
            // Add data reader organization
            MySqlDataReader rd;
            string          ip = "0";

            if (HttpContext.Current != null)
            {
                ip = Utility.GetIPAddress(HttpContext.Current.Request);
            }
            ulong key = Farmhash.Sharp.Farmhash.Hash64(ip);

            try
            {
                rd = cmd.ExecuteReader();
                if (!_mMySqlDataReaders.ContainsKey(key))
                {
                    _mMySqlDataReaders[key] = new List <Tuple <long, MySqlDataReader> >();
                }
                _mMySqlDataReaders[key].Add(new Tuple <long, MySqlDataReader>(DateTimeOffset.UtcNow.ToUnixTimeSeconds(), rd));
                return(rd);
            }
            catch (MySqlException)
            {
                // Just open new connection and execute the reader on there
                if (tryagain)
                {
                    if (cmd.Connection.Database.ToLower().Contains("rpll_vanilla"))
                    {
                        return(App.GetDB(1).Query(cmd.CommandText).ExecuteReaderRpll(false));
                    }
                    else if (cmd.Connection.Database.ToLower().Contains("rpll_tbc"))
                    {
                        return(App.GetDB(2).Query(cmd.CommandText).ExecuteReaderRpll(false));
                    }
                    else
                    {
                        return(App.GetDB().Query(cmd.CommandText).ExecuteReaderRpll(false));
                    }
                }
                else
                {
                    if (_mMySqlDataReaders.ContainsKey(key) && _mMySqlDataReaders[key].Any())
                    {
                        var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
                        foreach (var reader in _mMySqlDataReaders[key])
                        {
                            if (reader == null)
                            {
                                continue;
                            }
                            if (reader.Item1 + 30 > DateTimeOffset.UtcNow.ToUnixTimeSeconds())
                            {
                                break;
                            }
                            reader.Item2.Close();
                            reader.Item2.Dispose();
                        }

                        _mMySqlDataReaders[key].Clear();
                    }

                    rd = cmd.ExecuteReader();
                    if (!_mMySqlDataReaders.ContainsKey(key))
                    {
                        _mMySqlDataReaders[key] = new List <Tuple <long, MySqlDataReader> >();
                    }
                    _mMySqlDataReaders[key].Add(new Tuple <long, MySqlDataReader>(DateTimeOffset.UtcNow.ToUnixTimeSeconds(), rd));
                    return(rd);
                }
            }
            catch (KeyNotFoundException)
            {
                return(null);
                // Maybe a data race thingy?
            }
            catch (NullReferenceException)
            {
                SQLWrapper.DisposeSQL();
                return(null);
                // Dont really know what to do then
            }
            catch (IndexOutOfRangeException)
            {
                return(null);
                // Dont really know what to do then
            }
            catch (ObjectDisposedException)
            {
                SQLWrapper.DisposeSQL();
                return(null);
                // No clue
            }
            //return null; // Uston?!!
        }