![]() |
|||
![]() |
![]() |
![]() |
|
![]() |
|
Таблица online_contactsНазначение таблицы: Данная таблица используется сервером для хранения списка контактов всех
пользователей. В этой таблице хранятся списки контактов различных типов:
обычные списки контактов, invisible списки, visible списки. Для работы с
данной таблицей используются сложные SQL запросы с подзапросами.
Создание таблицы: Таблица создается сервером или утилитой при помощи запроса SQL. Прототип
запроса находится в модуле database\init_db.h "CREATE TABLE Online_Contacts (ouin float8, tuin float8, type int2, rid float8);" Таблица содержит два индекса на поля ouin и tuin для ускорения работы
сложных запросов. Индексы создаются следующим образом: CREATE INDEX onln_ouin ON Online_Contacts (ouin); CREATE INDEX onln_tuin ON Online_Contacts (tuin); CREATE INDEX onln_rid ON Online_Contacts (rid); Примечание: Список контактов переносится в таблицу последовательными SQL инструкциями
INSERT (либо PostgreSQL инструкцией COPY) по получению пакета с ними от клиента.
После добавления записей производится запрос на получение статуса добавленных
пользователей (тут используется поле rid). Запрос на получение записей всех подключенных пользователей, которые есть в контакт-листе номера 6218895
и которые не имеют номер 6218895 в invisible листе: SELECT uin,ishm FROM online_users JOIN (SELECT tuin FROM online_contacts WHERE (ouin=6218895) AND (type=1) EXCEPT (SELECT ouin FROM online_contacts WHERE (tuin=6218895) AND (type=2)) LIMIT 600) AS TMP on TMP.tuin=uin WHERE (active=1) AND (stat<>256)" Запрос на получения списка пользователей (и их индекса), которых надо уведомить
об изменении статуса пользователя с номером 6218895 (список пользователей, которые
имеют номер 6218895 в своих контакт-листах и которые отсуствуют в его INVISIBLE
листе): SELECT uin,ishm FROM online_users JOIN (SELECT ouin FROM online_contacts WHERE (tuin=6218895) AND (type=1) EXCEPT (SELECT tuin FROM online_contacts WHERE (ouin=6218895) AND (type=2)) LIMIT 600) AS TMP on uin=TMP.ouin WHERE active=1 Список пользователей, которые имеют в своих контакт листах номер 6218895 и которые не находятся
в visible списке пользователя 6218895. Это полезно в том случае если пользователь 6218895 сменил
статус с обычного на invisible (всем пользователям из списка, которые вернет запрос надо послать
уведомление о том, что пользователь отключился): SELECT uin,ishm FROM online_users JOIN (SELECT ouin FROM online_contacts WHERE (tuin=6218895) AND (type=1) INTERSECT (SELECT tuin FROM online_contacts WHERE (ouin=6218895) AND (type=3)) LIMIT 600) AS TMP on uin=TMP.ouin WHERE active=1 Внимание: Во всех запросах использовались константы VISIBLE_CONTACT=3, INVISIBLE_CONTACT=2, NORMAL_CONTACT=1. |
|
|
|
||||||||||||||||||||||||||||||||||||||
|
|
Webmaster А.В.Шутко |
![]() |
![]() |