ICQCorp
Навигатор О проекте Новости Ссылки Установка ФАКи Скриншоты Благодарности Документы PostgreSQL Скачать Об авторе Гостевая книга Russian English Проект IServerd

Таблица online_contacts

Назначение таблицы:

   Данная таблица используется сервером для хранения списка контактов всех пользователей. В этой таблице хранятся списки контактов различных типов: обычные списки контактов, invisible списки, visible списки. Для работы с данной таблицей используются сложные SQL запросы с подзапросами.

Список полей таблицы:

 Имя    Тип    Расшифровка   Описание поля 
 ouin   float8   owner uin  поле c номером uin владельца данной записи т.е. подключенного клиента
 tuin   float8   target uin  поле с номером одного контакта владельца записи

 type   int2   contact type  тип записи, 1 - normal contact, 2 - invisible contact, 3 - visible contact
 rid   float8   random id  Идентификатор группы контактов используемый для отслеживания статуса этой группы


Создание таблицы:

   Таблица создается сервером или утилитой при помощи запроса 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
А.В.Шутко