`
langzhe
  • 浏览: 286787 次
  • 性别: 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
分享到:
评论

相关推荐

    Mnesia用户手册.zip

    3. 表模式:Mnesia支持多种表类型,如简单记录(flat files)、行链接表(linked-in disk tables)和内存表(RAM tables)。这些不同的表类型可以根据性能和持久性需求进行选择。 4. 查询语言:Mnesia提供了一个...

    Mnesia 用户手册中文版 pdf

    Mnesia的系统信息部分涵盖了数据库配置数据、内核转储、表转储、检查点、文件操作以及在启动时加载表等。Mnesia还具备从通信失败中恢复、事务恢复、备份、回滚和灾难恢复等功能。 除此之外,Mnesia支持与SNMP(简单...

    Mnesia用户手册(docx版)

    - **数据模型**:Mnesia 支持两种主要的数据模型:*正交表(Table)* 和 *活动数据表(Active Data Table, ADT)*。正交表用于存储静态数据,而ADT则用于动态数据,支持实时更新和查询。 - **启动 Mnesia**:启动...

    Mnesia table fragmentation 过程及算法分析

    Mnesia 是一个分布式数据库管理系统,它是 Erlang 语言环境的一部分,专门设计用于在分布式系统中存储和查询数据。随着业务需求的增长,单个 Mnesia 表的大小和性能可能会成为瓶颈。为了解决这个问题,Mnesia 提供了...

    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数据库文档

    7. **安全性**:Mnesia通过权限管理机制确保数据的安全性和完整性,防止未经授权的访问或修改。 8. **灵活性**:Mnesia支持多种存储引擎,包括内存、磁盘和复制等,可以根据不同的应用场景选择最合适的存储方式。 ...

    Erlang Mnesia

    - 为了提高可用性和性能,Mnesia 允许将数据复制到多个节点上,并支持数据分片,即把数据分布到不同的物理节点上,以实现负载均衡和扩展性。 **3. 查询语言** - Mnesia 提供了一种基于SQL的查询语言,称为QL,它...

    Mnesia用户手册 4.4.10版.rar

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

    Erlang6大数据存储方式总结

    通过《ets数据结构总结1.txt》和《ets数据结构总结2-Mnesia.txt》,你可以深入了解ETS的各类数据结构及其在连接外部数据库(如《ets数据结构总结3-连接外部数据库.txt》中提到的MySQL)时的应用场景和策略。...

    Mnesia Overview

    - **高性能的数据处理能力**:通过紧密集成Erlang语言特性,Mnesia能够在保证高吞吐量的同时,提供低延迟的数据访问能力。 #### 四、Mnesia的独特之处 与其他传统的数据库管理系统相比,Mnesia具有以下几个显著的...

    备忘录:Mnesia分布式数据库的简单+强大接口

    Mnesia支持两种数据类型:表和记录。表类似于关系数据库中的表格,而记录则类似于结构化的数据对象。此外,Mnesia还提供了一些特定的数据模式,如SET、Bag和Ordered Set,以适应不同的数据访问模式。 5. **事务**...

    mnesia_pg:Postgres后端通过mnesia_ext到Mnesia

    Mnesia_ext是Mnesia的一个扩展,它允许添加自定义的数据存储后端。这个项目可能涉及在Mnesia和PostgreSQL之间建立桥梁,使得Erlang应用能够利用PostgreSQL的强大功能,同时保持Mnesia的分布式事务和实时性。 **描述...

    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...

Global site tag (gtag.js) - Google Analytics