예제 #1
0
        private async Task <ConnectionWrapper> CreateConnectionAsync(CancellationToken token)
        {
            ConnectionWrapper connection = new ConnectionWrapper(settings.ConnectionString1, this);
            await connection.Connection.OpenAsync(token);

            PoolRepo.TryAdd(connection.CreationTime, connection);
            return(connection);
        }
예제 #2
0
        private void CreateConnection()
        {
            ConnectionWrapper connection = new ConnectionWrapper(settings.ConnectionString1, this);

            connection.Connection.Open();
            while (PoolRepo.ContainsKey(connection.CreationTime))
            {
                connection.CreationTime = DateTime.UtcNow;
            }
            Pool.Push(connection);
            PoolRepo.TryAdd(connection.CreationTime, connection);
        }
예제 #3
0
        public async Task <ConnectionWrapper> GetConnectionAsync(CancellationToken token)
        {
            ConnectionWrapper connection = null;

            while (!token.IsCancellationRequested)
            {
                if (Pool.TryPop(out connection))
                {
                    if (connection.Connection.FullState == System.Data.ConnectionState.Open)
                    {
                        return(connection);
                    }
                    else if (connection.Connection.FullState == System.Data.ConnectionState.Connecting)
                    {
                        continue;
                    }
                    else
                    {
                        PoolRepo.TryRemove(connection.CreationTime, out var _);
                    }
                }
                else if (PoolRepo.Count < this.settings.ConnectionPoolMaxSize)
                {
                    //if (Monitor.TryEnter(locker))
                    {
                        try
                        {
                            connection = await CreateConnectionAsync(token);

                            //Monitor.Exit(locker);
                            return(connection);
                        }
                        catch (Exception)
                        {
                            // Monitor.Exit(locker);
                        }
                    }
                }
                else
                {
                    await Task.Delay(100, token);
                }
            }
            throw new OperationCanceledException();
        }
예제 #4
0
        public async Task PersonSearch(int limit, long id, CancellationToken token)
        {
            try
            {
                using (ConnectionWrapper connectionWrapper = await connectionPoolManager.GetConnectionAsync(token))
                {
                    NpgsqlCommand searchCommand = connectionWrapper.Connection.CreateCommand();
                    searchCommand.CommandText = "get_user_messages";
                    searchCommand.CommandType = System.Data.CommandType.StoredProcedure;
                    searchCommand.Parameters.Add(new NpgsqlParameter("_user_id", NpgsqlTypes.NpgsqlDbType.Bigint));
                    searchCommand.Parameters.Add(new NpgsqlParameter("lim", NpgsqlTypes.NpgsqlDbType.Integer));


                    searchCommand.Parameters["_user_id"].Value = id;
                    searchCommand.Parameters["lim"].Value      = limit;


                    using NpgsqlDataReader reader = await searchCommand.ExecuteReaderAsync();

                    //List<SearchResult> results = new List<SearchResult>();

                    while (await reader.ReadAsync())
                    {
                        if (!reader.IsDBNull(0) && !reader.IsDBNull(1))
                        {
                            searchResultReciever.Recieve(new SearchResult()
                            {
                                Link = reader.GetString(0),
                                Text = reader.GetString(1)
                            });
                        }
                    }
                    //return results;
                }
            }
            catch (Exception)
            {
                // return new List<SearchResult>();
            }
        }
예제 #5
0
        private async Task Search(SearchType storedProcedure,
                                  string request,
                                  DateTime startDt,
                                  DateTime endDt,
                                  int limit,
                                  bool is_channel,
                                  bool is_group,
                                  CancellationToken token,
                                  params long[] chat_ids)
        {
            try
            {
                string storedProcedureName = null;;
                switch (storedProcedure)
                {
                case SearchType.SearchNamePeriod:
                    storedProcedureName = "search_name_period";
                    break;

                case SearchType.SearchInChannel:
                    storedProcedureName = "search_in_channel";
                    break;

                case SearchType.SearchPeriod:
                    storedProcedureName = "search_period";
                    break;

                default: return;
                }

                using (ConnectionWrapper connectionWrapper = await connectionPoolManager.GetConnectionAsync(token))
                {
                    NpgsqlCommand searchCommand = connectionWrapper.Connection.CreateCommand();
                    searchCommand.CommandText = storedProcedureName;
                    searchCommand.CommandType = System.Data.CommandType.StoredProcedure;
                    searchCommand.Parameters.Add(new NpgsqlParameter("request", NpgsqlTypes.NpgsqlDbType.Text));
                    searchCommand.Parameters.Add(new NpgsqlParameter("lim", NpgsqlTypes.NpgsqlDbType.Integer));
                    searchCommand.Parameters.Add(new NpgsqlParameter("_is_group", NpgsqlTypes.NpgsqlDbType.Boolean));
                    searchCommand.Parameters.Add(new NpgsqlParameter("_is_channel", NpgsqlTypes.NpgsqlDbType.Boolean));
                    searchCommand.Parameters.Add(new NpgsqlParameter("dt1", NpgsqlTypes.NpgsqlDbType.Timestamp));
                    searchCommand.Parameters.Add(new NpgsqlParameter("dt2", NpgsqlTypes.NpgsqlDbType.Timestamp));

                    searchCommand.Parameters["request"].Value     = request;
                    searchCommand.Parameters["lim"].Value         = limit;
                    searchCommand.Parameters["dt1"].Value         = startDt;
                    searchCommand.Parameters["dt2"].Value         = endDt;
                    searchCommand.Parameters["_is_group"].Value   = is_group;
                    searchCommand.Parameters["_is_channel"].Value = is_channel;

                    if (chat_ids != null && chat_ids.Length > 0 && storedProcedure == SearchType.SearchInChannel)
                    {
                        searchCommand.Parameters.Add(new NpgsqlParameter("ids", NpgsqlTypes.NpgsqlDbType.Array | NpgsqlTypes.NpgsqlDbType.Bigint));
                        searchCommand.Parameters["ids"].Value = chat_ids;
                    }

                    using (NpgsqlDataReader reader = await searchCommand.ExecuteReaderAsync())
                    {
                        while (await reader.ReadAsync())
                        {
                            if (!reader.IsDBNull(0) && !reader.IsDBNull(1))
                            {
                                string name = "";
                                if (reader.FieldCount >= 3)
                                {
                                    if (!reader.IsDBNull(2))
                                    {
                                        name = reader.GetString(2);
                                    }
                                }
                                searchResultReciever.Recieve(new SearchResult()
                                {
                                    Link = reader.GetString(0),
                                    Text = reader.GetString(1),
                                    Name = name
                                });
                            }
                        }
                    }
                    //searchResultReciever.IsComplited = true;
                    //return results;
                }
            }
            catch (Exception)
            {
            }
        }