Jabber клиент для SQL Server (JabberCLR)

Источник: t-sql

XMPP - Extensible Messaging and Presence Protocol (англ. расширяемый протокол обмена сообщениями и информацией о присутствии), ранее известный как Jabber[1] ([ˈʤæbə(r)], джа́ббер(англ. болтовня, трёп; тарабарщина) - это основанный на XML открытый, свободный для использования протокол для мгновенного обмена сообщениями и информацией о присутствии в режиме, близкому к режиму реального времени. Изначально спроектированный легко расширяемым, протокол, помимо передачи текстовых сообщений, поддерживает передачу голоса, видео и файлов по сети.

В отличие от коммерческих систем мгновенных сообщений, таких, как AIM, ICQ, MSN и Yahoo, XMPP является децентрализованной, расширяемой и открытой системой. Любой желающий может открыть свой сервер мгновенных сообщений, регистрировать на нём пользователей и взаимодействовать с другими серверами XMPP. На основе протокола XMPP уже открыто множество частных и корпоративных серверов XMPP. Среди них есть достаточно крупные проекты, такие как Google Talk, LiveJournal и Gizmo5.
(http://ru.wikipedia.org/wiki/Jabber)

В качестве альтернативного клиента предлагаю CLR-сборку.

Для быстрого написания сборки я воспользовался уже готовой библиотекой XMPP (.NET) - agsXMPP

01.using System;
02.using Microsoft.SqlServer.Server;
03.using agsXMPP;
04.using agsXMPP.protocol.client;
05.  
06.public class JabberCLR
07.{
08.    [SqlFunction]
09.  
10.    public static string SendMessage(string Server, string Username, string Password, string Port, string SendTo, string Message)
11.    {
12.  
13.        XmppClientConnection xmpp = new XmppClientConnection();
14.        xmpp.Resource = "JabberCLR";
15.        xmpp.Server = Server;
16.        xmpp.Username = Username;
17.        xmpp.Password = Password;
18.        xmpp.Port = Convert.ToInt32(Port);
19.  
20.        Message msg = new Message();
21.        msg.Type = MessageType.chat;
22.        msg.To = new Jid(SendTo);
23.        msg.Body = Message;
24.  
25.        xmpp.Open();
26.  
27.        xmpp.OnLogin += delegate(object o){xmpp.Send(msg);};
28.  
29.        return (xmpp.XmppConnectionState.ToString());
30.    }
31.}

При регистрации нашей сборки потребуется ещё сама библиотека agsXMPP.dll и System.Drawing.dll (из C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 ). Собираем эти 3 библиотеки в одну папку, дабы не получить ошибку подобно этой:

Error
Msg 10301, Level 16, State 1, Line 1
Assembly "JabberCLR" references assembly "agsxmpp, version=1.1.0.0, culture=neutral, publickeytoken=ff839b81f1debe86.", which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(failed to retrieve text for this error. Reason: 1815)). Please load the referenced assembly into the current database and retry your request.

либо:

Error
Msg 10301, Level 16, State 1, Line 1
Assembly "JabberCLR" references assembly "system.drawing, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.", which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(failed to retrieve text for this error. Reason: 1815)). Please load the referenced assembly into the current database and retry your request.

После этого регистрируем сборку на сервере БД:

1.CREATE ASSEMBLY [AssemblyJabber]
2.AUTHORIZATION [dbo]
3.FROM 'C:\CLR\JabberCLR.dll'
4.WITH PERMISSION_SET = UNSAFE
5.GO

Создаём скалярную функцию с ссылкой на нашу сборку:

01.CREATE FUNCTION [dbo].[SendMessage]
02.(
03.@Server [nvarchar](128),
04.@Username [nvarchar](128),
05.@Password [nvarchar](128),
06.@Port [nvarchar](5),
07.@SendTo [nvarchar](128),
08.@Message [nvarchar](max)
09.)
10.RETURNS [nvarchar](50) WITH EXECUTE AS CALLER
11.AS
12.EXTERNAL NAME [AssemblyJabber].[JabberCLR].[SendMessage]
13.GO

Ну и сам вызов функции (отправка сообщения):

01.SELECT [dbo].[SendMessage] (
02.--Любой сервер Jabber
03.'jabber.ru',
04.--JID от кого шлём сообщения
05.'MyUser',
06.--Пароль нашей учётки
07.'MyPassword',
08.--Порт на сервере
09.'5222',
10.--Получатель сообщения
11.'mssql@jabber.ru',
12.--Само сообщение
13.'TestMessage')
14.GO

Таким образом можно отсылать через XMPP-протокол сообщения, например о каком-либо событии на сервере БД.

Сборка писалась под Framework v3.5 для SQL Server 2008.

P.S.: Не забываем про

1)

1.SP_CONFIGURE 'clr enabled', 1
2.RECONFIGURE

2)

1.ALTER DATABASE [Ваша база] SET TRUSTWORTHY ON

Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=23183