`
langzhe
  • 浏览: 278998 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mnesia加载mysql表数据(修改ejabberd privacy list)

阅读更多
前提:
mnesia 一张表 privacy
mysql 三张表privacy_list privacy_list_data privacy_default_list

目标:
服务start加载mysql 三个表的数据到mnesia privacy表中
分析分现 ,mysql 的三个表是通过username name id 相互关联起来的,mnesia就是一个结构表
可能习惯了关系数据库我首先想到,关联查询。但发现操mnesia似乎不容易,组合数存在重复的操作。早晚都要遍历干脆 分别从mysql中把表读出来放在内存中,通过erlang的list操作得了,还能顺便写进mnesia中。
代码片段
onload_table(Host) ->
    ?DEBUG("In ~p module ~p onload data from mysql Host ~p ~n", [?MODULE, ?LINE, Host]),

    odbc_queries:sql_get_privacy_list_default(Host),
    PrivacyListDefault =
    case catch odbc_queries:sql_get_privacy_list_default(Host) of
          {selected, ["username", "name"], []} ->[];
          {selected, ["username", "name"], PrivacyListDefault1} -> PrivacyListDefault1
    end,

    PrivacyListData =
    case catch odbc_queries:sql_get_privacy_list_data(Host) of
          {selected, ["id", "t", "value", "action", "ord", "match_all",
                            "match_iq", "match_message",
                            "match_presence_in", "match_presence_out"],
                 []} ->[];
          {selected, ["id", "t", "value", "action", "ord", "match_all",
                            "match_iq", "match_message",
                            "match_presence_in", "match_presence_out"],
                 RItems} ->
                    Items = lists:map(fun raw_to_item_with_id/1, RItems),
                    Items
    end,

    case catch odbc_queries:sql_get_privacy_list(Host) of
         {selected, ["username", "name", "id"], []} -> [];
         {selected, ["username", "name", "id"], PrivacyList} ->
              assemble_data(PrivacyListDefault, PrivacyList, PrivacyListData, [],Host)
    end.


assemble_data(DList, [P | PList], PLData, Res,Host)->
    case P of
       {UserName, ListName, Id} ->
           Default =
           case [{K, V} || {K, V} <- DList, K =:= UserName] of
                [] -> none;
                [{UserName, ListName}] -> ListName;
                _ -> none
           end,
          Test =  [{listitem, Type, Value, Action, Order, All, Iq, Message, In, Out}
                 ||{Kid, {listitem, Type, Value, Action, Order, All, Iq, Message, In, Out}}
                  <- PLData, Kid =:= Id],

          ListItems =
          %case [{listitem, Type, Value, Action, Order, All, Iq, Message, In, Out}
          %       || {listitem, Type, Value, Action, Order, All, Iq, Message, In, Out}
          %        <- PLData, Order =:= Id] of
          case [ListItem
                 || {Kid, #listitem{}=ListItem}
                  <- PLData, Kid =:= Id] of
                ListItems1 when is_list(ListItems1)->
                      ListItems1;
                [] -> [];
                _ -> []
           end,
           Privacy = #privacy{us = {UserName, Host}, default = Default, lists = ListItems},
           mnesia:dirty_write(Privacy),
           assemble_data(DList, PList, PLData, Res,Host);
       _ ->
           assemble_data(DList, PList, PLData, Res,Host)
    end;
assemble_data(_DList, [], _PLData, Res,_Host)->
    Res.
 

mnesia 一张表
-record(privacy, {us,
                  default = none,
                  lists = []}).




Mysql  三张表..

mysql> describe privacy_list_data;
+--------------------+---------------+------+-----+---------+-------+
| Field              | Type          | Null | Key | Default | Extra |
+--------------------+---------------+------+-----+---------+-------+
| id                 | bigint(20)    | YES  | MUL | NULL    |       |
| t                  | char(1)       | NO   |     | NULL    |       |
| value              | text          | NO   |     | NULL    |       |
| action             | char(1)       | NO   |     | NULL    |       |
| ord                | decimal(10,0) | NO   |     | NULL    |       |
| match_all          | tinyint(1)    | NO   |     | NULL    |       |
| match_iq           | tinyint(1)    | NO   |     | NULL    |       |
| match_message      | tinyint(1)    | NO   |     | NULL    |       |
| match_presence_in  | tinyint(1)    | NO   |     | NULL    |       |
| match_presence_out | tinyint(1)    | NO   |     | NULL    |       |
+--------------------+---------------+------+-----+---------+-------+
10 rows in set (0.52 sec)

mysql> select * from privacy_list;
+--------------------+---------+----+---------------------+
| username           | name    | id | created_at          |
+--------------------+---------+----+---------------------+
| server_test_user_2 | newlist |  1 | 2011-03-23 10:53:51 |
| server_test_user_3 | newlist |  2 | 2011-03-23 11:07:57 |
| server_test_user_1 | newlist |  3 | 2011-03-23 11:08:29 |
+--------------------+---------+----+---------------------+
3 rows in set (0.10 sec)

mysql> select * from privacy_default_list;
+--------------------+---------+
| username           | name    |
+--------------------+---------+
| server_test_user_1 | newlist |
| server_test_user_2 | newlist |
| server_test_user_3 | newlist |
+--------------------+---------+
3 rows in set (0.00 sec)

0
0
分享到:
评论

相关推荐

    erlang——Mnesia用户手册.pdf

    6.6.在启动时加载表 6.7.从通信失败中恢复 6.8.事务的恢复 6.9.备份、回滚以及灾难恢复 7.Mnsia.与.SNMP.的结合 7.1.结合.Mnesia.与.SNMP 8.附录.A:Mnesia.错误信息 8.1.Mnesia.中的错误 9.附录.B:...

    Mnesia User's Guide

    • Mnesia provides an introduction to Mnesia. • Getting Started introduces Mnesia with an example database. Examples are included how to start an Erlang session, specify a Mnesia database directory, ...

    Mnesia用户手册 4.4.10版.rar

    6.6 在启动时加载表 . . .. . .. . .. . 67 6.7 从通信失败中恢复 . . .. . .. . . .. . 68 6.8 事务的恢复 . . .. . .. . . .. . 68 6.9 备份、回滚以及灾难恢复 . . .. . .. . . .. . 69 7 Mnsia 与 SNMP 的...

    Mnesia用户手册

    Mnesia用户手册Mnesia用户手册

    Mnesia用户手册.pdf

    Mnesia用户手册.pdf

    Mnesia table fragmentation 过程及算法分析

    Mnesia table fragmentation 过程及算法分析。erlang就算在64位下dets的空间限制仍旧是2g,同样影响了mnesia,如果有更大需求,就必须使用Mnesia的 table fragmentation 技术

    Mnesia用户手册(docx版)

    Mnesia用户手册(docx版) 详细讲解Mnesia数据库操作

    Mnesia用户手册(PDF版本)

    Mnesia用户手册(PDF版本) 详细讲述Mnesia数据库操作。

    Mnesia用户手册.zip

    Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时 特性的Erlang应用。

    mnesia数据库文档

    erlang系统自带的数据库mnesia的官方文档。

    Erlang Mnesia

    This book describes the Mnesia DataBase Management System &#40;DBMS&#41;. Mnesia is a distributed Database Management System, appropriate for telecommunications applications and other Erlang ...

    Mnesia 用户手册中文版 pdf

    Mnesia 用户手册中文版 pdf,把市面上的doc转成pdf,并添加重要章节的书签,细节并不完美,请见谅。

    ejabberd:ejabberd-XMPP和Web聊天

    ejabberd-XMPP和Web聊天 ... 设置erlang节点: (解决方案,更改mnesia主机名)。 绑定到端口12322的管理控制台-使用SSL。 Speeqe(网络聊天应用程序)配置: 从上游源代码安装到/ var / www / django / spe

    cachet:Mnesia的内存光盘分派器

    您的使用数据库的客户端可能需要一些代码更改才能调用cachet API,而不是mnesia (在某些情况下,只需在代码中替换模块名称)即可。 cachet将在RAM表或DISC表中调度请求。 用法 cachet可用于解决以下问题: mnesia...

    mnesia_pg:Postgres后端通过mnesia_ext到Mnesia

    mnesia_pg Postgres后端通过mnesia_ext到Mnesia 这是一个非常原始的实现,用作概念验证和初步基准测试。 尚未用于生产中。 随时进行改进。

    xmljava系统源码-ejabberd:即时通讯的后端服务器。它是从ejabberd开发和定制的

    修改和扩展了很多 ejaberd 不支持的功能。 关键功能 分布式:去掉了依赖 mnesia 集群的代码,来支持更大的集群,以及防止由于网络分区导致的集群状态不一致。 消息处理:通过ejabberd和kafka相连接,实现了消息的...

    erlang mnesia 数据库基本查询

    Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。下面的内容将着重说明 如何做 Mnesia ...

    Erlang6大数据存储方式总结

    个人学习Erlang对于Erlang处理数据的各种方式的总结,讲述编程语言Erlang的ets,dets,mnesia,mysql,dict,和进程字典的用法,希望能帮助读者在这个总结里学到一些东西.

Global site tag (gtag.js) - Google Analytics