Wil*_*gan 9 mysql erlang xmpp ejabberd
我正在为PHP/MySQL用户驱动的网站编写聊天模块,允许两个用户结交朋友,并为聊天系统选择了eJabberd.
我已经使用PHP守护程序成功设置了外部身份验证,现在我已成功通过手动使用mod_roster_odbc和填充MySQL rosterusers表来获得与eJabberd的友谊.经过大量的挖掘,我设法发现这个特别的评论非常有助于知道每列的设置,以便在聊天模块的朋友列表中表示友谊.
我当前处理友谊的方法是在rosterusers表中插入两行:
# Relationship user1 => user2
INSERT INTO rosterusers (username, jid, subscription, ask, server, type)
VALUES ('user1', 'user2@myserver.org', 'B', 'N', 'B', 'item');
# Relationship user2 => user1
INSERT INTO rosterusers (username, jid, subscription, ask, server, type)
VALUES ('user2', 'user1@myserver.org', 'B', 'N', 'B', 'item');
Run Code Online (Sandbox Code Playgroud)
我对此并不满意,因为互惠友谊需要两排.
据我所知,XMPP标准允许用户之间的单链路和双链路.正如我可以通过我的问题的性质推断出,我自己的应用程序的朋友系统使用一行来表示友谊.
我的主要问题:
TRIGGER可能是目前最干净的选择.如果没有,那么我的另一个选择是更改rosterusers表并获取它以引用我自己的应用程序的朋友行,以便它的功能类似于跨数据库外键.
我创建了一个欧根建议的视图.代码不是最优雅的,但我已经测试了它,它适用于MySQL 5.5上的eJabberd 2.1.
我的确切设置使用两个数据库,因此我使用显式引用我的主应用程序的数据库main_database.table_name.
代码是两个查询的联合 - 第一个使用User,Friend,然后第二个插入Friend,User.我正在使用UNION ALL速度,并让"重复"通过.
我认为这是处理问题的一种非常好的方法,因为不需要对应用程序进行任何更改,并且它会立即更新.
CREATE VIEW rosterusers AS
SELECT LCASE(ua1.Username) AS `username`, CONCAT(LCASE(ua2.Username), '@myserver.org') AS `jid`,
'B' AS `subscription`,
'N' AS `ask`,
'N' AS `server`,
'item' AS `type`,
'B' AS `subscribe`,
d1.Created AS `created_at`,
ua2.Username AS `nick`,
'' AS `askmessage`
FROM main_database.User_Friend AS `d1`
INNER JOIN main_database.User AS `ua1` ON `d1`.UserID = `ua1`.ID
INNER JOIN main_database.User AS `ua2` ON `d1`.FriendID = `ua2`.ID
WHERE d1.IsApproved = 1
UNION ALL
SELECT LCASE(ub2.Username) AS `username`, CONCAT(LCASE(ub1.Username), '@myserver.org') AS `jid`,
'B' AS `subscription`,
'N' AS `ask`,
'N' AS `server`,
'item' AS `type`,
'B' AS `subscribe`,
d2.Created AS `created_at`,
ub1.Username AS `nick`,
'' AS `askmessage`
FROM main_database.User_Friend AS `d2`
INNER JOIN main_database.User AS `ub1` ON `d2`.UserID = `ub1`.ID
INNER JOIN main_database.User AS `ub2` ON `d2`.FriendID = `ub2`.ID
WHERE d2.IsApproved = 1;
Run Code Online (Sandbox Code Playgroud)
IIUC,该表rosterusers从服务器应用程序的 POV 来看是只读的eJabberd。这将使事情变得简单,将其替换为view,在您自己的朋友表中从 1 行中创建所需的 2 行。
不知道你自己的友谊表的结构,我无法给你完整的代码,但这是我认为的伪 SQL
CREATE VIEW rosterusers AS SELECT * FROM (
SELECT
selfuser.name AS username,
frienduser.jid AS jid,
-- ....,
selfuser.jid AS jid_as_id
FROM
users AS selfuser
INNER JOIN friendships ON ....
INNER JOIN users AS frienduser ON ...
UNION SELECT
frienduser.name AS username,
selfuser.jid AS jid,
-- ....,
frienduser.jid AS jid_as_id
FROM
users AS selfuser
INNER JOIN friendships ON ....
INNER JOIN users AS frienduser ON ...
);
Run Code Online (Sandbox Code Playgroud)
进而
SELECT
username, jid, subscription, ask, server, type
FROM rosterusers
WHERE jid_as_id='user1@myserver.org'
Run Code Online (Sandbox Code Playgroud)
UNION应该给你 2 行,视图中每个部分各一行