From 223f0c4ac881e0cbdc1333cc6bbf8a6d974e93f0 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 18 Jul 2018 14:01:29 +0300 Subject: [PATCH] Initial SQL auto-update version --- rebar.config | 1 + sql/lite.new.sql | 423 ------------------ sql/lite.sql | 391 ----------------- sql/mssql.sql | 559 ------------------------ sql/mysql.new.sql | 439 ------------------- sql/mysql.sql | 407 ------------------ sql/pg.new.sql | 591 -------------------------- sql/pg.sql | 411 ------------------ src/ejabberd_auth_sql.erl | 3 +- src/ejabberd_oauth_sql.erl | 2 +- src/ejabberd_router_sql.erl | 21 +- src/ejabberd_sm_sql.erl | 18 +- src/ejabberd_sql.erl | 30 +- src/ejabberd_sql_schema.erl | 386 +++++++++++++++++ src/ejabberd_sql_sup.erl | 52 +-- src/gen_mod.erl | 2 +- src/mod_admin_update_sql.erl | 361 ---------------- src/mod_announce_sql.erl | 4 +- src/mod_bosh_sql.erl | 21 +- src/mod_caps_sql.erl | 4 +- src/mod_carboncopy_sql.erl | 7 +- src/mod_last_sql.erl | 4 +- src/mod_mam_sql.erl | 4 +- src/mod_muc_sql.erl | 7 +- src/mod_offline_sql.erl | 4 +- src/mod_privacy_sql.erl | 4 +- src/mod_private_sql.erl | 4 +- src/mod_proxy65_sql.erl | 24 +- src/mod_pubsub.erl | 11 + src/mod_push_sql.erl | 4 +- src/mod_roster_sql.erl | 4 +- src/mod_shared_roster_sql.erl | 4 +- src/mod_vcard_sql.erl | 4 +- test/ejabberd_SUITE.erl | 107 +---- test/ejabberd_SUITE_data/ejabberd.yml | 1 + 35 files changed, 535 insertions(+), 3784 deletions(-) delete mode 100644 sql/lite.new.sql delete mode 100644 sql/lite.sql delete mode 100644 sql/mssql.sql delete mode 100644 sql/mysql.new.sql delete mode 100644 sql/mysql.sql delete mode 100644 sql/pg.new.sql delete mode 100644 sql/pg.sql create mode 100644 src/ejabberd_sql_schema.erl delete mode 100644 src/mod_admin_update_sql.erl diff --git a/rebar.config b/rebar.config index 4a32eac44..7f0c60947 100644 --- a/rebar.config +++ b/rebar.config @@ -31,6 +31,7 @@ {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.3"}}}, {jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.8.4"}}}, {eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.6"}}}, + {sql_codec, ".*", {git, "https://github.com/zinid/sql_codec.git"}}, {if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.23"}}}}, {if_var_true, sip, {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.24"}}}}, {if_var_true, mysql, {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", diff --git a/sql/lite.new.sql b/sql/lite.new.sql deleted file mode 100644 index d58d04c77..000000000 --- a/sql/lite.new.sql +++ /dev/null @@ -1,423 +0,0 @@ --- --- ejabberd, Copyright (C) 2002-2017 ProcessOne --- --- This program is free software; you can redistribute it and/or --- modify it under the terms of the GNU General Public License as --- published by the Free Software Foundation; either version 2 of the --- License, or (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- General Public License for more details. --- --- You should have received a copy of the GNU General Public License along --- with this program; if not, write to the Free Software Foundation, Inc., --- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --- - -CREATE TABLE users ( - username text NOT NULL, - server_host text NOT NULL, - password text NOT NULL, - serverkey text NOT NULL DEFAULT '', - salt text NOT NULL DEFAULT '', - iterationcount integer NOT NULL DEFAULT 0, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host, username) -); - - -CREATE TABLE last ( - username text NOT NULL, - server_host text NOT NULL, - seconds text NOT NULL, - state text NOT NULL, - PRIMARY KEY (server_host, username) -); - - -CREATE TABLE rosterusers ( - username text NOT NULL, - server_host text NOT NULL, - jid text NOT NULL, - nick text NOT NULL, - subscription character(1) NOT NULL, - ask character(1) NOT NULL, - askmessage text NOT NULL, - server character(1) NOT NULL, - subscribe text NOT NULL, - type text, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE UNIQUE INDEX i_rosteru_sh_user_jid ON rosterusers (server_host, username, jid); -CREATE INDEX i_rosteru_sh_username ON rosterusers (server_host, username); -CREATE INDEX i_rosteru_sh_jid ON rosterusers (server_host, jid); - - -CREATE TABLE rostergroups ( - username text NOT NULL, - server_host text NOT NULL, - jid text NOT NULL, - grp text NOT NULL -); - -CREATE INDEX i_rosterg_sh_user_jid ON rostergroups (server_host, username, jid); - -CREATE TABLE sr_group ( - name text NOT NULL, - server_host text NOT NULL, - opts text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host, name) -); - -CREATE TABLE sr_user ( - jid text NOT NULL, - server_host text NOT NULL, - grp text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host, jid, grp) -); - -CREATE INDEX i_sr_user_sh_jid ON sr_user (server_host, jid); -CREATE INDEX i_sr_user_sh_grp ON sr_user (server_host, grp); - -CREATE TABLE spool ( - username text NOT NULL, - server_host text NOT NULL, - xml text NOT NULL, - seq INTEGER PRIMARY KEY AUTOINCREMENT, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_spool_sh_username ON spool (server_host, username); - -CREATE TABLE archive ( - username text NOT NULL, - server_host text NOT NULL, - timestamp BIGINT UNSIGNED NOT NULL, - peer text NOT NULL, - bare_peer text NOT NULL, - xml text NOT NULL, - txt text, - id INTEGER PRIMARY KEY AUTOINCREMENT, - kind text, - nick text, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_archive_sh_username_timestamp ON archive (server_host, username, timestamp); -CREATE INDEX i_archive_sh_username_peer ON archive (server_host, username, peer); -CREATE INDEX i_archive_sh_username_bare_peer ON archive (server_host, username, bare_peer); -CREATE INDEX i_archive_sh_timestamp ON archive (server_host, timestamp); - -CREATE TABLE archive_prefs ( - username text NOT NULL, - server_host text NOT NULL, - def text NOT NULL, - always text NOT NULL, - never text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host, username) -); - -CREATE TABLE vcard ( - username text NOT NULL, - server_host text NOT NULL, - vcard text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host, username) -); - -CREATE TABLE vcard_search ( - username text NOT NULL, - lusername text NOT NULL, - server_host text NOT NULL, - fn text NOT NULL, - lfn text NOT NULL, - family text NOT NULL, - lfamily text NOT NULL, - given text NOT NULL, - lgiven text NOT NULL, - middle text NOT NULL, - lmiddle text NOT NULL, - nickname text NOT NULL, - lnickname text NOT NULL, - bday text NOT NULL, - lbday text NOT NULL, - ctry text NOT NULL, - lctry text NOT NULL, - locality text NOT NULL, - llocality text NOT NULL, - email text NOT NULL, - lemail text NOT NULL, - orgname text NOT NULL, - lorgname text NOT NULL, - orgunit text NOT NULL, - lorgunit text NOT NULL, - PRIMARY KEY (server_host, lusername) -); - -CREATE INDEX i_vcard_search_sh_lfn ON vcard_search(server_host, lfn); -CREATE INDEX i_vcard_search_sh_lfamily ON vcard_search(server_host, lfamily); -CREATE INDEX i_vcard_search_sh_lgiven ON vcard_search(server_host, lgiven); -CREATE INDEX i_vcard_search_sh_lmiddle ON vcard_search(server_host, lmiddle); -CREATE INDEX i_vcard_search_sh_lnickname ON vcard_search(server_host, lnickname); -CREATE INDEX i_vcard_search_sh_lbday ON vcard_search(server_host, lbday); -CREATE INDEX i_vcard_search_sh_lctry ON vcard_search(server_host, lctry); -CREATE INDEX i_vcard_search_sh_llocality ON vcard_search(server_host, llocality); -CREATE INDEX i_vcard_search_sh_lemail ON vcard_search(server_host, lemail); -CREATE INDEX i_vcard_search_sh_lorgname ON vcard_search(server_host, lorgname); -CREATE INDEX i_vcard_search_sh_lorgunit ON vcard_search(server_host, lorgunit); - -CREATE TABLE privacy_default_list ( - username text NOT NULL, - server_host text NOT NULL, - name text NOT NULL, - PRIMARY KEY (server_host, username) -); - -CREATE TABLE privacy_list ( - username text NOT NULL, - server_host text NOT NULL, - name text NOT NULL, - id INTEGER PRIMARY KEY AUTOINCREMENT, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_privacy_list_sh_username ON privacy_list (server_host, username); -CREATE UNIQUE INDEX i_privacy_list_sh_username_name ON privacy_list (server_host, username, name); - -CREATE TABLE privacy_list_data ( - id bigint REFERENCES privacy_list(id) ON DELETE CASCADE, - t character(1) NOT NULL, - value text NOT NULL, - action character(1) NOT NULL, - ord NUMERIC NOT NULL, - match_all boolean NOT NULL, - match_iq boolean NOT NULL, - match_message boolean NOT NULL, - match_presence_in boolean NOT NULL, - match_presence_out boolean NOT NULL -); - -CREATE TABLE private_storage ( - username text NOT NULL, - server_host text NOT NULL, - namespace text NOT NULL, - data text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host, username, namespace) -); - -CREATE INDEX i_private_storage_sh_username ON private_storage (server_host, username); - - -CREATE TABLE roster_version ( - username text NOT NULL, - server_host text NOT NULL, - version text NOT NULL, - PRIMARY KEY (server_host, username) -); - -CREATE TABLE pubsub_node ( - host text NOT NULL, - node text NOT NULL, - parent text NOT NULL DEFAULT '', - plugin text NOT NULL, - nodeid INTEGER PRIMARY KEY AUTOINCREMENT -); -CREATE INDEX i_pubsub_node_parent ON pubsub_node (parent); -CREATE UNIQUE INDEX i_pubsub_node_tuple ON pubsub_node (host, node); - -CREATE TABLE pubsub_node_option ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - name text NOT NULL, - val text NOT NULL -); -CREATE INDEX i_pubsub_node_option_nodeid ON pubsub_node_option (nodeid); - -CREATE TABLE pubsub_node_owner ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - owner text NOT NULL -); -CREATE INDEX i_pubsub_node_owner_nodeid ON pubsub_node_owner (nodeid); - -CREATE TABLE pubsub_state ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - jid text NOT NULL, - affiliation character(1), - subscriptions text NOT NULL DEFAULT '', - stateid INTEGER PRIMARY KEY AUTOINCREMENT -); -CREATE INDEX i_pubsub_state_jid ON pubsub_state (jid); -CREATE UNIQUE INDEX i_pubsub_state_tuple ON pubsub_state (nodeid, jid); - -CREATE TABLE pubsub_item ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - itemid text NOT NULL, - publisher text NOT NULL, - creation varchar(32) NOT NULL, - modification varchar(32) NOT NULL, - payload text NOT NULL DEFAULT '' -); -CREATE INDEX i_pubsub_item_itemid ON pubsub_item (itemid); -CREATE UNIQUE INDEX i_pubsub_item_tuple ON pubsub_item (nodeid, itemid); - - CREATE TABLE pubsub_subscription_opt ( - subid text NOT NULL, - opt_name varchar(32), - opt_value text NOT NULL -); -CREATE UNIQUE INDEX i_pubsub_subscription_opt ON pubsub_subscription_opt (subid, opt_name); - -CREATE TABLE muc_room ( - name text NOT NULL, - server_host text NOT NULL, - host text NOT NULL, - opts text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room (name, host); - -CREATE TABLE muc_registered ( - jid text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - nick text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_muc_registered_nick ON muc_registered (nick); -CREATE UNIQUE INDEX i_muc_registered_jid_host ON muc_registered (jid, host); - -CREATE TABLE muc_online_room ( - name text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL -); - -CREATE UNIQUE INDEX i_muc_online_room_name_host ON muc_online_room (name, host); - -CREATE TABLE muc_online_users ( - username text NOT NULL, - server text NOT NULL, - resource text NOT NULL, - name text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - node text NOT NULL -); - -CREATE UNIQUE INDEX i_muc_online_users ON muc_online_users (username, server, resource, name, host); -CREATE INDEX i_muc_online_users_us ON muc_online_users (username, server); - -CREATE TABLE muc_room_subscribers ( - room text NOT NULL, - host text NOT NULL, - jid text NOT NULL, - nick text NOT NULL, - nodes text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers(host, jid); -CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers(host, room, jid); - -CREATE TABLE motd ( - username text NOT NULL, - server_host text NOT NULL, - xml text, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host, username) -); - -CREATE TABLE caps_features ( - node text NOT NULL, - subnode text NOT NULL, - feature text, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_caps_features_node_subnode ON caps_features (node, subnode); - -CREATE TABLE sm ( - usec bigint NOT NULL, - pid text NOT NULL, - node text NOT NULL, - username text NOT NULL, - server_host text NOT NULL, - resource text NOT NULL, - priority text NOT NULL, - info text NOT NULL, - PRIMARY KEY (usec, pid) -); - -CREATE INDEX i_sm_node ON sm(node); -CREATE INDEX i_sm_sh_username ON sm (server_host, username); - -CREATE TABLE oauth_token ( - token text NOT NULL PRIMARY KEY, - jid text NOT NULL, - scope text NOT NULL, - expire bigint NOT NULL -); - -CREATE TABLE route ( - domain text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL, - local_hint text NOT NULL -); - -CREATE UNIQUE INDEX i_route ON route(domain, server_host, node, pid); -CREATE INDEX i_route_domain ON route(domain); - -CREATE TABLE bosh ( - sid text NOT NULL, - node text NOT NULL, - pid text NOT NULL -); - -CREATE UNIQUE INDEX i_bosh_sid ON bosh(sid); - -CREATE TABLE carboncopy ( - username text NOT NULL, - server_host text NOT NULL, - resource text NOT NULL, - namespace text NOT NULL, - node text NOT NULL, - PRIMARY KEY (server_host, username, resource) -); - -CREATE INDEX i_carboncopy_sh_user ON carboncopy (server_host, username); - -CREATE TABLE proxy65 ( - sid text NOT NULL, - pid_t text NOT NULL, - pid_i text NOT NULL, - node_t text NOT NULL, - node_i text NOT NULL, - jid_i text NOT NULL -); - -CREATE UNIQUE INDEX i_proxy65_sid ON proxy65 (sid); -CREATE INDEX i_proxy65_jid ON proxy65 (jid_i); - -CREATE TABLE push_session ( - username text NOT NULL, - server_host text NOT NULL, - timestamp bigint NOT NULL, - service text NOT NULL, - node text NOT NULL, - xml text NOT NULL, - PRIMARY KEY (server_host, username, timestamp) -); - -CREATE UNIQUE INDEX i_push_session_susn ON push_session (server_host, username, service, node); diff --git a/sql/lite.sql b/sql/lite.sql deleted file mode 100644 index abb25d5b4..000000000 --- a/sql/lite.sql +++ /dev/null @@ -1,391 +0,0 @@ --- --- ejabberd, Copyright (C) 2002-2017 ProcessOne --- --- This program is free software; you can redistribute it and/or --- modify it under the terms of the GNU General Public License as --- published by the Free Software Foundation; either version 2 of the --- License, or (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- General Public License for more details. --- --- You should have received a copy of the GNU General Public License along --- with this program; if not, write to the Free Software Foundation, Inc., --- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --- - -CREATE TABLE users ( - username text PRIMARY KEY, - password text NOT NULL, - serverkey text NOT NULL DEFAULT '', - salt text NOT NULL DEFAULT '', - iterationcount integer NOT NULL DEFAULT 0, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - - -CREATE TABLE last ( - username text PRIMARY KEY, - seconds text NOT NULL, - state text NOT NULL -); - - -CREATE TABLE rosterusers ( - username text NOT NULL, - jid text NOT NULL, - nick text NOT NULL, - subscription character(1) NOT NULL, - ask character(1) NOT NULL, - askmessage text NOT NULL, - server character(1) NOT NULL, - subscribe text NOT NULL, - type text, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE UNIQUE INDEX i_rosteru_user_jid ON rosterusers (username, jid); -CREATE INDEX i_rosteru_username ON rosterusers (username); -CREATE INDEX i_rosteru_jid ON rosterusers (jid); - - -CREATE TABLE rostergroups ( - username text NOT NULL, - jid text NOT NULL, - grp text NOT NULL -); - -CREATE INDEX pk_rosterg_user_jid ON rostergroups (username, jid); - -CREATE TABLE sr_group ( - name text NOT NULL, - opts text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE sr_user ( - jid text NOT NULL, - grp text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE UNIQUE INDEX i_sr_user_jid_grp ON sr_user (jid, grp); -CREATE INDEX i_sr_user_jid ON sr_user (jid); -CREATE INDEX i_sr_user_grp ON sr_user (grp); - -CREATE TABLE spool ( - username text NOT NULL, - xml text NOT NULL, - seq INTEGER PRIMARY KEY AUTOINCREMENT, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_despool ON spool (username); - -CREATE TABLE archive ( - username text NOT NULL, - timestamp BIGINT UNSIGNED NOT NULL, - peer text NOT NULL, - bare_peer text NOT NULL, - xml text NOT NULL, - txt text, - id INTEGER PRIMARY KEY AUTOINCREMENT, - kind text, - nick text, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_username_timestamp ON archive(username, timestamp); -CREATE INDEX i_archive_username_peer ON archive (username, peer); -CREATE INDEX i_archive_username_bare_peer ON archive (username, bare_peer); -CREATE INDEX i_timestamp ON archive(timestamp); - -CREATE TABLE archive_prefs ( - username text NOT NULL PRIMARY KEY, - def text NOT NULL, - always text NOT NULL, - never text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE vcard ( - username text PRIMARY KEY, - vcard text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE vcard_search ( - username text NOT NULL, - lusername text PRIMARY KEY, - fn text NOT NULL, - lfn text NOT NULL, - family text NOT NULL, - lfamily text NOT NULL, - given text NOT NULL, - lgiven text NOT NULL, - middle text NOT NULL, - lmiddle text NOT NULL, - nickname text NOT NULL, - lnickname text NOT NULL, - bday text NOT NULL, - lbday text NOT NULL, - ctry text NOT NULL, - lctry text NOT NULL, - locality text NOT NULL, - llocality text NOT NULL, - email text NOT NULL, - lemail text NOT NULL, - orgname text NOT NULL, - lorgname text NOT NULL, - orgunit text NOT NULL, - lorgunit text NOT NULL -); - -CREATE INDEX i_vcard_search_lfn ON vcard_search(lfn); -CREATE INDEX i_vcard_search_lfamily ON vcard_search(lfamily); -CREATE INDEX i_vcard_search_lgiven ON vcard_search(lgiven); -CREATE INDEX i_vcard_search_lmiddle ON vcard_search(lmiddle); -CREATE INDEX i_vcard_search_lnickname ON vcard_search(lnickname); -CREATE INDEX i_vcard_search_lbday ON vcard_search(lbday); -CREATE INDEX i_vcard_search_lctry ON vcard_search(lctry); -CREATE INDEX i_vcard_search_llocality ON vcard_search(llocality); -CREATE INDEX i_vcard_search_lemail ON vcard_search(lemail); -CREATE INDEX i_vcard_search_lorgname ON vcard_search(lorgname); -CREATE INDEX i_vcard_search_lorgunit ON vcard_search(lorgunit); - -CREATE TABLE privacy_default_list ( - username text PRIMARY KEY, - name text NOT NULL -); - -CREATE TABLE privacy_list ( - username text NOT NULL, - name text NOT NULL, - id INTEGER PRIMARY KEY AUTOINCREMENT, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_privacy_list_username ON privacy_list (username); -CREATE UNIQUE INDEX i_privacy_list_username_name ON privacy_list (username, name); - -CREATE TABLE privacy_list_data ( - id bigint REFERENCES privacy_list(id) ON DELETE CASCADE, - t character(1) NOT NULL, - value text NOT NULL, - action character(1) NOT NULL, - ord NUMERIC NOT NULL, - match_all boolean NOT NULL, - match_iq boolean NOT NULL, - match_message boolean NOT NULL, - match_presence_in boolean NOT NULL, - match_presence_out boolean NOT NULL -); - -CREATE TABLE private_storage ( - username text NOT NULL, - namespace text NOT NULL, - data text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_private_storage_username ON private_storage (username); -CREATE UNIQUE INDEX i_private_storage_username_namespace ON private_storage (username, namespace); - - -CREATE TABLE roster_version ( - username text PRIMARY KEY, - version text NOT NULL -); - -CREATE TABLE pubsub_node ( - host text NOT NULL, - node text NOT NULL, - parent text NOT NULL DEFAULT '', - plugin text NOT NULL, - nodeid INTEGER PRIMARY KEY AUTOINCREMENT -); -CREATE INDEX i_pubsub_node_parent ON pubsub_node (parent); -CREATE UNIQUE INDEX i_pubsub_node_tuple ON pubsub_node (host, node); - -CREATE TABLE pubsub_node_option ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - name text NOT NULL, - val text NOT NULL -); -CREATE INDEX i_pubsub_node_option_nodeid ON pubsub_node_option (nodeid); - -CREATE TABLE pubsub_node_owner ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - owner text NOT NULL -); -CREATE INDEX i_pubsub_node_owner_nodeid ON pubsub_node_owner (nodeid); - -CREATE TABLE pubsub_state ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - jid text NOT NULL, - affiliation character(1), - subscriptions text NOT NULL DEFAULT '', - stateid INTEGER PRIMARY KEY AUTOINCREMENT -); -CREATE INDEX i_pubsub_state_jid ON pubsub_state (jid); -CREATE UNIQUE INDEX i_pubsub_state_tuple ON pubsub_state (nodeid, jid); - -CREATE TABLE pubsub_item ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - itemid text NOT NULL, - publisher text NOT NULL, - creation varchar(32) NOT NULL, - modification varchar(32) NOT NULL, - payload text NOT NULL DEFAULT '' -); -CREATE INDEX i_pubsub_item_itemid ON pubsub_item (itemid); -CREATE UNIQUE INDEX i_pubsub_item_tuple ON pubsub_item (nodeid, itemid); - - CREATE TABLE pubsub_subscription_opt ( - subid text NOT NULL, - opt_name varchar(32), - opt_value text NOT NULL -); -CREATE UNIQUE INDEX i_pubsub_subscription_opt ON pubsub_subscription_opt (subid, opt_name); - -CREATE TABLE muc_room ( - name text NOT NULL, - host text NOT NULL, - opts text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room (name, host); - -CREATE TABLE muc_registered ( - jid text NOT NULL, - host text NOT NULL, - nick text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_muc_registered_nick ON muc_registered (nick); -CREATE UNIQUE INDEX i_muc_registered_jid_host ON muc_registered (jid, host); - -CREATE TABLE muc_online_room ( - name text NOT NULL, - host text NOT NULL, - node text NOT NULL, - pid text NOT NULL -); - -CREATE UNIQUE INDEX i_muc_online_room_name_host ON muc_online_room (name, host); - -CREATE TABLE muc_online_users ( - username text NOT NULL, - server text NOT NULL, - resource text NOT NULL, - name text NOT NULL, - host text NOT NULL, - node text NOT NULL -); - -CREATE UNIQUE INDEX i_muc_online_users ON muc_online_users (username, server, resource, name, host); -CREATE INDEX i_muc_online_users_us ON muc_online_users (username, server); - -CREATE TABLE muc_room_subscribers ( - room text NOT NULL, - host text NOT NULL, - jid text NOT NULL, - nick text NOT NULL, - nodes text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers(host, jid); -CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers(host, room, jid); - -CREATE TABLE motd ( - username text PRIMARY KEY, - xml text, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE caps_features ( - node text NOT NULL, - subnode text NOT NULL, - feature text, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX i_caps_features_node_subnode ON caps_features (node, subnode); - -CREATE TABLE sm ( - usec bigint NOT NULL, - pid text NOT NULL, - node text NOT NULL, - username text NOT NULL, - resource text NOT NULL, - priority text NOT NULL, - info text NOT NULL -); - -CREATE UNIQUE INDEX i_sm_sid ON sm(usec, pid); -CREATE INDEX i_sm_node ON sm(node); -CREATE INDEX i_sm_username ON sm(username); - -CREATE TABLE oauth_token ( - token text NOT NULL PRIMARY KEY, - jid text NOT NULL, - scope text NOT NULL, - expire bigint NOT NULL -); - -CREATE TABLE route ( - domain text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL, - local_hint text NOT NULL -); - -CREATE UNIQUE INDEX i_route ON route(domain, server_host, node, pid); -CREATE INDEX i_route_domain ON route(domain); - -CREATE TABLE bosh ( - sid text NOT NULL, - node text NOT NULL, - pid text NOT NULL -); - -CREATE UNIQUE INDEX i_bosh_sid ON bosh(sid); - -CREATE TABLE carboncopy ( - username text NOT NULL, - resource text NOT NULL, - namespace text NOT NULL, - node text NOT NULL -); - -CREATE UNIQUE INDEX i_carboncopy_ur ON carboncopy (username, resource); -CREATE INDEX i_carboncopy_user ON carboncopy (username); - -CREATE TABLE proxy65 ( - sid text NOT NULL, - pid_t text NOT NULL, - pid_i text NOT NULL, - node_t text NOT NULL, - node_i text NOT NULL, - jid_i text NOT NULL -); - -CREATE UNIQUE INDEX i_proxy65_sid ON proxy65 (sid); -CREATE INDEX i_proxy65_jid ON proxy65 (jid_i); - -CREATE TABLE push_session ( - username text NOT NULL, - timestamp bigint NOT NULL, - service text NOT NULL, - node text NOT NULL, - xml text NOT NULL -); - -CREATE UNIQUE INDEX i_push_usn ON push_session (username, service, node); -CREATE UNIQUE INDEX i_push_ut ON push_session (username, timestamp); diff --git a/sql/mssql.sql b/sql/mssql.sql deleted file mode 100644 index c6a89311f..000000000 --- a/sql/mssql.sql +++ /dev/null @@ -1,559 +0,0 @@ --- --- ejabberd, Copyright (C) 2002-2017 ProcessOne --- --- This program is free software; you can redistribute it and/or --- modify it under the terms of the GNU General Public License as --- published by the Free Software Foundation; either version 2 of the --- License, or (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- General Public License for more details. --- --- You should have received a copy of the GNU General Public License along --- with this program; if not, write to the Free Software Foundation, Inc., --- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --- - -SET ANSI_PADDING OFF; -SET ANSI_NULLS ON; -SET QUOTED_IDENTIFIER ON; -SET ANSI_PADDING ON; - -CREATE TABLE [dbo].[archive] ( - [username] [varchar] (250) NOT NULL, - [timestamp] [bigint] NOT NULL, - [peer] [varchar] (250) NOT NULL, - [bare_peer] [varchar] (250) NOT NULL, - [xml] [text] NOT NULL, - [txt] [text] NULL, - [id] [bigint] IDENTITY(1,1) NOT NULL, - [kind] [varchar] (10) NULL, - [nick] [varchar] (250) NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [archive_PK] PRIMARY KEY CLUSTERED -( - [id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE INDEX [archive_username_timestamp] ON [archive] (username, timestamp) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [archive_username_peer] ON [archive] (username, peer) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [archive_username_bare_peer] ON [archive] (username, bare_peer) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [archive_timestamp] ON [archive] (timestamp) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[archive_prefs] ( - [username] [varchar] (250) NOT NULL, - [def] [text] NOT NULL, - [always] [text] NOT NULL, - [never] [text] NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [archive_prefs_PRIMARY] PRIMARY KEY CLUSTERED -( - [username] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[caps_features] ( - [node] [varchar] (250) NOT NULL, - [subnode] [varchar] (250) NOT NULL, - [feature] [text] NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE() -) TEXTIMAGE_ON [PRIMARY]; - -CREATE CLUSTERED INDEX [caps_features_node_subnode] ON [caps_features] (node, subnode) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[last] ( - [username] [varchar] (250) NOT NULL, - [seconds] [text] NOT NULL, - [state] [text] NOT NULL, - CONSTRAINT [last_PRIMARY] PRIMARY KEY CLUSTERED -( - [username] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[motd] ( - [username] [varchar] (250) NOT NULL, - [xml] [text] NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [motd_PRIMARY] PRIMARY KEY CLUSTERED -( - [username] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[muc_registered] ( - [jid] [varchar] (255) NOT NULL, - [host] [varchar] (255) NOT NULL, - [nick] [varchar] (255) NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE() -); - -CREATE INDEX [muc_registered_nick] ON [muc_registered] (nick) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE UNIQUE CLUSTERED INDEX [muc_registered_jid_host] ON [muc_registered] (jid, host) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[muc_room] ( - [name] [varchar] (250) NOT NULL, - [host] [varchar] (250) NOT NULL, - [opts] [text] NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE() -) TEXTIMAGE_ON [PRIMARY]; - -CREATE UNIQUE CLUSTERED INDEX [muc_room_name_host] ON [muc_room] (name, host) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[muc_online_room] ( - [name] [varchar] (250) NOT NULL, - [host] [varchar] (250) NOT NULL, - [node] [text] NOT NULL, - [pid] [text] NOT NULL -); - -CREATE UNIQUE CLUSTERED INDEX [muc_online_room_name_host] ON [muc_online_room] (name, host) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[muc_online_users] ( - [username] [varchar] (250) NOT NULL, - [server] [varchar] (250) NOT NULL, - [resource] [varchar] (250) NOT NULL, - [name] [varchar] (250) NOT NULL, - [host] [varchar] (250) NOT NULL, - node text NOT NULL -); - -CREATE UNIQUE CLUSTERED INDEX [muc_online_users_i] ON [muc_online_users] (username, server, resource, name, host) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); -CREATE UNIQUE CLUSTERED INDEX [muc_online_users_us] ON [muc_online_users] (username, server); -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[muc_room_subscribers] ( - [room] [varchar] (191) NOT NULL, - [host] [varchar] (191) NOT NULL, - [jid] [varchar] (191) NOT NULL, - [nick] [text] NOT NULL, - [nodes] [text] NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE() -); - -CREATE UNIQUE CLUSTERED INDEX [muc_room_subscribers_host_room_jid] ON [muc_room_subscribers] (host, room, jid); -CREATE INDEX [muc_room_subscribers_host_jid] ON [muc_room_subscribers] (host, jid); - -CREATE TABLE [dbo].[privacy_default_list] ( - [username] [varchar] (250) NOT NULL, - [name] [varchar] (250) NOT NULL, - CONSTRAINT [privacy_default_list_PRIMARY] PRIMARY KEY CLUSTERED -( - [username] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -); - -CREATE TABLE [dbo].[privacy_list] ( - [username] [varchar] (250) NOT NULL, - [name] [varchar] (250) NOT NULL, - [id] [bigint] IDENTITY(1,1) NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [privacy_list_PK] PRIMARY KEY CLUSTERED -( - [id] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -); - -CREATE INDEX [privacy_list_username] ON [privacy_list] (username) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE UNIQUE INDEX [privacy_list_username_name] ON [privacy_list] (username, name) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[privacy_list_data] ( - [id] [bigint] NULL, - [t] [char] (1) NOT NULL, - [value] [text] NOT NULL, - [action] [char] (1) NOT NULL, - [ord] [smallint] NOT NULL, - [match_all] [smallint] NOT NULL, - [match_iq] [smallint] NOT NULL, - [match_message] [smallint] NOT NULL, - [match_presence_in] [smallint] NOT NULL, - [match_presence_out] [smallint] NOT NULL -) TEXTIMAGE_ON [PRIMARY]; - -CREATE CLUSTERED INDEX [privacy_list_data_id] ON [privacy_list_data] (id) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[private_storage] ( - [username] [varchar] (250) NOT NULL, - [namespace] [varchar] (250) NOT NULL, - [data] [text] NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE() -) TEXTIMAGE_ON [PRIMARY]; - -CREATE INDEX [private_storage_username] ON [private_storage] (username) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE UNIQUE CLUSTERED INDEX [private_storage_username_namespace] ON [private_storage] (username, namespace) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[pubsub_item] ( - [nodeid] [bigint] NULL, - [itemid] [varchar] (255) NOT NULL, - [publisher] [text] NOT NULL, - [creation] [varchar] (32) NOT NULL, - [modification] [varchar] (32) NOT NULL, - [payload] [text] NOT NULL DEFAULT '' -) TEXTIMAGE_ON [PRIMARY]; - -CREATE INDEX [pubsub_item_itemid] ON [pubsub_item] (itemid) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE UNIQUE CLUSTERED INDEX [pubsub_item_nodeid_itemid] ON [pubsub_item] (nodeid, itemid) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[pubsub_node_option] ( - [nodeid] [bigint] NULL, - [name] [text] NOT NULL, - [val] [text] NOT NULL -) TEXTIMAGE_ON [PRIMARY]; - -CREATE CLUSTERED INDEX [pubsub_node_option_nodeid] ON [pubsub_node_option] (nodeid) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[pubsub_node_owner] ( - [nodeid] [bigint] NULL, - [owner] [text] NOT NULL -) TEXTIMAGE_ON [PRIMARY]; - -CREATE CLUSTERED INDEX [pubsub_node_owner_nodeid] ON [pubsub_node_owner] (nodeid) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[pubsub_state] ( - [nodeid] [bigint] NULL, - [jid] [varchar] (255) NOT NULL, - [affiliation] [char] (1) NOT NULL, - [subscriptions] [text] NOT NULL DEFAULT '', - [stateid] [bigint] IDENTITY(1,1) NOT NULL, - CONSTRAINT [pubsub_state_PRIMARY] PRIMARY KEY CLUSTERED -( - [stateid] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE INDEX [pubsub_state_jid] ON [pubsub_state] (jid) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE UNIQUE INDEX [pubsub_state_nodeid_jid] ON [pubsub_state] (nodeid, jid) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[pubsub_subscription_opt] ( - [subid] [varchar] (255) NOT NULL, - [opt_name] [varchar] (32) NOT NULL, - [opt_value] [text] NOT NULL -) TEXTIMAGE_ON [PRIMARY]; - -CREATE UNIQUE CLUSTERED INDEX [pubsub_subscription_opt_subid_opt_name] ON [pubsub_subscription_opt] (subid, opt_name) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[pubsub_node] ( - [host] [varchar] (255) NOT NULL, - [node] [varchar] (255) NOT NULL, - [parent] [varchar] (255) NOT NULL DEFAULT '', - [plugin] [text] NOT NULL, - [nodeid] [bigint] IDENTITY(1,1) NOT NULL, - CONSTRAINT [pubsub_node_PRIMARY] PRIMARY KEY CLUSTERED -( - [nodeid] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE INDEX [pubsub_node_parent] ON [pubsub_node] (parent) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE UNIQUE INDEX [pubsub_node_host_node] ON [pubsub_node] (host, node) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[roster_version] ( - [username] [varchar] (250) NOT NULL, - [version] [text] NOT NULL, - CONSTRAINT [roster_version_PRIMARY] PRIMARY KEY CLUSTERED -( - [username] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[rostergroups] ( - [username] [varchar] (250) NOT NULL, - [jid] [varchar] (250) NOT NULL, - [grp] [text] NOT NULL -) TEXTIMAGE_ON [PRIMARY]; - -CREATE CLUSTERED INDEX [rostergroups_username_jid] ON [rostergroups] ([username], [jid]) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[rosterusers] ( - [username] [varchar] (250) NOT NULL, - [jid] [varchar] (250) NOT NULL, - [nick] [text] NOT NULL, - [subscription] [char] (1) NOT NULL, - [ask] [char] (1) NOT NULL, - [askmessage] [text] NOT NULL, - [server] [char] (1) NOT NULL, - [subscribe] [text] NOT NULL, - [type] [text] NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE() -) TEXTIMAGE_ON [PRIMARY]; - -CREATE UNIQUE CLUSTERED INDEX [rosterusers_username_jid] ON [rosterusers] ([username], [jid]) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [rosterusers_username] ON [rosterusers] ([username]) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [rosterusers_jid] ON [rosterusers] ([jid]) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[sm] ( - [usec] [bigint] NOT NULL, - [pid] [varchar] (100) NOT NULL, - [node] [varchar] (255) NOT NULL, - [username] [varchar] (255) NOT NULL, - [resource] [varchar] (255) NOT NULL, - [priority] [text] NOT NULL, - [info] [text] NOT NULL -) TEXTIMAGE_ON [PRIMARY]; - -CREATE UNIQUE CLUSTERED INDEX [sm_sid] ON [sm] (usec, pid) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [sm_node] ON [sm] (node) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [sm_username] ON [sm] (username) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[spool] ( - [username] [varchar] (250) NOT NULL, - [xml] [text] NOT NULL, - [seq] [bigint] IDENTITY(1,1) NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [spool_PK] PRIMARY KEY CLUSTERED -( - [seq] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE INDEX [spool_username] ON [spool] (username) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [spool_created_at] ON [spool] (created_at) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -; - -CREATE TABLE [dbo].[sr_group] ( - [name] [varchar] (250) NOT NULL, - [opts] [text] NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [sr_group_PRIMARY] PRIMARY KEY CLUSTERED -( - [name] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[sr_user] ( - [jid] [varchar] (250) NOT NULL, - [grp] [varchar] (250) NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE() -); - -CREATE UNIQUE CLUSTERED INDEX [sr_user_jid_group] ON [sr_user] ([jid], [grp]) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [sr_user_jid] ON [sr_user] ([jid]) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [sr_user_grp] ON [sr_user] ([grp]) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[users] ( - [username] [varchar] (250) NOT NULL, - [password] [text] NOT NULL, - [serverkey] [text] NOT NULL DEFAULT '', - [salt] [text] NOT NULL DEFAULT '', - [iterationcount] [smallint] NOT NULL DEFAULT 0, - [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [users_PRIMARY] PRIMARY KEY CLUSTERED -( - [username] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[vcard] ( - [username] [varchar] (250) NOT NULL, - [vcard] [text] NOT NULL, - [created_at] [datetime] NOT NULL DEFAULT GETDATE(), - CONSTRAINT [vcard_PRIMARY] PRIMARY KEY CLUSTERED -( - [username] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[vcard_search] ( - [username] [varchar] (250) NOT NULL, - [lusername] [varchar] (250) NOT NULL, - [fn] [text] NOT NULL, - [lfn] [varchar] (250) NOT NULL, - [family] [text] NOT NULL, - [lfamily] [varchar] (250) NOT NULL, - [given] [text] NOT NULL, - [lgiven] [varchar] (250) NOT NULL, - [middle] [text] NOT NULL, - [lmiddle] [varchar] (250) NOT NULL, - [nickname] [text] NOT NULL, - [lnickname] [varchar] (250) NOT NULL, - [bday] [text] NOT NULL, - [lbday] [varchar] (250) NOT NULL, - [ctry] [text] NOT NULL, - [lctry] [varchar] (250) NOT NULL, - [locality] [text] NOT NULL, - [llocality] [varchar] (250) NOT NULL, - [email] [text] NOT NULL, - [lemail] [varchar] (250) NOT NULL, - [orgname] [text] NOT NULL, - [lorgname] [varchar] (250) NOT NULL, - [orgunit] [text] NOT NULL, - [lorgunit] [varchar] (250) NOT NULL, - CONSTRAINT [vcard_search_PRIMARY] PRIMARY KEY CLUSTERED -( - [lusername] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE INDEX [vcard_search_lfn] ON [vcard_search] (lfn) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lfamily] ON [vcard_search] (lfamily) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lgiven] ON [vcard_search] (lgiven) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lmiddle] ON [vcard_search] (lmiddle) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lnickname] ON [vcard_search] (lnickname) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lbday] ON [vcard_search] (lbday) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lctry] ON [vcard_search] (lctry) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_llocality] ON [vcard_search] (llocality) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lemail] ON [vcard_search] (lemail) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lorgname] ON [vcard_search] (lorgname) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [vcard_search_lorgunit] ON [vcard_search] (lorgunit) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -ALTER TABLE [dbo].[pubsub_item] WITH CHECK ADD CONSTRAINT [pubsub_item_ibfk_1] FOREIGN KEY([nodeid]) -REFERENCES [dbo].[pubsub_node] ([nodeid]) -ON DELETE CASCADE; - -ALTER TABLE [dbo].[pubsub_item] CHECK CONSTRAINT [pubsub_item_ibfk_1]; - -ALTER TABLE [dbo].[pubsub_node_option] WITH CHECK ADD CONSTRAINT [pubsub_node_option_ibfk_1] FOREIGN KEY([nodeid]) -REFERENCES [dbo].[pubsub_node] ([nodeid]) -ON DELETE CASCADE; - -ALTER TABLE [dbo].[pubsub_node_option] CHECK CONSTRAINT [pubsub_node_option_ibfk_1]; - -ALTER TABLE [dbo].[pubsub_node_owner] WITH CHECK ADD CONSTRAINT [pubsub_node_owner_ibfk_1] FOREIGN KEY([nodeid]) -REFERENCES [dbo].[pubsub_node] ([nodeid]) -ON DELETE CASCADE; - -ALTER TABLE [dbo].[pubsub_node_owner] CHECK CONSTRAINT [pubsub_node_owner_ibfk_1]; - -ALTER TABLE [dbo].[pubsub_state] WITH CHECK ADD CONSTRAINT [pubsub_state_ibfk_1] FOREIGN KEY([nodeid]) -REFERENCES [dbo].[pubsub_node] ([nodeid]) -ON DELETE CASCADE; - -ALTER TABLE [dbo].[pubsub_state] CHECK CONSTRAINT [pubsub_state_ibfk_1]; - -CREATE TABLE [dbo].[oauth_token] ( - [token] [varchar] (250) NOT NULL, - [jid] [text] NOT NULL, - [scope] [text] NOT NULL, - [expire] [bigint] NOT NULL, - CONSTRAINT [oauth_token_PRIMARY] PRIMARY KEY CLUSTERED -( - [token] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[route] ( - [domain] [varchar] (255) NOT NULL, - [server_host] [varchar] (255) NOT NULL, - [node] [varchar] (255) NOT NULL, - [pid] [varchar](100) NOT NULL, - [local_hint] [text] NOT NULL -); - -CREATE UNIQUE CLUSTERED INDEX [route_i] ON [route] (domain, server_host, node, pid) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [route_domain] ON [route] (domain) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[bosh] ( - [sid] [varchar] (255) NOT NULL, - [node] [varchar] (255) NOT NULL, - [pid] [varchar](100) NOT NULL - CONSTRAINT [bosh_PRIMARY] PRIMARY KEY CLUSTERED -( - [sid] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) -) TEXTIMAGE_ON [PRIMARY]; - -CREATE TABLE [dbo].[carboncopy] ( - [username] [varchar] (255) NOT NULL, - [resource] [varchar] (255) NOT NULL, - [namespace] [varchar] (255) NOT NULL, - [node] [varchar] (255) NOT NULL -); - -CREATE UNIQUE CLUSTERED INDEX [carboncopy_ur] ON [carboncopy] (username, resource) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE INDEX [carboncopy_user] ON [carboncopy] (username) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE TABLE [dbo].[push_session] ( - [username] [varchar] (255) NOT NULL, - [timestamp] [bigint] NOT NULL, - [service] [varchar] (255) NOT NULL, - [node] [varchar] (255) NOT NULL, - [xml] [varchar] (255) NOT NULL -); - -CREATE UNIQUE CLUSTERED INDEX [i_push_usn] ON [push_session] (username, service, node) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); - -CREATE UNIQUE CLUSTERED INDEX [i_push_ut] ON [push_session] (username, timestamp) -WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); diff --git a/sql/mysql.new.sql b/sql/mysql.new.sql deleted file mode 100644 index 544135e82..000000000 --- a/sql/mysql.new.sql +++ /dev/null @@ -1,439 +0,0 @@ --- --- ejabberd, Copyright (C) 2002-2017 ProcessOne --- --- This program is free software; you can redistribute it and/or --- modify it under the terms of the GNU General Public License as --- published by the Free Software Foundation; either version 2 of the --- License, or (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- General Public License for more details. --- --- You should have received a copy of the GNU General Public License along --- with this program; if not, write to the Free Software Foundation, Inc., --- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --- - -CREATE TABLE users ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - password text NOT NULL, - serverkey varchar(64) NOT NULL DEFAULT '', - salt varchar(64) NOT NULL DEFAULT '', - iterationcount integer NOT NULL DEFAULT 0, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host(191), username) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- Add support for SCRAM auth to a database created before ejabberd 16.03: --- ALTER TABLE users ADD COLUMN serverkey varchar(64) NOT NULL DEFAULT ''; --- ALTER TABLE users ADD COLUMN salt varchar(64) NOT NULL DEFAULT ''; --- ALTER TABLE users ADD COLUMN iterationcount integer NOT NULL DEFAULT 0; - -CREATE TABLE last ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - seconds text NOT NULL, - state text NOT NULL, - PRIMARY KEY (server_host(191), username) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - - -CREATE TABLE rosterusers ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - jid varchar(191) NOT NULL, - nick text NOT NULL, - subscription character(1) NOT NULL, - ask character(1) NOT NULL, - askmessage text NOT NULL, - server character(1) NOT NULL, - subscribe text NOT NULL, - type text, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_rosteru_sh_user_jid ON rosterusers(server_host(191), username(75), jid(75)); -CREATE INDEX i_rosteru_sh_username ON rosterusers(server_host(191), username); -CREATE INDEX i_rosteru_sh_jid ON rosterusers(server_host(191), jid); - -CREATE TABLE rostergroups ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - jid varchar(191) NOT NULL, - grp text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_rosterg_sh_user_jid ON rostergroups(server_host(191), username(75), jid(75)); - -CREATE TABLE sr_group ( - name varchar(191) NOT NULL, - server_host text NOT NULL, - opts text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host(191), name) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE sr_user ( - jid varchar(191) NOT NULL, - server_host text NOT NULL, - grp varchar(191) NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host(191), jid, grp) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_sr_user_sh_jid ON sr_user(server_host(191), jid); -CREATE INDEX i_sr_user_sh_grp ON sr_user(server_host(191), grp); - -CREATE TABLE spool ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - xml BLOB NOT NULL, - seq BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_spool_sh_username USING BTREE ON spool(server_host(191), username); -CREATE INDEX i_spool_created_at USING BTREE ON spool(created_at); - -CREATE TABLE archive ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - timestamp BIGINT UNSIGNED NOT NULL, - peer varchar(191) NOT NULL, - bare_peer varchar(191) NOT NULL, - xml text NOT NULL, - txt text, - id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, - kind varchar(10), - nick varchar(191), - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE FULLTEXT INDEX i_text ON archive(txt); -CREATE INDEX i_archive_sh_username_timestamp USING BTREE ON archive(server_host(191), username(191), timestamp); -CREATE INDEX i_archive_sh_username_peer USING BTREE ON archive(server_host(191), username(191), peer(191)); -CREATE INDEX i_archive_sh_username_bare_peer USING BTREE ON archive(server_host(191), username(191), bare_peer(191)); -CREATE INDEX i_archive_sh_timestamp USING BTREE ON archive(server_host(191), timestamp); - -CREATE TABLE archive_prefs ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - def text NOT NULL, - always text NOT NULL, - never text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host(191), username) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE vcard ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - vcard mediumtext NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host(191), username) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE vcard_search ( - username varchar(191) NOT NULL, - lusername varchar(191) NOT NULL, - server_host text NOT NULL, - fn text NOT NULL, - lfn varchar(191) NOT NULL, - family text NOT NULL, - lfamily varchar(191) NOT NULL, - given text NOT NULL, - lgiven varchar(191) NOT NULL, - middle text NOT NULL, - lmiddle varchar(191) NOT NULL, - nickname text NOT NULL, - lnickname varchar(191) NOT NULL, - bday text NOT NULL, - lbday varchar(191) NOT NULL, - ctry text NOT NULL, - lctry varchar(191) NOT NULL, - locality text NOT NULL, - llocality varchar(191) NOT NULL, - email text NOT NULL, - lemail varchar(191) NOT NULL, - orgname text NOT NULL, - lorgname varchar(191) NOT NULL, - orgunit text NOT NULL, - lorgunit varchar(191) NOT NULL, - PRIMARY KEY (server_host(191), lusername) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_vcard_search_sh_lfn ON vcard_search(server_host(191), lfn); -CREATE INDEX i_vcard_search_sh_lfamily ON vcard_search(server_host(191), lfamily); -CREATE INDEX i_vcard_search_sh_lgiven ON vcard_search(server_host(191), lgiven); -CREATE INDEX i_vcard_search_sh_lmiddle ON vcard_search(server_host(191), lmiddle); -CREATE INDEX i_vcard_search_sh_lnickname ON vcard_search(server_host(191), lnickname); -CREATE INDEX i_vcard_search_sh_lbday ON vcard_search(server_host(191), lbday); -CREATE INDEX i_vcard_search_sh_lctry ON vcard_search(server_host(191), lctry); -CREATE INDEX i_vcard_search_sh_llocality ON vcard_search(server_host(191), llocality); -CREATE INDEX i_vcard_search_sh_lemail ON vcard_search(server_host(191), lemail); -CREATE INDEX i_vcard_search_sh_lorgname ON vcard_search(server_host(191), lorgname); -CREATE INDEX i_vcard_search_sh_lorgunit ON vcard_search(server_host(191), lorgunit); - -CREATE TABLE privacy_default_list ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - name varchar(191) NOT NULL, - PRIMARY KEY (server_host(191), username) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE privacy_list ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - name varchar(191) NOT NULL, - id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_privacy_list_sh_username USING BTREE ON privacy_list(server_host(191), username); -CREATE UNIQUE INDEX i_privacy_list_sh_username_name USING BTREE ON privacy_list (server_host(191), username(75), name(75)); - -CREATE TABLE privacy_list_data ( - id bigint, - t character(1) NOT NULL, - value text NOT NULL, - action character(1) NOT NULL, - ord NUMERIC NOT NULL, - match_all boolean NOT NULL, - match_iq boolean NOT NULL, - match_message boolean NOT NULL, - match_presence_in boolean NOT NULL, - match_presence_out boolean NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_privacy_list_data_id ON privacy_list_data(id); - -CREATE TABLE private_storage ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - namespace varchar(191) NOT NULL, - data text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host(191), username, namespace) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_private_storage_sh_username USING BTREE ON private_storage(server_host(191), username); - --- Not tested in mysql -CREATE TABLE roster_version ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - version text NOT NULL, - PRIMARY KEY (server_host(191), username) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- To update from 1.x: --- ALTER TABLE rosterusers ADD COLUMN askmessage text AFTER ask; --- UPDATE rosterusers SET askmessage = ''; --- ALTER TABLE rosterusers ALTER COLUMN askmessage SET NOT NULL; - -CREATE TABLE pubsub_node ( - host text NOT NULL, - node text NOT NULL, - parent VARCHAR(191) NOT NULL DEFAULT '', - plugin text NOT NULL, - nodeid bigint auto_increment primary key -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_node_parent ON pubsub_node(parent(120)); -CREATE UNIQUE INDEX i_pubsub_node_tuple ON pubsub_node(host(20), node(120)); - -CREATE TABLE pubsub_node_option ( - nodeid bigint, - name text NOT NULL, - val text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_node_option_nodeid ON pubsub_node_option(nodeid); -ALTER TABLE `pubsub_node_option` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE; - -CREATE TABLE pubsub_node_owner ( - nodeid bigint, - owner text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_node_owner_nodeid ON pubsub_node_owner(nodeid); -ALTER TABLE `pubsub_node_owner` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE; - -CREATE TABLE pubsub_state ( - nodeid bigint, - jid text NOT NULL, - affiliation character(1), - subscriptions VARCHAR(191) NOT NULL DEFAULT '', - stateid bigint auto_increment primary key -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_state_jid ON pubsub_state(jid(60)); -CREATE UNIQUE INDEX i_pubsub_state_tuple ON pubsub_state(nodeid, jid(60)); -ALTER TABLE `pubsub_state` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE; - -CREATE TABLE pubsub_item ( - nodeid bigint, - itemid text NOT NULL, - publisher text NOT NULL, - creation varchar(32) NOT NULL, - modification varchar(32) NOT NULL, - payload text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_item_itemid ON pubsub_item(itemid(36)); -CREATE UNIQUE INDEX i_pubsub_item_tuple ON pubsub_item(nodeid, itemid(36)); -ALTER TABLE `pubsub_item` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE; - -CREATE TABLE pubsub_subscription_opt ( - subid text NOT NULL, - opt_name varchar(32), - opt_value text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE UNIQUE INDEX i_pubsub_subscription_opt ON pubsub_subscription_opt(subid(32), opt_name(32)); - -CREATE TABLE muc_room ( - name text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - opts mediumtext NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_muc_room_name_host USING BTREE ON muc_room(name(75), host(75)); - -CREATE TABLE muc_registered ( - jid text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - nick text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_muc_registered_nick USING BTREE ON muc_registered(nick(75)); -CREATE UNIQUE INDEX i_muc_registered_jid_host USING BTREE ON muc_registered(jid(75), host(75)); - -CREATE TABLE muc_online_room ( - name text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_muc_online_room_name_host USING BTREE ON muc_online_room(name(75), host(75)); - -CREATE TABLE muc_online_users ( - username text NOT NULL, - server text NOT NULL, - resource text NOT NULL, - name text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - node text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_muc_online_users USING BTREE ON muc_online_users(username(75), server(75), resource(75), name(75), host(75)); -CREATE INDEX i_muc_online_users_us USING BTREE ON muc_online_users(username(75), server(75)); - -CREATE TABLE muc_room_subscribers ( - room varchar(191) NOT NULL, - host varchar(191) NOT NULL, - jid varchar(191) NOT NULL, - nick text NOT NULL, - nodes text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY i_muc_room_subscribers_host_room_jid (host, room, jid) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid); - -CREATE TABLE motd ( - username varchar(191) NOT NULL, - server_host text NOT NULL, - xml text, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (server_host(191), username) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE caps_features ( - node varchar(191) NOT NULL, - subnode varchar(191) NOT NULL, - feature text, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_caps_features_node_subnode ON caps_features(node(75), subnode(75)); - -CREATE TABLE sm ( - usec bigint NOT NULL, - pid text NOT NULL, - node text NOT NULL, - username varchar(191) NOT NULL, - server_host text NOT NULL, - resource varchar(191) NOT NULL, - priority text NOT NULL, - info text NOT NULL, - PRIMARY KEY (usec, pid(75)) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_sm_node ON sm(node(75)); -CREATE INDEX i_sm_sh_username ON sm(server_host(191), username); - -CREATE TABLE oauth_token ( - token varchar(191) NOT NULL PRIMARY KEY, - jid text NOT NULL, - scope text NOT NULL, - expire bigint NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE route ( - domain text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL, - local_hint text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_route ON route(domain(75), server_host(75), node(75), pid(75)); -CREATE INDEX i_route_domain ON route(domain(75)); - -CREATE TABLE bosh ( - sid text NOT NULL, - node text NOT NULL, - pid text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_bosh_sid ON bosh(sid(75)); - -CREATE TABLE carboncopy ( - username text NOT NULL, - server_host text NOT NULL, - resource text NOT NULL, - namespace text NOT NULL, - node text NOT NULL, - PRIMARY KEY (server_host(191), username(191), resource(191)) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_carboncopy_sh_user ON carboncopy (server_host(191), username(75)); - -CREATE TABLE proxy65 ( - sid text NOT NULL, - pid_t text NOT NULL, - pid_i text NOT NULL, - node_t text NOT NULL, - node_i text NOT NULL, - jid_i text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_proxy65_sid ON proxy65 (sid(191)); -CREATE INDEX i_proxy65_jid ON proxy65 (jid_i(191)); - -CREATE TABLE push_session ( - username text NOT NULL, - server_host text NOT NULL, - timestamp bigint NOT NULL, - service text NOT NULL, - node text NOT NULL, - xml text NOT NULL, - PRIMARY KEY (server_host(191), username(191), timestamp) -); - -CREATE UNIQUE INDEX i_push_session_susn ON push_session (server_host(191), username(191), service(191), node(191)); diff --git a/sql/mysql.sql b/sql/mysql.sql deleted file mode 100644 index 7894fa5b7..000000000 --- a/sql/mysql.sql +++ /dev/null @@ -1,407 +0,0 @@ --- --- ejabberd, Copyright (C) 2002-2017 ProcessOne --- --- This program is free software; you can redistribute it and/or --- modify it under the terms of the GNU General Public License as --- published by the Free Software Foundation; either version 2 of the --- License, or (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- General Public License for more details. --- --- You should have received a copy of the GNU General Public License along --- with this program; if not, write to the Free Software Foundation, Inc., --- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --- - -CREATE TABLE users ( - username varchar(191) PRIMARY KEY, - password text NOT NULL, - serverkey varchar(64) NOT NULL DEFAULT '', - salt varchar(64) NOT NULL DEFAULT '', - iterationcount integer NOT NULL DEFAULT 0, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- Add support for SCRAM auth to a database created before ejabberd 16.03: --- ALTER TABLE users ADD COLUMN serverkey varchar(64) NOT NULL DEFAULT ''; --- ALTER TABLE users ADD COLUMN salt varchar(64) NOT NULL DEFAULT ''; --- ALTER TABLE users ADD COLUMN iterationcount integer NOT NULL DEFAULT 0; - -CREATE TABLE last ( - username varchar(191) PRIMARY KEY, - seconds text NOT NULL, - state text NOT NULl -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - - -CREATE TABLE rosterusers ( - username varchar(191) NOT NULL, - jid varchar(191) NOT NULL, - nick text NOT NULL, - subscription character(1) NOT NULL, - ask character(1) NOT NULL, - askmessage text NOT NULL, - server character(1) NOT NULL, - subscribe text NOT NULL, - type text, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_rosteru_user_jid ON rosterusers(username(75), jid(75)); -CREATE INDEX i_rosteru_username ON rosterusers(username); -CREATE INDEX i_rosteru_jid ON rosterusers(jid); - -CREATE TABLE rostergroups ( - username varchar(191) NOT NULL, - jid varchar(191) NOT NULL, - grp text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX pk_rosterg_user_jid ON rostergroups(username(75), jid(75)); - -CREATE TABLE sr_group ( - name varchar(191) NOT NULL, - opts text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE sr_user ( - jid varchar(191) NOT NULL, - grp varchar(191) NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_sr_user_jid_group ON sr_user(jid(75), grp(75)); -CREATE INDEX i_sr_user_jid ON sr_user(jid); -CREATE INDEX i_sr_user_grp ON sr_user(grp); - -CREATE TABLE spool ( - username varchar(191) NOT NULL, - xml BLOB NOT NULL, - seq BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_despool USING BTREE ON spool(username); -CREATE INDEX i_spool_created_at USING BTREE ON spool(created_at); - -CREATE TABLE archive ( - username varchar(191) NOT NULL, - timestamp BIGINT UNSIGNED NOT NULL, - peer varchar(191) NOT NULL, - bare_peer varchar(191) NOT NULL, - xml text NOT NULL, - txt text, - id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, - kind varchar(10), - nick varchar(191), - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE FULLTEXT INDEX i_text ON archive(txt); -CREATE INDEX i_username_timestamp USING BTREE ON archive(username(191), timestamp); -CREATE INDEX i_username_peer USING BTREE ON archive(username(191), peer(191)); -CREATE INDEX i_username_bare_peer USING BTREE ON archive(username(191), bare_peer(191)); -CREATE INDEX i_timestamp USING BTREE ON archive(timestamp); - -CREATE TABLE archive_prefs ( - username varchar(191) NOT NULL PRIMARY KEY, - def text NOT NULL, - always text NOT NULL, - never text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE vcard ( - username varchar(191) PRIMARY KEY, - vcard mediumtext NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE vcard_search ( - username varchar(191) NOT NULL, - lusername varchar(191) PRIMARY KEY, - fn text NOT NULL, - lfn varchar(191) NOT NULL, - family text NOT NULL, - lfamily varchar(191) NOT NULL, - given text NOT NULL, - lgiven varchar(191) NOT NULL, - middle text NOT NULL, - lmiddle varchar(191) NOT NULL, - nickname text NOT NULL, - lnickname varchar(191) NOT NULL, - bday text NOT NULL, - lbday varchar(191) NOT NULL, - ctry text NOT NULL, - lctry varchar(191) NOT NULL, - locality text NOT NULL, - llocality varchar(191) NOT NULL, - email text NOT NULL, - lemail varchar(191) NOT NULL, - orgname text NOT NULL, - lorgname varchar(191) NOT NULL, - orgunit text NOT NULL, - lorgunit varchar(191) NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_vcard_search_lfn ON vcard_search(lfn); -CREATE INDEX i_vcard_search_lfamily ON vcard_search(lfamily); -CREATE INDEX i_vcard_search_lgiven ON vcard_search(lgiven); -CREATE INDEX i_vcard_search_lmiddle ON vcard_search(lmiddle); -CREATE INDEX i_vcard_search_lnickname ON vcard_search(lnickname); -CREATE INDEX i_vcard_search_lbday ON vcard_search(lbday); -CREATE INDEX i_vcard_search_lctry ON vcard_search(lctry); -CREATE INDEX i_vcard_search_llocality ON vcard_search(llocality); -CREATE INDEX i_vcard_search_lemail ON vcard_search(lemail); -CREATE INDEX i_vcard_search_lorgname ON vcard_search(lorgname); -CREATE INDEX i_vcard_search_lorgunit ON vcard_search(lorgunit); - -CREATE TABLE privacy_default_list ( - username varchar(191) PRIMARY KEY, - name varchar(191) NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE privacy_list ( - username varchar(191) NOT NULL, - name varchar(191) NOT NULL, - id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_privacy_list_username USING BTREE ON privacy_list(username); -CREATE UNIQUE INDEX i_privacy_list_username_name USING BTREE ON privacy_list (username(75), name(75)); - -CREATE TABLE privacy_list_data ( - id bigint, - t character(1) NOT NULL, - value text NOT NULL, - action character(1) NOT NULL, - ord NUMERIC NOT NULL, - match_all boolean NOT NULL, - match_iq boolean NOT NULL, - match_message boolean NOT NULL, - match_presence_in boolean NOT NULL, - match_presence_out boolean NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_privacy_list_data_id ON privacy_list_data(id); - -CREATE TABLE private_storage ( - username varchar(191) NOT NULL, - namespace varchar(191) NOT NULL, - data text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_private_storage_username USING BTREE ON private_storage(username); -CREATE UNIQUE INDEX i_private_storage_username_namespace USING BTREE ON private_storage(username(75), namespace(75)); - --- Not tested in mysql -CREATE TABLE roster_version ( - username varchar(191) PRIMARY KEY, - version text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- To update from 1.x: --- ALTER TABLE rosterusers ADD COLUMN askmessage text AFTER ask; --- UPDATE rosterusers SET askmessage = ''; --- ALTER TABLE rosterusers ALTER COLUMN askmessage SET NOT NULL; - -CREATE TABLE pubsub_node ( - host text NOT NULL, - node text NOT NULL, - parent VARCHAR(191) NOT NULL DEFAULT '', - plugin text NOT NULL, - nodeid bigint auto_increment primary key -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_node_parent ON pubsub_node(parent(120)); -CREATE UNIQUE INDEX i_pubsub_node_tuple ON pubsub_node(host(20), node(120)); - -CREATE TABLE pubsub_node_option ( - nodeid bigint, - name text NOT NULL, - val text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_node_option_nodeid ON pubsub_node_option(nodeid); -ALTER TABLE `pubsub_node_option` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE; - -CREATE TABLE pubsub_node_owner ( - nodeid bigint, - owner text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_node_owner_nodeid ON pubsub_node_owner(nodeid); -ALTER TABLE `pubsub_node_owner` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE; - -CREATE TABLE pubsub_state ( - nodeid bigint, - jid text NOT NULL, - affiliation character(1), - subscriptions VARCHAR(191) NOT NULL DEFAULT '', - stateid bigint auto_increment primary key -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_state_jid ON pubsub_state(jid(60)); -CREATE UNIQUE INDEX i_pubsub_state_tuple ON pubsub_state(nodeid, jid(60)); -ALTER TABLE `pubsub_state` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE; - -CREATE TABLE pubsub_item ( - nodeid bigint, - itemid text NOT NULL, - publisher text NOT NULL, - creation varchar(32) NOT NULL, - modification varchar(32) NOT NULL, - payload text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE INDEX i_pubsub_item_itemid ON pubsub_item(itemid(36)); -CREATE UNIQUE INDEX i_pubsub_item_tuple ON pubsub_item(nodeid, itemid(36)); -ALTER TABLE `pubsub_item` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE; - -CREATE TABLE pubsub_subscription_opt ( - subid text NOT NULL, - opt_name varchar(32), - opt_value text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE UNIQUE INDEX i_pubsub_subscription_opt ON pubsub_subscription_opt(subid(32), opt_name(32)); - -CREATE TABLE muc_room ( - name text NOT NULL, - host text NOT NULL, - opts mediumtext NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_muc_room_name_host USING BTREE ON muc_room(name(75), host(75)); - -CREATE TABLE muc_registered ( - jid text NOT NULL, - host text NOT NULL, - nick text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_muc_registered_nick USING BTREE ON muc_registered(nick(75)); -CREATE UNIQUE INDEX i_muc_registered_jid_host USING BTREE ON muc_registered(jid(75), host(75)); - -CREATE TABLE muc_online_room ( - name text NOT NULL, - host text NOT NULL, - node text NOT NULL, - pid text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_muc_online_room_name_host USING BTREE ON muc_online_room(name(75), host(75)); - -CREATE TABLE muc_online_users ( - username text NOT NULL, - server text NOT NULL, - resource text NOT NULL, - name text NOT NULL, - host text NOT NULL, - node text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_muc_online_users USING BTREE ON muc_online_users(username(75), server(75), resource(75), name(75), host(75)); -CREATE INDEX i_muc_online_users_us USING BTREE ON muc_online_users(username(75), server(75)); - -CREATE TABLE muc_room_subscribers ( - room varchar(191) NOT NULL, - host varchar(191) NOT NULL, - jid varchar(191) NOT NULL, - nick text NOT NULL, - nodes text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY i_muc_room_subscribers_host_room_jid (host, room, jid) -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid); - -CREATE TABLE motd ( - username varchar(191) PRIMARY KEY, - xml text, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE caps_features ( - node varchar(191) NOT NULL, - subnode varchar(191) NOT NULL, - feature text, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE INDEX i_caps_features_node_subnode ON caps_features(node(75), subnode(75)); - -CREATE TABLE sm ( - usec bigint NOT NULL, - pid text NOT NULL, - node text NOT NULL, - username varchar(191) NOT NULL, - resource varchar(191) NOT NULL, - priority text NOT NULL, - info text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_sid ON sm(usec, pid(75)); -CREATE INDEX i_node ON sm(node(75)); -CREATE INDEX i_username ON sm(username); - -CREATE TABLE oauth_token ( - token varchar(191) NOT NULL PRIMARY KEY, - jid text NOT NULL, - scope text NOT NULL, - expire bigint NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE TABLE route ( - domain text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL, - local_hint text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_route ON route(domain(75), server_host(75), node(75), pid(75)); -CREATE INDEX i_route_domain ON route(domain(75)); - -CREATE TABLE bosh ( - sid text NOT NULL, - node text NOT NULL, - pid text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_bosh_sid ON bosh(sid(75)); - -CREATE TABLE carboncopy ( - username text NOT NULL, - resource text NOT NULL, - namespace text NOT NULL, - node text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_carboncopy_ur ON carboncopy (username(75), resource(75)); -CREATE INDEX i_carboncopy_user ON carboncopy (username(75)); - -CREATE TABLE proxy65 ( - sid text NOT NULL, - pid_t text NOT NULL, - pid_i text NOT NULL, - node_t text NOT NULL, - node_i text NOT NULL, - jid_i text NOT NULL -) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -CREATE UNIQUE INDEX i_proxy65_sid ON proxy65 (sid(191)); -CREATE INDEX i_proxy65_jid ON proxy65 (jid_i(191)); - -CREATE TABLE push_session ( - username text NOT NULL, - timestamp bigint NOT NULL, - service text NOT NULL, - node text NOT NULL, - xml text NOT NULL -); - -CREATE UNIQUE INDEX i_push_usn ON push_session (username(191), service(191), node(191)); -CREATE UNIQUE INDEX i_push_ut ON push_session (username(191), timestamp); diff --git a/sql/pg.new.sql b/sql/pg.new.sql deleted file mode 100644 index 928d74db0..000000000 --- a/sql/pg.new.sql +++ /dev/null @@ -1,591 +0,0 @@ --- --- ejabberd, Copyright (C) 2002-2017 ProcessOne --- --- This program is free software; you can redistribute it and/or --- modify it under the terms of the GNU General Public License as --- published by the Free Software Foundation; either version 2 of the --- License, or (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- General Public License for more details. --- --- You should have received a copy of the GNU General Public License along --- with this program; if not, write to the Free Software Foundation, Inc., --- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --- - --- To update from the old schema, replace with the host's domain: - --- ALTER TABLE users ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE users DROP CONSTRAINT users_pkey; --- ALTER TABLE users ADD PRIMARY KEY (server_host, username); --- ALTER TABLE users ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE last ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE last DROP CONSTRAINT last_pkey; --- ALTER TABLE last ADD PRIMARY KEY (server_host, username); --- ALTER TABLE last ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE rosterusers ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX i_rosteru_user_jid; --- DROP INDEX i_rosteru_username; --- DROP INDEX i_rosteru_jid; --- CREATE UNIQUE INDEX i_rosteru_sh_user_jid ON rosterusers USING btree (server_host, username, jid); --- CREATE INDEX i_rosteru_sh_username ON rosterusers USING btree (server_host, username); --- CREATE INDEX i_rosteru_sh_jid ON rosterusers USING btree (server_host, jid); --- ALTER TABLE rosterusers ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE rostergroups ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX pk_rosterg_user_jid; --- CREATE INDEX i_rosterg_sh_user_jid ON rostergroups USING btree (server_host, username, jid); --- ALTER TABLE rostergroups ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE sr_group ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE sr_group ADD PRIMARY KEY (server_host, name); --- ALTER TABLE sr_group ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE sr_user ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX i_sr_user_jid_grp; --- DROP INDEX i_sr_user_jid; --- DROP INDEX i_sr_user_grp; --- ALTER TABLE sr_user ADD PRIMARY KEY (server_host, jid, grp); --- CREATE INDEX i_sr_user_sh_jid ON sr_user USING btree (server_host, jid); --- CREATE INDEX i_sr_user_sh_grp ON sr_user USING btree (server_host, grp); --- ALTER TABLE sr_user ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE spool ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX i_despool; --- CREATE INDEX i_spool_sh_username ON spool USING btree (server_host, username); --- ALTER TABLE spool ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE archive ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX i_username_timestamp; --- DROP INDEX i_username_peer; --- DROP INDEX i_username_bare_peer; --- DROP INDEX i_timestamp; --- CREATE INDEX i_archive_sh_username_timestamp ON archive USING btree (server_host, username, timestamp); --- CREATE INDEX i_archive_sh_username_peer ON archive USING btree (server_host, username, peer); --- CREATE INDEX i_archive_sh_username_bare_peer ON archive USING btree (server_host, username, bare_peer); --- CREATE INDEX i_archive_sh_timestamp ON archive USING btree (server_host, timestamp); --- ALTER TABLE archive ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE archive_prefs ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE archive_prefs DROP CONSTRAINT archive_prefs_pkey; --- ALTER TABLE archive_prefs ADD PRIMARY KEY (server_host, username); --- ALTER TABLE archive_prefs ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE vcard ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE vcard DROP CONSTRAINT vcard_pkey; --- ALTER TABLE vcard ADD PRIMARY KEY (server_host, username); --- ALTER TABLE vcard ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE vcard_search ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE vcard_search DROP CONSTRAINT vcard_search_pkey; --- DROP INDEX i_vcard_search_lfn; --- DROP INDEX i_vcard_search_lfamily; --- DROP INDEX i_vcard_search_lgiven; --- DROP INDEX i_vcard_search_lmiddle; --- DROP INDEX i_vcard_search_lnickname; --- DROP INDEX i_vcard_search_lbday; --- DROP INDEX i_vcard_search_lctry; --- DROP INDEX i_vcard_search_llocality; --- DROP INDEX i_vcard_search_lemail; --- DROP INDEX i_vcard_search_lorgname; --- DROP INDEX i_vcard_search_lorgunit; --- ALTER TABLE vcard_search ADD PRIMARY KEY (server_host, username); --- CREATE INDEX i_vcard_search_sh_lfn ON vcard_search(server_host, lfn); --- CREATE INDEX i_vcard_search_sh_lfamily ON vcard_search(server_host, lfamily); --- CREATE INDEX i_vcard_search_sh_lgiven ON vcard_search(server_host, lgiven); --- CREATE INDEX i_vcard_search_sh_lmiddle ON vcard_search(server_host, lmiddle); --- CREATE INDEX i_vcard_search_sh_lnickname ON vcard_search(server_host, lnickname); --- CREATE INDEX i_vcard_search_sh_lbday ON vcard_search(server_host, lbday); --- CREATE INDEX i_vcard_search_sh_lctry ON vcard_search(server_host, lctry); --- CREATE INDEX i_vcard_search_sh_llocality ON vcard_search(server_host, llocality); --- CREATE INDEX i_vcard_search_sh_lemail ON vcard_search(server_host, lemail); --- CREATE INDEX i_vcard_search_sh_lorgname ON vcard_search(server_host, lorgname); --- CREATE INDEX i_vcard_search_sh_lorgunit ON vcard_search(server_host, lorgunit); --- ALTER TABLE vcard_search ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE privacy_default_list ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE privacy_default_list DROP CONSTRAINT privacy_default_list_pkey; --- ALTER TABLE privacy_default_list ADD PRIMARY KEY (server_host, username); --- ALTER TABLE privacy_default_list ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE privacy_list ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX i_privacy_list_username; --- DROP INDEX i_privacy_list_username_name; --- CREATE INDEX i_privacy_list_sh_username ON privacy_list USING btree (server_host, username); --- CREATE UNIQUE INDEX i_privacy_list_sh_username_name ON privacy_list USING btree (server_host, username, name); --- ALTER TABLE privacy_list ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE private_storage ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX i_private_storage_username; --- DROP INDEX i_private_storage_username_namespace; --- ALTER TABLE private_storage ADD PRIMARY KEY (server_host, username, namespace); --- CREATE INDEX i_private_storage_sh_username ON private_storage USING btree (server_host, username); --- ALTER TABLE private_storage ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE roster_version ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE roster_version DROP CONSTRAINT roster_version_pkey; --- ALTER TABLE roster_version ADD PRIMARY KEY (server_host, username); --- ALTER TABLE roster_version ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE muc_room ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE muc_room ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE muc_registered ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE muc_registered ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE muc_online_room ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE muc_online_room ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE muc_online_users ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE muc_online_users ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE motd ADD COLUMN server_host text NOT NULL DEFAULT ''; --- ALTER TABLE motd DROP CONSTRAINT motd_pkey; --- ALTER TABLE motd ADD PRIMARY KEY (server_host, username); --- ALTER TABLE motd ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE sm ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX i_sm_sid; --- DROP INDEX i_sm_username; --- ALTER TABLE sm ADD PRIMARY KEY (usec, pid); --- CREATE INDEX i_sm_sh_username ON sm USING btree (server_host, username); --- ALTER TABLE sm ALTER COLUMN server_host DROP DEFAULT; - --- ALTER TABLE carboncopy ADD COLUMN server_host text NOT NULL DEFAULT ''; --- DROP INDEX i_carboncopy_ur; --- DROP INDEX i_carboncopy_user; --- ALTER TABLE carboncopy ADD PRIMARY KEY (server_host, username, resource); --- CREATE INDEX i_carboncopy_sh_user ON carboncopy USING btree (server_host, username); --- ALTER TABLE carboncopy ALTER COLUMN server_host DROP DEFAULT; - - -CREATE TABLE users ( - username text NOT NULL, - server_host text NOT NULL, - "password" text NOT NULL, - serverkey text NOT NULL DEFAULT '', - salt text NOT NULL DEFAULT '', - iterationcount integer NOT NULL DEFAULT 0, - created_at TIMESTAMP NOT NULL DEFAULT now(), - PRIMARY KEY (server_host, username) -); - --- Add support for SCRAM auth to a database created before ejabberd 16.03: --- ALTER TABLE users ADD COLUMN serverkey text NOT NULL DEFAULT ''; --- ALTER TABLE users ADD COLUMN salt text NOT NULL DEFAULT ''; --- ALTER TABLE users ADD COLUMN iterationcount integer NOT NULL DEFAULT 0; - -CREATE TABLE last ( - username text NOT NULL, - server_host text NOT NULL, - seconds text NOT NULL, - state text NOT NULL, - PRIMARY KEY (server_host, username) -); - - -CREATE TABLE rosterusers ( - username text NOT NULL, - server_host text NOT NULL, - jid text NOT NULL, - nick text NOT NULL, - subscription character(1) NOT NULL, - ask character(1) NOT NULL, - askmessage text NOT NULL, - server character(1) NOT NULL, - subscribe text NOT NULL, - "type" text, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE UNIQUE INDEX i_rosteru_sh_user_jid ON rosterusers USING btree (server_host, username, jid); -CREATE INDEX i_rosteru_sh_username ON rosterusers USING btree (server_host, username); -CREATE INDEX i_rosteru_sh_jid ON rosterusers USING btree (server_host, jid); - - -CREATE TABLE rostergroups ( - username text NOT NULL, - server_host text NOT NULL, - jid text NOT NULL, - grp text NOT NULL -); - -CREATE INDEX i_rosterg_sh_user_jid ON rostergroups USING btree (server_host, username, jid); - -CREATE TABLE sr_group ( - name text NOT NULL, - server_host text NOT NULL, - opts text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now(), - PRIMARY KEY (server_host, name) -); - -CREATE TABLE sr_user ( - jid text NOT NULL, - server_host text NOT NULL, - grp text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now(), - PRIMARY KEY (server_host, jid, grp) -); - -CREATE INDEX i_sr_user_sh_jid ON sr_user USING btree (server_host, jid); -CREATE INDEX i_sr_user_sh_grp ON sr_user USING btree (server_host, grp); - -CREATE TABLE spool ( - username text NOT NULL, - server_host text NOT NULL, - xml text NOT NULL, - seq SERIAL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_spool_sh_username ON spool USING btree (server_host, username); - -CREATE TABLE archive ( - username text NOT NULL, - server_host text NOT NULL, - timestamp BIGINT NOT NULL, - peer text NOT NULL, - bare_peer text NOT NULL, - xml text NOT NULL, - txt text, - id SERIAL, - kind text, - nick text, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_archive_sh_username_timestamp ON archive USING btree (server_host, username, timestamp); -CREATE INDEX i_archive_sh_username_peer ON archive USING btree (server_host, username, peer); -CREATE INDEX i_archive_sh_username_bare_peer ON archive USING btree (server_host, username, bare_peer); -CREATE INDEX i_archive_sh_timestamp ON archive USING btree (server_host, timestamp); - -CREATE TABLE archive_prefs ( - username text NOT NULL, - server_host text NOT NULL, - def text NOT NULL, - always text NOT NULL, - never text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now(), - PRIMARY KEY (server_host, username) -); - -CREATE TABLE vcard ( - username text NOT NULL, - server_host text NOT NULL, - vcard text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now(), - PRIMARY KEY (server_host, username) -); - -CREATE TABLE vcard_search ( - username text NOT NULL, - lusername text NOT NULL, - server_host text NOT NULL, - fn text NOT NULL, - lfn text NOT NULL, - family text NOT NULL, - lfamily text NOT NULL, - given text NOT NULL, - lgiven text NOT NULL, - middle text NOT NULL, - lmiddle text NOT NULL, - nickname text NOT NULL, - lnickname text NOT NULL, - bday text NOT NULL, - lbday text NOT NULL, - ctry text NOT NULL, - lctry text NOT NULL, - locality text NOT NULL, - llocality text NOT NULL, - email text NOT NULL, - lemail text NOT NULL, - orgname text NOT NULL, - lorgname text NOT NULL, - orgunit text NOT NULL, - lorgunit text NOT NULL, - PRIMARY KEY (server_host, username) -); - -CREATE INDEX i_vcard_search_sh_lfn ON vcard_search(server_host, lfn); -CREATE INDEX i_vcard_search_sh_lfamily ON vcard_search(server_host, lfamily); -CREATE INDEX i_vcard_search_sh_lgiven ON vcard_search(server_host, lgiven); -CREATE INDEX i_vcard_search_sh_lmiddle ON vcard_search(server_host, lmiddle); -CREATE INDEX i_vcard_search_sh_lnickname ON vcard_search(server_host, lnickname); -CREATE INDEX i_vcard_search_sh_lbday ON vcard_search(server_host, lbday); -CREATE INDEX i_vcard_search_sh_lctry ON vcard_search(server_host, lctry); -CREATE INDEX i_vcard_search_sh_llocality ON vcard_search(server_host, llocality); -CREATE INDEX i_vcard_search_sh_lemail ON vcard_search(server_host, lemail); -CREATE INDEX i_vcard_search_sh_lorgname ON vcard_search(server_host, lorgname); -CREATE INDEX i_vcard_search_sh_lorgunit ON vcard_search(server_host, lorgunit); - -CREATE TABLE privacy_default_list ( - username text NOT NULL, - server_host text NOT NULL, - name text NOT NULL, - PRIMARY KEY (server_host, username) -); - -CREATE TABLE privacy_list ( - username text NOT NULL, - server_host text NOT NULL, - name text NOT NULL, - id SERIAL UNIQUE, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_privacy_list_sh_username ON privacy_list USING btree (server_host, username); -CREATE UNIQUE INDEX i_privacy_list_sh_username_name ON privacy_list USING btree (server_host, username, name); - -CREATE TABLE privacy_list_data ( - id bigint REFERENCES privacy_list(id) ON DELETE CASCADE, - t character(1) NOT NULL, - value text NOT NULL, - action character(1) NOT NULL, - ord NUMERIC NOT NULL, - match_all boolean NOT NULL, - match_iq boolean NOT NULL, - match_message boolean NOT NULL, - match_presence_in boolean NOT NULL, - match_presence_out boolean NOT NULL -); - -CREATE INDEX i_privacy_list_data_id ON privacy_list_data USING btree (id); - -CREATE TABLE private_storage ( - username text NOT NULL, - server_host text NOT NULL, - namespace text NOT NULL, - data text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now(), - PRIMARY KEY (server_host, username, namespace) -); - -CREATE INDEX i_private_storage_sh_username ON private_storage USING btree (server_host, username); - - -CREATE TABLE roster_version ( - username text NOT NULL, - server_host text NOT NULL, - version text NOT NULL, - PRIMARY KEY (server_host, username) -); - --- To update from 0.9.8: --- CREATE SEQUENCE spool_seq_seq; --- ALTER TABLE spool ADD COLUMN seq integer; --- ALTER TABLE spool ALTER COLUMN seq SET DEFAULT nextval('spool_seq_seq'); --- UPDATE spool SET seq = DEFAULT; --- ALTER TABLE spool ALTER COLUMN seq SET NOT NULL; - --- To update from 1.x: --- ALTER TABLE rosterusers ADD COLUMN askmessage text; --- UPDATE rosterusers SET askmessage = ''; --- ALTER TABLE rosterusers ALTER COLUMN askmessage SET NOT NULL; - -CREATE TABLE pubsub_node ( - host text NOT NULL, - node text NOT NULL, - parent text NOT NULL DEFAULT '', - plugin text NOT NULL, - nodeid SERIAL UNIQUE -); -CREATE INDEX i_pubsub_node_parent ON pubsub_node USING btree (parent); -CREATE UNIQUE INDEX i_pubsub_node_tuple ON pubsub_node USING btree (host, node); - -CREATE TABLE pubsub_node_option ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - name text NOT NULL, - val text NOT NULL -); -CREATE INDEX i_pubsub_node_option_nodeid ON pubsub_node_option USING btree (nodeid); - -CREATE TABLE pubsub_node_owner ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - owner text NOT NULL -); -CREATE INDEX i_pubsub_node_owner_nodeid ON pubsub_node_owner USING btree (nodeid); - -CREATE TABLE pubsub_state ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - jid text NOT NULL, - affiliation character(1), - subscriptions text NOT NULL DEFAULT '', - stateid SERIAL UNIQUE -); -CREATE INDEX i_pubsub_state_jid ON pubsub_state USING btree (jid); -CREATE UNIQUE INDEX i_pubsub_state_tuple ON pubsub_state USING btree (nodeid, jid); - -CREATE TABLE pubsub_item ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - itemid text NOT NULL, - publisher text NOT NULL, - creation varchar(32) NOT NULL, - modification varchar(32) NOT NULL, - payload text NOT NULL DEFAULT '' -); -CREATE INDEX i_pubsub_item_itemid ON pubsub_item USING btree (itemid); -CREATE UNIQUE INDEX i_pubsub_item_tuple ON pubsub_item USING btree (nodeid, itemid); - -CREATE TABLE pubsub_subscription_opt ( - subid text NOT NULL, - opt_name varchar(32), - opt_value text NOT NULL -); -CREATE UNIQUE INDEX i_pubsub_subscription_opt ON pubsub_subscription_opt USING btree (subid, opt_name); - -CREATE TABLE muc_room ( - name text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - opts text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room USING btree (name, host); - -CREATE TABLE muc_registered ( - jid text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - nick text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_muc_registered_nick ON muc_registered USING btree (nick); -CREATE UNIQUE INDEX i_muc_registered_jid_host ON muc_registered USING btree (jid, host); - -CREATE TABLE muc_online_room ( - name text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL -); - -CREATE UNIQUE INDEX i_muc_online_room_name_host ON muc_online_room USING btree (name, host); - -CREATE TABLE muc_online_users ( - username text NOT NULL, - server text NOT NULL, - resource text NOT NULL, - name text NOT NULL, - host text NOT NULL, - server_host text NOT NULL, - node text NOT NULL -); - -CREATE UNIQUE INDEX i_muc_online_users ON muc_online_users USING btree (username, server, resource, name, host); -CREATE INDEX i_muc_online_users_us ON muc_online_users USING btree (username, server); - -CREATE TABLE muc_room_subscribers ( - room text NOT NULL, - host text NOT NULL, - jid text NOT NULL, - nick text NOT NULL, - nodes text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers USING btree (host, jid); -CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers USING btree (host, room, jid); - -CREATE TABLE motd ( - username text NOT NULL, - server_host text NOT NULL, - xml text, - created_at TIMESTAMP NOT NULL DEFAULT now(), - PRIMARY KEY (server_host, username) -); - -CREATE TABLE caps_features ( - node text NOT NULL, - subnode text NOT NULL, - feature text, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_caps_features_node_subnode ON caps_features USING btree (node, subnode); - -CREATE TABLE sm ( - usec bigint NOT NULL, - pid text NOT NULL, - node text NOT NULL, - username text NOT NULL, - server_host text NOT NULL, - resource text NOT NULL, - priority text NOT NULL, - info text NOT NULL, - PRIMARY KEY (usec, pid) -); - -CREATE INDEX i_sm_node ON sm USING btree (node); -CREATE INDEX i_sm_sh_username ON sm USING btree (server_host, username); - -CREATE TABLE oauth_token ( - token text NOT NULL, - jid text NOT NULL, - scope text NOT NULL, - expire bigint NOT NULL -); - -CREATE UNIQUE INDEX i_oauth_token_token ON oauth_token USING btree (token); - -CREATE TABLE route ( - domain text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL, - local_hint text NOT NULL -); - -CREATE UNIQUE INDEX i_route ON route USING btree (domain, server_host, node, pid); -CREATE INDEX i_route_domain ON route USING btree (domain); - -CREATE TABLE bosh ( - sid text NOT NULL, - node text NOT NULL, - pid text NOT NULL -); - -CREATE UNIQUE INDEX i_bosh_sid ON bosh USING btree (sid); - -CREATE TABLE carboncopy ( - username text NOT NULL, - server_host text NOT NULL, - resource text NOT NULL, - namespace text NOT NULL, - node text NOT NULL, - PRIMARY KEY (server_host, username, resource) -); - -CREATE INDEX i_carboncopy_sh_user ON carboncopy USING btree (server_host, username); - -CREATE TABLE proxy65 ( - sid text NOT NULL, - pid_t text NOT NULL, - pid_i text NOT NULL, - node_t text NOT NULL, - node_i text NOT NULL, - jid_i text NOT NULL -); - -CREATE UNIQUE INDEX i_proxy65_sid ON proxy65 USING btree (sid); -CREATE INDEX i_proxy65_jid ON proxy65 USING btree (jid_i); - -CREATE TABLE push_session ( - username text NOT NULL, - server_host text NOT NULL, - timestamp bigint NOT NULL, - service text NOT NULL, - node text NOT NULL, - xml text NOT NULL, - PRIMARY KEY (server_host, username, timestamp) -); - -CREATE UNIQUE INDEX i_push_session_susn ON push_session USING btree (server_host, username, service, node); diff --git a/sql/pg.sql b/sql/pg.sql deleted file mode 100644 index a0cfe0ea6..000000000 --- a/sql/pg.sql +++ /dev/null @@ -1,411 +0,0 @@ --- --- ejabberd, Copyright (C) 2002-2017 ProcessOne --- --- This program is free software; you can redistribute it and/or --- modify it under the terms of the GNU General Public License as --- published by the Free Software Foundation; either version 2 of the --- License, or (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- General Public License for more details. --- --- You should have received a copy of the GNU General Public License along --- with this program; if not, write to the Free Software Foundation, Inc., --- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --- - -CREATE TABLE users ( - username text PRIMARY KEY, - "password" text NOT NULL, - serverkey text NOT NULL DEFAULT '', - salt text NOT NULL DEFAULT '', - iterationcount integer NOT NULL DEFAULT 0, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - --- Add support for SCRAM auth to a database created before ejabberd 16.03: --- ALTER TABLE users ADD COLUMN serverkey text NOT NULL DEFAULT ''; --- ALTER TABLE users ADD COLUMN salt text NOT NULL DEFAULT ''; --- ALTER TABLE users ADD COLUMN iterationcount integer NOT NULL DEFAULT 0; - -CREATE TABLE last ( - username text PRIMARY KEY, - seconds text NOT NULL, - state text NOT NULL -); - - -CREATE TABLE rosterusers ( - username text NOT NULL, - jid text NOT NULL, - nick text NOT NULL, - subscription character(1) NOT NULL, - ask character(1) NOT NULL, - askmessage text NOT NULL, - server character(1) NOT NULL, - subscribe text NOT NULL, - "type" text, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE UNIQUE INDEX i_rosteru_user_jid ON rosterusers USING btree (username, jid); -CREATE INDEX i_rosteru_username ON rosterusers USING btree (username); -CREATE INDEX i_rosteru_jid ON rosterusers USING btree (jid); - - -CREATE TABLE rostergroups ( - username text NOT NULL, - jid text NOT NULL, - grp text NOT NULL -); - -CREATE INDEX pk_rosterg_user_jid ON rostergroups USING btree (username, jid); - -CREATE TABLE sr_group ( - name text NOT NULL, - opts text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE TABLE sr_user ( - jid text NOT NULL, - grp text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE UNIQUE INDEX i_sr_user_jid_grp ON sr_user USING btree (jid, grp); -CREATE INDEX i_sr_user_jid ON sr_user USING btree (jid); -CREATE INDEX i_sr_user_grp ON sr_user USING btree (grp); - -CREATE TABLE spool ( - username text NOT NULL, - xml text NOT NULL, - seq SERIAL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_despool ON spool USING btree (username); - -CREATE TABLE archive ( - username text NOT NULL, - timestamp BIGINT NOT NULL, - peer text NOT NULL, - bare_peer text NOT NULL, - xml text NOT NULL, - txt text, - id SERIAL, - kind text, - nick text, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_username_timestamp ON archive USING btree (username, timestamp); -CREATE INDEX i_username_peer ON archive USING btree (username, peer); -CREATE INDEX i_username_bare_peer ON archive USING btree (username, bare_peer); -CREATE INDEX i_timestamp ON archive USING btree (timestamp); - -CREATE TABLE archive_prefs ( - username text NOT NULL PRIMARY KEY, - def text NOT NULL, - always text NOT NULL, - never text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE TABLE vcard ( - username text PRIMARY KEY, - vcard text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE TABLE vcard_search ( - username text NOT NULL, - lusername text PRIMARY KEY, - fn text NOT NULL, - lfn text NOT NULL, - family text NOT NULL, - lfamily text NOT NULL, - given text NOT NULL, - lgiven text NOT NULL, - middle text NOT NULL, - lmiddle text NOT NULL, - nickname text NOT NULL, - lnickname text NOT NULL, - bday text NOT NULL, - lbday text NOT NULL, - ctry text NOT NULL, - lctry text NOT NULL, - locality text NOT NULL, - llocality text NOT NULL, - email text NOT NULL, - lemail text NOT NULL, - orgname text NOT NULL, - lorgname text NOT NULL, - orgunit text NOT NULL, - lorgunit text NOT NULL -); - -CREATE INDEX i_vcard_search_lfn ON vcard_search(lfn); -CREATE INDEX i_vcard_search_lfamily ON vcard_search(lfamily); -CREATE INDEX i_vcard_search_lgiven ON vcard_search(lgiven); -CREATE INDEX i_vcard_search_lmiddle ON vcard_search(lmiddle); -CREATE INDEX i_vcard_search_lnickname ON vcard_search(lnickname); -CREATE INDEX i_vcard_search_lbday ON vcard_search(lbday); -CREATE INDEX i_vcard_search_lctry ON vcard_search(lctry); -CREATE INDEX i_vcard_search_llocality ON vcard_search(llocality); -CREATE INDEX i_vcard_search_lemail ON vcard_search(lemail); -CREATE INDEX i_vcard_search_lorgname ON vcard_search(lorgname); -CREATE INDEX i_vcard_search_lorgunit ON vcard_search(lorgunit); - -CREATE TABLE privacy_default_list ( - username text PRIMARY KEY, - name text NOT NULL -); - -CREATE TABLE privacy_list ( - username text NOT NULL, - name text NOT NULL, - id SERIAL UNIQUE, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_privacy_list_username ON privacy_list USING btree (username); -CREATE UNIQUE INDEX i_privacy_list_username_name ON privacy_list USING btree (username, name); - -CREATE TABLE privacy_list_data ( - id bigint REFERENCES privacy_list(id) ON DELETE CASCADE, - t character(1) NOT NULL, - value text NOT NULL, - action character(1) NOT NULL, - ord NUMERIC NOT NULL, - match_all boolean NOT NULL, - match_iq boolean NOT NULL, - match_message boolean NOT NULL, - match_presence_in boolean NOT NULL, - match_presence_out boolean NOT NULL -); - -CREATE INDEX i_privacy_list_data_id ON privacy_list_data USING btree (id); - -CREATE TABLE private_storage ( - username text NOT NULL, - namespace text NOT NULL, - data text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_private_storage_username ON private_storage USING btree (username); -CREATE UNIQUE INDEX i_private_storage_username_namespace ON private_storage USING btree (username, namespace); - - -CREATE TABLE roster_version ( - username text PRIMARY KEY, - version text NOT NULL -); - --- To update from 0.9.8: --- CREATE SEQUENCE spool_seq_seq; --- ALTER TABLE spool ADD COLUMN seq integer; --- ALTER TABLE spool ALTER COLUMN seq SET DEFAULT nextval('spool_seq_seq'); --- UPDATE spool SET seq = DEFAULT; --- ALTER TABLE spool ALTER COLUMN seq SET NOT NULL; - --- To update from 1.x: --- ALTER TABLE rosterusers ADD COLUMN askmessage text; --- UPDATE rosterusers SET askmessage = ''; --- ALTER TABLE rosterusers ALTER COLUMN askmessage SET NOT NULL; - -CREATE TABLE pubsub_node ( - host text NOT NULL, - node text NOT NULL, - parent text NOT NULL DEFAULT '', - plugin text NOT NULL, - nodeid SERIAL UNIQUE -); -CREATE INDEX i_pubsub_node_parent ON pubsub_node USING btree (parent); -CREATE UNIQUE INDEX i_pubsub_node_tuple ON pubsub_node USING btree (host, node); - -CREATE TABLE pubsub_node_option ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - name text NOT NULL, - val text NOT NULL -); -CREATE INDEX i_pubsub_node_option_nodeid ON pubsub_node_option USING btree (nodeid); - -CREATE TABLE pubsub_node_owner ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - owner text NOT NULL -); -CREATE INDEX i_pubsub_node_owner_nodeid ON pubsub_node_owner USING btree (nodeid); - -CREATE TABLE pubsub_state ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - jid text NOT NULL, - affiliation character(1), - subscriptions text NOT NULL DEFAULT '', - stateid SERIAL UNIQUE -); -CREATE INDEX i_pubsub_state_jid ON pubsub_state USING btree (jid); -CREATE UNIQUE INDEX i_pubsub_state_tuple ON pubsub_state USING btree (nodeid, jid); - -CREATE TABLE pubsub_item ( - nodeid bigint REFERENCES pubsub_node(nodeid) ON DELETE CASCADE, - itemid text NOT NULL, - publisher text NOT NULL, - creation varchar(32) NOT NULL, - modification varchar(32) NOT NULL, - payload text NOT NULL DEFAULT '' -); -CREATE INDEX i_pubsub_item_itemid ON pubsub_item USING btree (itemid); -CREATE UNIQUE INDEX i_pubsub_item_tuple ON pubsub_item USING btree (nodeid, itemid); - -CREATE TABLE pubsub_subscription_opt ( - subid text NOT NULL, - opt_name varchar(32), - opt_value text NOT NULL -); -CREATE UNIQUE INDEX i_pubsub_subscription_opt ON pubsub_subscription_opt USING btree (subid, opt_name); - -CREATE TABLE muc_room ( - name text NOT NULL, - host text NOT NULL, - opts text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE UNIQUE INDEX i_muc_room_name_host ON muc_room USING btree (name, host); - -CREATE TABLE muc_registered ( - jid text NOT NULL, - host text NOT NULL, - nick text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_muc_registered_nick ON muc_registered USING btree (nick); -CREATE UNIQUE INDEX i_muc_registered_jid_host ON muc_registered USING btree (jid, host); - -CREATE TABLE muc_online_room ( - name text NOT NULL, - host text NOT NULL, - node text NOT NULL, - pid text NOT NULL -); - -CREATE UNIQUE INDEX i_muc_online_room_name_host ON muc_online_room USING btree (name, host); - -CREATE TABLE muc_online_users ( - username text NOT NULL, - server text NOT NULL, - resource text NOT NULL, - name text NOT NULL, - host text NOT NULL, - node text NOT NULL -); - -CREATE UNIQUE INDEX i_muc_online_users ON muc_online_users USING btree (username, server, resource, name, host); -CREATE INDEX i_muc_online_users_us ON muc_online_users USING btree (username, server); - -CREATE TABLE muc_room_subscribers ( - room text NOT NULL, - host text NOT NULL, - jid text NOT NULL, - nick text NOT NULL, - nodes text NOT NULL, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers USING btree (host, jid); -CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers USING btree (host, room, jid); - -CREATE TABLE motd ( - username text PRIMARY KEY, - xml text, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE TABLE caps_features ( - node text NOT NULL, - subnode text NOT NULL, - feature text, - created_at TIMESTAMP NOT NULL DEFAULT now() -); - -CREATE INDEX i_caps_features_node_subnode ON caps_features USING btree (node, subnode); - -CREATE TABLE sm ( - usec bigint NOT NULL, - pid text NOT NULL, - node text NOT NULL, - username text NOT NULL, - resource text NOT NULL, - priority text NOT NULL, - info text NOT NULL -); - -CREATE UNIQUE INDEX i_sm_sid ON sm USING btree (usec, pid); -CREATE INDEX i_sm_node ON sm USING btree (node); -CREATE INDEX i_sm_username ON sm USING btree (username); - -CREATE TABLE oauth_token ( - token text NOT NULL, - jid text NOT NULL, - scope text NOT NULL, - expire bigint NOT NULL -); - -CREATE UNIQUE INDEX i_oauth_token_token ON oauth_token USING btree (token); - -CREATE TABLE route ( - domain text NOT NULL, - server_host text NOT NULL, - node text NOT NULL, - pid text NOT NULL, - local_hint text NOT NULL -); - -CREATE UNIQUE INDEX i_route ON route USING btree (domain, server_host, node, pid); -CREATE INDEX i_route_domain ON route USING btree (domain); - -CREATE TABLE bosh ( - sid text NOT NULL, - node text NOT NULL, - pid text NOT NULL -); - -CREATE UNIQUE INDEX i_bosh_sid ON bosh USING btree (sid); - -CREATE TABLE carboncopy ( - username text NOT NULL, - resource text NOT NULL, - namespace text NOT NULL, - node text NOT NULL -); - -CREATE UNIQUE INDEX i_carboncopy_ur ON carboncopy USING btree (username, resource); -CREATE INDEX i_carboncopy_user ON carboncopy USING btree (username); - -CREATE TABLE proxy65 ( - sid text NOT NULL, - pid_t text NOT NULL, - pid_i text NOT NULL, - node_t text NOT NULL, - node_i text NOT NULL, - jid_i text NOT NULL -); - -CREATE UNIQUE INDEX i_proxy65_sid ON proxy65 USING btree (sid); -CREATE INDEX i_proxy65_jid ON proxy65 USING btree (jid_i); - -CREATE TABLE push_session ( - username text NOT NULL, - timestamp bigint NOT NULL, - service text NOT NULL, - node text NOT NULL, - xml text NOT NULL -); - -CREATE UNIQUE INDEX i_push_usn ON push_session USING btree (username, service, node); -CREATE UNIQUE INDEX i_push_ut ON push_session USING btree (username, timestamp); diff --git a/src/ejabberd_auth_sql.erl b/src/ejabberd_auth_sql.erl index 4d1cf0667..d43074462 100644 --- a/src/ejabberd_auth_sql.erl +++ b/src/ejabberd_auth_sql.erl @@ -47,7 +47,8 @@ %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- -start(_Host) -> ok. +start(Host) -> + ejabberd_sql:load_schema(Host, ejabberd_auth). stop(_Host) -> ok. diff --git a/src/ejabberd_oauth_sql.erl b/src/ejabberd_oauth_sql.erl index f8daa51bd..a0e14d91d 100644 --- a/src/ejabberd_oauth_sql.erl +++ b/src/ejabberd_oauth_sql.erl @@ -39,7 +39,7 @@ -include("logger.hrl"). init() -> - ok. + ejabberd_sql:load_schema(ejabberd_config:get_myname(), ejabberd_oauth). store(R) -> Token = R#oauth_token.token, diff --git a/src/ejabberd_router_sql.erl b/src/ejabberd_router_sql.erl index b7017d528..ea858c2f3 100644 --- a/src/ejabberd_router_sql.erl +++ b/src/ejabberd_router_sql.erl @@ -37,14 +37,21 @@ %%% API %%%=================================================================== init() -> - Node = erlang:atom_to_binary(node(), latin1), - ?DEBUG("Cleaning SQL 'route' table...", []), - case ejabberd_sql:sql_query( - ejabberd_config:get_myname(), ?SQL("delete from route where node=%(Node)s")) of - {updated, _} -> - ok; + Host = ejabberd_config:get_myname(), + case ejabberd_sql:load_schema(Host, ejabberd_router) of + ok -> + Node = erlang:atom_to_binary(node(), latin1), + ?DEBUG("Cleaning SQL 'route' table...", []), + case ejabberd_sql:sql_query( + Host, + ?SQL("delete from route where node=%(Node)s")) of + {updated, _} -> + ok; + Err -> + ?ERROR_MSG("failed to clean 'route' table: ~p", [Err]), + Err + end; Err -> - ?ERROR_MSG("failed to clean 'route' table: ~p", [Err]), Err end. diff --git a/src/ejabberd_sm_sql.erl b/src/ejabberd_sm_sql.erl index bdc32a27c..b368de44e 100644 --- a/src/ejabberd_sm_sql.erl +++ b/src/ejabberd_sm_sql.erl @@ -49,13 +49,19 @@ init() -> ?DEBUG("Cleaning SQL SM table...", []), lists:foldl( fun(Host, ok) -> - case ejabberd_sql:sql_query( - Host, ?SQL("delete from sm where node=%(Node)s")) of - {updated, _} -> - ok; + case ejabberd_sql:load_schema(Host, ejabberd_sm) of + ok -> + case ejabberd_sql:sql_query( + Host, + ?SQL("delete from sm where node=%(Node)s")) of + {updated, _} -> + ok; + Err -> + ?ERROR_MSG("failed to clean 'sm' table: ~p", [Err]), + {error, db_failure} + end; Err -> - ?ERROR_MSG("failed to clean 'sm' table: ~p", [Err]), - {error, db_failure} + Err end; (_, Err) -> Err diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl index 970dece3f..ab7996602 100644 --- a/src/ejabberd_sql.erl +++ b/src/ejabberd_sql.erl @@ -55,6 +55,7 @@ freetds_config/0, odbcinst_config/0, init_mssql/1, + load_schema/2, keep_alive/2]). %% gen_fsm callbacks @@ -189,13 +190,19 @@ sync_send_event(Pid, Msg, Timeout) -> sql_query_t(Query) -> QRes = sql_query_internal(Query), case QRes of - {error, Reason} -> throw({aborted, Reason}); - Rs when is_list(Rs) -> - case lists:keysearch(error, 1, Rs) of - {value, {error, Reason}} -> throw({aborted, Reason}); - _ -> QRes - end; - _ -> QRes + {error, Reason} -> + put(failed_sql_query, Query), + restart(Reason); + Rs when is_list(Rs) -> + case lists:keyfind(error, 1, Rs) of + {error, Reason} -> + put(failed_sql_query, Query), + restart(Reason); + _ -> + QRes + end; + _ -> + QRes end. abort(Reason) -> @@ -281,6 +288,10 @@ sqlite_file(Host) -> use_new_schema() -> ejabberd_config:get_option(new_sql_schema, ?USE_NEW_SCHEMA_DEFAULT). +load_schema(Host, Mod) -> + Type = ejabberd_config:get_option({sql_type, Host}, odbc), + ejabberd_sql_schema:load(Host, Mod, Type). + %%%---------------------------------------------------------------------- %%% Callback functions from gen_fsm %%%---------------------------------------------------------------------- @@ -510,11 +521,12 @@ outer_transaction(F, NRestarts, _Reason) -> sql_query_internal([<<"rollback;">>]), outer_transaction(F, NRestarts - 1, Reason); {aborted, Reason} when NRestarts =:= 0 -> + FailedQuery = erase(failed_sql_query), ?ERROR_MSG("SQL transaction restarts exceeded~n** " - "Restarts: ~p~n** Last abort reason: " + "Restarts: ~p~n** Query: ~p~n** Last abort reason: " "~p~n** Stacktrace: ~p~n** When State " "== ~p", - [?MAX_TRANSACTION_RESTARTS, Reason, + [?MAX_TRANSACTION_RESTARTS, FailedQuery, Reason, erlang:get_stacktrace(), get(?STATE_KEY)]), sql_query_internal([<<"rollback;">>]), {aborted, Reason}; diff --git a/src/ejabberd_sql_schema.erl b/src/ejabberd_sql_schema.erl new file mode 100644 index 000000000..a8eea2b5e --- /dev/null +++ b/src/ejabberd_sql_schema.erl @@ -0,0 +1,386 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeny Khramtsov +%%% Created : 15 July 2018 by Evgeny Khramtsov +%%% +%%% +%%% ejabberd, Copyright (C) 2002-2018 ProcessOne +%%% +%%% This program is free software; you can redistribute it and/or +%%% modify it under the terms of the GNU General Public License as +%%% published by the Free Software Foundation; either version 2 of the +%%% License, or (at your option) any later version. +%%% +%%% This program is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%%% General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License along +%%% with this program; if not, write to the Free Software Foundation, Inc., +%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +%%% +%%%------------------------------------------------------------------- +-module(ejabberd_sql_schema). + +%% API +-export([load/3, list_tables/2]). + +-include("logger.hrl"). + +%%%=================================================================== +%%% API +%%%=================================================================== +load(Host, Mod, Type) when Type == mysql; Type == pgsql; Type == sqlite -> + Dir = misc:sql_dir(), + File = filename:join([Dir, Type, atom_to_list(Mod) ++ ".sql"]), + case read_queries(File) of + {ok, Queries} -> + case exec_queries(Host, Mod, Type, Queries) of + ok -> ok; + {error, Why} -> + ?CRITICAL_MSG("Failed to create tables for ~s: ~p", + [Mod, Why]), + {error, db_failure} + end; + {error, _} = Err -> + Err + end; +load(_, _, _) -> + ok. + +list_tables(Host, Type) -> + Query = list_tables_query(Type), + case ejabberd_sql:sql_query(Host, Query) of + {selected, _, Res} -> + {ok, [T || [T|_] <- Res]}; + {error, _} = Err -> + Err + end. + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== +format_syntax_error({Line, Mod, Reason}) -> + io_lib:format("at line ~B: ~s", [Line, Mod:format_error(Reason)]). + +read_queries(File) -> + case file:read_file(File) of + {ok, Data} -> + case parse_queries(binary_to_list(Data)) of + {error, Why} -> + ?ERROR_MSG("Failed to parse SQL file ~s: ~s", + [File, format_syntax_error(Why)]), + {error, parse_error}; + {ok, Queries} -> + RawQueries = re:split(Data, ";\\s*", [trim]), + {ok, group_queries(lists:zip(Queries, RawQueries))} + end; + {error, Why} = Err -> + ?ERROR_MSG("Failed to read SQL queries from ~s: ~s", + [File, file:format_error(Why)]), + Err + end. + +parse_queries(Queries) -> + case sql_lexer:string(Queries) of + {ok, Tokens, _} -> + sql_codec:parse(Tokens); + {error, Why, _} -> + {error, Why} + end. + +group_queries(Queries) -> + lists:foldl( + fun({Query, Raw}, Acc) when element(1, Query) == create_table -> + Table = element(2, Query), + Columns = [element(1, Col) || Col <- element(3, Query)], + maps:put(Table, {Columns, [Raw]}, Acc); + ({Query, Raw}, Acc) when element(1, Query) == create_index -> + Table = element(4, Query), + {Cols, Qs} = maps:get(Table, Acc), + maps:put(Table, {Cols, Qs++[Raw]}, Acc) + end, #{}, Queries). + +exec_queries(Host, Mod, Type, Map) -> + ?DEBUG("Creating/altering tables for ~s", [Mod]), + Escape = case Type of + mssql -> fun ejabberd_sql:standard_escape/1; + sqlite -> fun ejabberd_sql:standard_escape/1; + _ -> fun ejabberd_sql:escape/1 + end, + F = fun() -> + lists:foreach( + fun({Tab, {NewCols, Queries}}) -> + case table_exists(Type, Tab) of + {true, OldCols} -> + alter_table(Host, Type, Tab, Escape, + NewCols, OldCols); + false -> + ?INFO_MSG("Creating SQL table: ~s", [Tab]), + lists:foreach( + fun ejabberd_sql:sql_query_t/1, + Queries) + end + end, maps:to_list(Map)) + end, + case ejabberd_sql:sql_transaction(Host, F) of + {atomic, _} -> ok; + {aborted, Reason} -> {error, Reason} + end. + +table_exists(Type, Table) -> + Q1 = table_exists_query(Type, Table), + case sql_query(Q1) of + {selected, _, [_|_]} -> + Q2 = table_columns_query(Type, Table), + case sql_query(Q2) of + {selected, Columns, _} -> + {true, Columns}; + Err -> + Err + end; + {selected, _, []} -> false; + Err -> Err + end. + +list_tables_query(sqlite) -> + ["SELECT name FROM sqlite_master WHERE type='table'"]; +list_tables_query(mysql) -> + ["SHOW TABLES"]; +list_tables_query(pgsql) -> + ["SELECT tablename FROM pg_catalog.pg_tables where schemaname NOT IN ", + "('pg_catalog', 'information_schema')"]. + +table_exists_query(pgsql, T) -> + ["SELECT * FROM pg_catalog.pg_tables where tablename='", T, "'"]; +table_exists_query(mysql, T) -> + ["SHOW TABLES LIKE '", T, "'"]; +table_exists_query(sqlite, T) -> + ["SELECT * FROM sqlite_master WHERE type='table' and name='", T, "'"]. + +table_columns_query(_, T) -> + ["SELECT * FROM ", T, " where 0=1"]. + +alter_table(Host, Type, Tab, Escape, NewCols, OldCols) -> + Add = NewCols -- OldCols, + alter_server_host(Host, Type, Tab, Escape, Add). + +alter_server_host(Host, Type, Tab, Escape, Add) -> + case lists:member(<<"server_host">>, Add) of + true -> + ?WARNING_MSG("Upgrading table ~s to multi-domain schema", [Tab]), + add_server_host(binary_to_list(Tab), Type, Host, Escape); + false -> + ok + end. + +%%%=================================================================== +%%% SQL queries to upgrade to the New(R)(TM) Schema +%%%=================================================================== +add_server_host("users", Type , Host, Escape) -> + add_sh_column(Type, "users", Host, Escape), + drop_pkey(Type, "users"), + add_pkey(Type, "users", ["server_host", "username"]), + set_sh(Type, "users", Host, Escape); +add_server_host("last", Type, Host, Escape) -> + add_sh_column(Type, "last", Host, Escape), + drop_pkey(Type, "last"), + add_pkey(Type, "last", ["server_host", "username"]), + set_sh(Type, "last", Host, Escape); +add_server_host("rosterusers", Type, Host, Escape) -> + add_sh_column(Type, "rosterusers", Host, Escape), + drop_index(Type, "i_rosteru_user_jid"), + drop_index(Type, "i_rosteru_username"), + drop_index(Type, "i_rosteru_jid"), + create_unique_index(Type, "rosterusers", "i_rosteru_sh_user_jid", ["server_host", "username", "jid"]), + create_index(Type, "rosterusers", "i_rosteru_sh_username", ["server_host", "username"]), + create_index(Type, "rosterusers", "i_rosteru_sh_jid", ["server_host", "jid"]), + set_sh(Type, "rosterusers", Host, Escape); +add_server_host("rostergroups", Type, Host, Escape) -> + add_sh_column(Type, "rostergroups", Host, Escape), + drop_index(Type, "pk_rosterg_user_jid"), + create_index(Type, "rostergroups", "i_rosterg_sh_user_jid", ["server_host", "username", "jid"]), + set_sh(Type, "rostergroups", Host, Escape); +add_server_host("roster_version", Type, Host, Escape) -> + add_sh_column(Type, "roster_version", Host, Escape), + drop_pkey(Type, "roster_version"), + add_pkey(Type, "roster_version", ["server_host", "username"]), + set_sh(Type, "roster_version", Host, Escape); +add_server_host("sr_group", Type, Host, Escape) -> + add_sh_column(Type, "sr_group", Host, Escape), + add_pkey(Type, "sr_group", ["server_host", "name"]), + set_sh(Type, "sr_group", Host, Escape); +add_server_host("sr_user", Type, Host, Escape) -> + add_sh_column(Type, "sr_user", Host, Escape), + drop_index(Type, "i_sr_user_jid_grp"), + drop_index(Type, "i_sr_user_jid"), + drop_index(Type, "i_sr_user_grp"), + add_pkey(Type, "sr_user", ["server_host", "jid", "grp"]), + create_index(Type, "sr_user", "i_sr_user_sh_jid", ["server_host", "jid"]), + create_index(Type, "sr_user", "i_sr_user_sh_grp", ["server_host", "grp"]), + set_sh(Type, "sr_user", Host, Escape); +add_server_host("spool", Type, Host, Escape) -> + add_sh_column(Type, "spool", Host, Escape), + drop_index(Type, "i_despool"), + create_index(Type, "spool", "i_spool_sh_username", ["server_host", "username"]), + set_sh(Type, "spool", Host, Escape); +add_server_host("archive", Type, Host, Escape) -> + add_sh_column(Type, "archive", Host, Escape), + drop_index(Type, "i_username"), + drop_index(Type, "i_username_timestamp"), + drop_index(Type, "i_timestamp"), + drop_index(Type, "i_peer"), + drop_index(Type, "i_bare_peer"), + create_index(Type, "archive", "i_archive_sh_username_timestamp", ["server_host", "username", "timestamp"]), + create_index(Type, "archive", "i_archive_sh_timestamp", ["server_host", "timestamp"]), + create_index(Type, "archive", "i_archive_sh_peer", ["server_host", "peer"]), + create_index(Type, "archive", "i_archive_sh_bare_peer", ["server_host", "bare_peer"]), + set_sh(Type, "archive", Host, Escape); +add_server_host("archive_prefs", Type, Host, Escape) -> + add_sh_column(Type, "archive_prefs", Host, Escape), + drop_pkey(Type, "archive_prefs"), + add_pkey(Type, "archive_prefs", ["server_host", "username"]), + set_sh(Type, "archive_prefs", Host, Escape); +add_server_host("vcard", Type, Host, Escape) -> + add_sh_column(Type, "vcard", Host, Escape), + drop_pkey(Type, "vcard"), + add_pkey(Type, "vcard", ["server_host", "username"]), + set_sh(Type, "vcard", Host, Escape); +add_server_host("vcard_search", Type, Host, Escape) -> + add_sh_column(Type, "vcard_search", Host, Escape), + drop_pkey(Type, "vcard_search"), + drop_index(Type, "i_vcard_search_lfn"), + drop_index(Type, "i_vcard_search_lfamily"), + drop_index(Type, "i_vcard_search_lgiven"), + drop_index(Type, "i_vcard_search_lmiddle"), + drop_index(Type, "i_vcard_search_lnickname"), + drop_index(Type, "i_vcard_search_lbday"), + drop_index(Type, "i_vcard_search_lctry"), + drop_index(Type, "i_vcard_search_llocality"), + drop_index(Type, "i_vcard_search_lemail"), + drop_index(Type, "i_vcard_search_lorgname"), + drop_index(Type, "i_vcard_search_lorgunit"), + add_pkey(Type, "vcard_search", ["server_host", "username"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lfn", ["server_host", "lfn"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lfamily", ["server_host", "lfamily"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lgiven", ["server_host", "lgiven"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lmiddle", ["server_host", "lmiddle"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lnickname", ["server_host", "lnickname"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lbday", ["server_host", "lbday"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lctry", ["server_host", "lctry"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_llocality", ["server_host", "llocality"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lemail", ["server_host", "lemail"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lorgname", ["server_host", "lorgname"]), + create_index(Type, "vcard_search", "i_vcard_search_sh_lorgunit", ["server_host", "lorgunit"]), + set_sh(Type, "vcard_search", Host, Escape); +add_server_host("privacy_default_list", Type, Host, Escape) -> + add_sh_column(Type, "privacy_default_list", Host, Escape), + drop_pkey(Type, "privacy_default_list"), + add_pkey(Type, "privacy_default_list", ["server_host", "username"]), + set_sh(Type, "privacy_default_list", Host, Escape); +add_server_host("privacy_list", Type, Host, Escape) -> + add_sh_column(Type, "privacy_list", Host, Escape), + drop_index(Type, "i_privacy_list_username"), + drop_index(Type, "i_privacy_list_username_name"), + create_index(Type, "privacy_list", "i_privacy_list_sh_username", ["server_host", "username"]), + create_unique_index(Type, "privacy_list", "i_privacy_list_sh_username_name", + ["server_host", "username", "name"]), + set_sh(Type, "privacy_list", Host, Escape); +add_server_host("private_storage", Type, Host, Escape) -> + add_sh_column(Type, "private_storage", Host, Escape), + drop_index(Type, "i_private_storage_username"), + drop_index(Type, "i_private_storage_username_namespace"), + add_pkey(Type, "private_storage", ["server_host", "username", "namespace"]), + create_index(Type, "private_storage", "i_private_storage_sh_username", ["server_host", "username"]), + set_sh(Type, "private_storage", Host, Escape); +add_server_host(Tab, Type, Host, Escape) when Tab == "muc_room"; + Tab == "muc_registered"; + Tab == "muc_online_room"; + Tab == "muc_online_users" -> + add_sh_column(Type, Tab, Host, Escape), + set_sh(Type, Tab, Host, Escape); +add_server_host("motd", Type, Host, Escape) -> + add_sh_column(Type, "motd", Host, Escape), + drop_pkey(Type, "motd"), + add_pkey(Type, "motd", ["server_host", "username"]), + set_sh(Type, "motd", Host, Escape); +add_server_host("sm", Type, Host, Escape) -> + add_sh_column(Type, "sm", Host, Escape), + drop_index(Type, "i_sm_sid"), + drop_index(Type, "i_sm_username"), + add_pkey(Type, "sm", ["usec", "pid"]), + create_index(Type, "sm", "i_sm_sh_username", ["server_host", "username"]), + set_sh(Type, "sm", Host, Escape); +add_server_host("carboncopy", Type, Host, Escape) -> + add_sh_column(Type, "carboncopy", Host, Escape), + drop_index(Type, "i_carboncopy_ur"), + drop_index(Type, "i_carboncopy_user"), + add_pkey(Type, "carboncopy", ["server_host", "username", "resource"]), + create_index(Type, "carboncopy", "i_carboncopy_sh_user", ["server_host", "username"]), + set_sh(Type, "carboncopy", Host, Escape); +add_server_host("push_session", Type, Host, Escape) -> + add_sh_column(Type, "push_session", Host, Escape), + drop_index(Type, "i_push_usn"), + drop_index(Type, "i_push_ut"), + add_pkey(Type, "push_session", ["server_host", "username", "timestamp"]), + create_index(Type, "push_session", "i_push_session_susn", ["server_host", "username", "service", "node"]), + set_sh(Type, "push_session", Host, Escape); +add_server_host(Tab, _, _, _) -> + ?WARNING_MSG("Unknown table to convert: ~s", [Tab]). + +add_sh_column(mysql, Table, Host, Escape) -> + sql_query( + ["ALTER TABLE ", Table, " ADD COLUMN server_host varchar(191) NOT NULL DEFAULT '", + Escape(Host), "'"]); +add_sh_column(pgsql, Table, Host, Escape) -> + sql_query( + ["ALTER TABLE ", Table, " ADD COLUMN server_host text NOT NULL DEFAULT '", + Escape(Host), "'"]); +add_sh_column(sqlite, Table, _Host, _Escape) -> + sql_query( + ["ALTER TABLE ", Table, " ADD COLUMN server_host text NOT NULL DEFAULT ''"]). + +drop_pkey(mysql, Table) -> + sql_query(["ALTER TABLE ", Table, " DROP PRIMARY KEY"]); +drop_pkey(pgsql, Table) -> + sql_query(["ALTER TABLE ", Table, " DROP CONSTRAINT ", Table, "_pkey"]); +drop_pkey(sqlite, Table) -> + sql_query(["ALTER TABLE ", Table, " DROP PRIMARY KEY"]). + +add_pkey(mysql, Table, Cols) -> + SCols = string:join(Cols, ", "), + sql_query(["ALTER TABLE ", Table, " ADD PRIMARY KEY (", SCols, ")"]); +add_pkey(pgsql, Table, Cols) -> + SCols = string:join(Cols, ", "), + sql_query(["ALTER TABLE ", Table, " ADD PRIMARY KEY (", SCols, ")"]); +add_pkey(sqlite, Table, Cols) -> + create_unique_index(sqlite, Table, string:join(["i"|Cols], "_"), Cols). + +set_sh(sqlite, Table, Host, Escape) -> + sql_query(["UPDATE ", Table, " SET server_host='", Escape(Host), "'"]); +set_sh(_, Table, _Host, _Escape) -> + sql_query(["ALTER TABLE ", Table, " ALTER COLUMN server_host DROP DEFAULT"]). + +drop_index(mysql, Index) -> + sql_query(["DROP INDEX IF EXISTS ", Index]); +drop_index(_pgsql, Index) -> + sql_query(["DROP INDEX IF EXISTS ", Index]). + +create_unique_index(mysql, Table, Index, Cols) -> + Cols2 = [C ++ "(75)" || C <- Cols], + SCols = string:join(Cols2, ", "), + sql_query(["CREATE UNIQUE INDEX ", Index, " ON ", Table, "(", SCols, ")"]); +create_unique_index(_pgsql, Table, Index, Cols) -> + SCols = string:join(Cols, ", "), + sql_query(["CREATE UNIQUE INDEX ", Index, " ON ", Table, " (", SCols, ")"]). + +create_index(mysql, Table, Index, Cols) -> + Cols2 = [C ++ "(75)" || C <- Cols], + SCols = string:join(Cols2, ", "), + sql_query(["CREATE INDEX ", Index, " ON ", Table, "(", SCols, ")"]); +create_index(_pgsql, Table, Index, Cols) -> + SCols = string:join(Cols, ", "), + sql_query(["CREATE INDEX ", Index, " ON ", Table, " (", SCols, ")"]). + +sql_query(Query) -> + ejabberd_sql:sql_query_t(iolist_to_binary(Query)). diff --git a/src/ejabberd_sql_sup.erl b/src/ejabberd_sql_sup.erl index 874a9f99d..eba81bf19 100644 --- a/src/ejabberd_sql_sup.erl +++ b/src/ejabberd_sql_sup.erl @@ -157,61 +157,11 @@ check_sqlite_db(Host) -> end, case Ret of ok -> - sqlite3:sql_exec(DB, "pragma foreign_keys = on"), - case sqlite3:list_tables(DB) of - [] -> - create_sqlite_tables(DB), - sqlite3:close(DB), - ok; - [_H | _] -> - ok - end; + sqlite3:sql_exec(DB, "pragma foreign_keys = on"); {error, Reason} -> ?INFO_MSG("Failed open sqlite database, reason ~p", [Reason]) end. -create_sqlite_tables(DB) -> - SqlDir = misc:sql_dir(), - File = filename:join(SqlDir, "lite.sql"), - case file:open(File, [read, binary]) of - {ok, Fd} -> - Qs = read_lines(Fd, File, []), - ok = sqlite3:sql_exec(DB, "begin"), - [ok = sqlite3:sql_exec(DB, Q) || Q <- Qs], - ok = sqlite3:sql_exec(DB, "commit"); - {error, Reason} -> - ?INFO_MSG("Failed to read SQLite schema file: ~s", - [file:format_error(Reason)]) - end. - -read_lines(Fd, File, Acc) -> - case file:read_line(Fd) of - {ok, Line} -> - NewAcc = case str:strip(str:strip(Line, both, $\r), both, $\n) of - <<"--", _/binary>> -> - Acc; - <<>> -> - Acc; - _ -> - [Line|Acc] - end, - read_lines(Fd, File, NewAcc); - eof -> - QueryList = str:tokens(list_to_binary(lists:reverse(Acc)), <<";">>), - lists:flatmap( - fun(Query) -> - case str:strip(str:strip(Query, both, $\r), both, $\n) of - <<>> -> - []; - Q -> - [<>] - end - end, QueryList); - {error, _} = Err -> - ?ERROR_MSG("Failed read from lite.sql, reason: ~p", [Err]), - [] - end. - -spec opt_type(sql_pool_size) -> fun((pos_integer()) -> pos_integer()); (sql_start_interval) -> fun((pos_integer()) -> pos_integer()); (atom()) -> [atom()]. diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 040bcb7b8..73d54c8b9 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -878,7 +878,7 @@ get_hosts(Opts, Prefix) -> -spec get_module_proc(binary() | global, atom()) -> atom(). get_module_proc(global, Base) -> - get_module_proc(<<"global">>, Base); + Base; get_module_proc(Host, Base) -> binary_to_atom( <<(erlang:atom_to_binary(Base, latin1))/binary, "_", Host/binary>>, diff --git a/src/mod_admin_update_sql.erl b/src/mod_admin_update_sql.erl deleted file mode 100644 index 3c036f341..000000000 --- a/src/mod_admin_update_sql.erl +++ /dev/null @@ -1,361 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : mod_admin_update_sql.erl -%%% Author : Alexey Shchepin -%%% Purpose : Convert SQL DB to the new format -%%% Created : 9 Aug 2017 by Alexey Shchepin -%%% -%%% -%%% ejabberd, Copyright (C) 2002-2018 ProcessOne -%%% -%%% This program is free software; you can redistribute it and/or -%%% modify it under the terms of the GNU General Public License as -%%% published by the Free Software Foundation; either version 2 of the -%%% License, or (at your option) any later version. -%%% -%%% This program is distributed in the hope that it will be useful, -%%% but WITHOUT ANY WARRANTY; without even the implied warranty of -%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%%% General Public License for more details. -%%% -%%% You should have received a copy of the GNU General Public License along -%%% with this program; if not, write to the Free Software Foundation, Inc., -%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -%%% -%%%------------------------------------------------------------------- - --module(mod_admin_update_sql). --author('alexey@process-one.net'). - --behaviour(gen_mod). - --export([start/2, stop/1, reload/3, mod_options/1, - get_commands_spec/0, depends/2]). - -% Commands API --export([update_sql/0]). - - --include("logger.hrl"). --include("ejabberd_commands.hrl"). --include("xmpp.hrl"). --include("ejabberd_sql_pt.hrl"). - -%%% -%%% gen_mod -%%% - -start(_Host, _Opts) -> - ejabberd_commands:register_commands(get_commands_spec()). - -stop(_Host) -> - ejabberd_commands:unregister_commands(get_commands_spec()). - -reload(_Host, _NewOpts, _OldOpts) -> - ok. - -depends(_Host, _Opts) -> - []. - -%%% -%%% Register commands -%%% - -get_commands_spec() -> - [#ejabberd_commands{name = update_sql, tags = [sql], - desc = "Convert SQL DB to the new format", - module = ?MODULE, function = update_sql, - args = [], - args_example = [], - args_desc = [], - result = {res, rescode}, - result_example = ok, - result_desc = "Status code: 0 on success, 1 otherwise"} - ]. - -update_sql() -> - lists:foreach( - fun(Host) -> - case ejabberd_sql_sup:get_pids(Host) of - [] -> - ok; - _ -> - update_sql(Host) - end - end, ejabberd_config:get_myhosts()), - ok. - --record(state, {host :: binary(), - dbtype :: mysql | pgsql | sqlite | mssql | odbc, - escape}). - -update_sql(Host) -> - LHost = jid:nameprep(Host), - DBType = ejabberd_config:get_option({sql_type, LHost}, undefined), - IsSupported = - case DBType of - pgsql -> true; - _ -> false - end, - if - not IsSupported -> - io:format("Converting ~p DB is not supported~n", [DBType]), - error; - true -> - Escape = - case DBType of - mssql -> fun ejabberd_sql:standard_escape/1; - sqlite -> fun ejabberd_sql:standard_escape/1; - _ -> fun ejabberd_sql:escape/1 - end, - State = #state{host = LHost, - dbtype = DBType, - escape = Escape}, - update_tables(State) - end. - -update_tables(State) -> - add_sh_column(State, "users"), - drop_pkey(State, "users"), - add_pkey(State, "users", ["server_host", "username"]), - drop_sh_default(State, "users"), - - add_sh_column(State, "last"), - drop_pkey(State, "last"), - add_pkey(State, "last", ["server_host", "username"]), - drop_sh_default(State, "last"), - - add_sh_column(State, "rosterusers"), - drop_index(State, "i_rosteru_user_jid"), - drop_index(State, "i_rosteru_username"), - drop_index(State, "i_rosteru_jid"), - create_unique_index(State, "rosterusers", "i_rosteru_sh_user_jid", ["server_host", "username", "jid"]), - create_index(State, "rosterusers", "i_rosteru_sh_username", ["server_host", "username"]), - create_index(State, "rosterusers", "i_rosteru_sh_jid", ["server_host", "jid"]), - drop_sh_default(State, "rosterusers"), - - add_sh_column(State, "rostergroups"), - drop_index(State, "pk_rosterg_user_jid"), - create_index(State, "rostergroups", "i_rosterg_sh_user_jid", ["server_host", "username", "jid"]), - drop_sh_default(State, "rostergroups"), - - add_sh_column(State, "sr_group"), - add_pkey(State, "sr_group", ["server_host", "name"]), - drop_sh_default(State, "sr_group"), - - add_sh_column(State, "sr_user"), - drop_index(State, "i_sr_user_jid_grp"), - drop_index(State, "i_sr_user_jid"), - drop_index(State, "i_sr_user_grp"), - add_pkey(State, "sr_user", ["server_host", "jid", "grp"]), - create_index(State, "sr_user", "i_sr_user_sh_jid", ["server_host", "jid"]), - create_index(State, "sr_user", "i_sr_user_sh_grp", ["server_host", "grp"]), - drop_sh_default(State, "sr_user"), - - add_sh_column(State, "spool"), - drop_index(State, "i_despool"), - create_index(State, "spool", "i_spool_sh_username", ["server_host", "username"]), - drop_sh_default(State, "spool"), - - add_sh_column(State, "archive"), - drop_index(State, "i_username"), - drop_index(State, "i_username_timestamp"), - drop_index(State, "i_timestamp"), - drop_index(State, "i_peer"), - drop_index(State, "i_bare_peer"), - create_index(State, "archive", "i_archive_sh_username_timestamp", ["server_host", "username", "timestamp"]), - create_index(State, "archive", "i_archive_sh_timestamp", ["server_host", "timestamp"]), - create_index(State, "archive", "i_archive_sh_peer", ["server_host", "peer"]), - create_index(State, "archive", "i_archive_sh_bare_peer", ["server_host", "bare_peer"]), - drop_sh_default(State, "archive"), - - add_sh_column(State, "archive_prefs"), - drop_pkey(State, "archive_prefs"), - add_pkey(State, "archive_prefs", ["server_host", "username"]), - drop_sh_default(State, "archive_prefs"), - - add_sh_column(State, "vcard"), - drop_pkey(State, "vcard"), - add_pkey(State, "vcard", ["server_host", "username"]), - drop_sh_default(State, "vcard"), - - add_sh_column(State, "vcard_search"), - drop_pkey(State, "vcard_search"), - drop_index(State, "i_vcard_search_lfn"), - drop_index(State, "i_vcard_search_lfamily"), - drop_index(State, "i_vcard_search_lgiven"), - drop_index(State, "i_vcard_search_lmiddle"), - drop_index(State, "i_vcard_search_lnickname"), - drop_index(State, "i_vcard_search_lbday"), - drop_index(State, "i_vcard_search_lctry"), - drop_index(State, "i_vcard_search_llocality"), - drop_index(State, "i_vcard_search_lemail"), - drop_index(State, "i_vcard_search_lorgname"), - drop_index(State, "i_vcard_search_lorgunit"), - add_pkey(State, "vcard_search", ["server_host", "username"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lfn", ["server_host", "lfn"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lfamily", ["server_host", "lfamily"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lgiven", ["server_host", "lgiven"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lmiddle", ["server_host", "lmiddle"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lnickname", ["server_host", "lnickname"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lbday", ["server_host", "lbday"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lctry", ["server_host", "lctry"]), - create_index(State, "vcard_search", "i_vcard_search_sh_llocality", ["server_host", "llocality"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lemail", ["server_host", "lemail"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lorgname", ["server_host", "lorgname"]), - create_index(State, "vcard_search", "i_vcard_search_sh_lorgunit", ["server_host", "lorgunit"]), - drop_sh_default(State, "vcard_search"), - - add_sh_column(State, "privacy_default_list"), - drop_pkey(State, "privacy_default_list"), - add_pkey(State, "privacy_default_list", ["server_host", "username"]), - drop_sh_default(State, "privacy_default_list"), - - add_sh_column(State, "privacy_list"), - drop_index(State, "i_privacy_list_username"), - drop_index(State, "i_privacy_list_username_name"), - create_index(State, "privacy_list", "i_privacy_list_sh_username", ["server_host", "username"]), - create_unique_index(State, "privacy_list", "i_privacy_list_sh_username_name", ["server_host", "username", "name"]), - drop_sh_default(State, "privacy_list"), - - add_sh_column(State, "private_storage"), - drop_index(State, "i_private_storage_username"), - drop_index(State, "i_private_storage_username_namespace"), - add_pkey(State, "private_storage", ["server_host", "username", "namespace"]), - create_index(State, "private_storage", "i_private_storage_sh_username", ["server_host", "username"]), - drop_sh_default(State, "private_storage"), - - add_sh_column(State, "roster_version"), - drop_pkey(State, "roster_version"), - add_pkey(State, "roster_version", ["server_host", "username"]), - drop_sh_default(State, "roster_version"), - - add_sh_column(State, "muc_room"), - drop_sh_default(State, "muc_room"), - - add_sh_column(State, "muc_registered"), - drop_sh_default(State, "muc_registered"), - - add_sh_column(State, "muc_online_room"), - drop_sh_default(State, "muc_online_room"), - - add_sh_column(State, "muc_online_users"), - drop_sh_default(State, "muc_online_users"), - - add_sh_column(State, "motd"), - drop_pkey(State, "motd"), - add_pkey(State, "motd", ["server_host", "username"]), - drop_sh_default(State, "motd"), - - add_sh_column(State, "sm"), - drop_index(State, "i_sm_sid"), - drop_index(State, "i_sm_username"), - add_pkey(State, "sm", ["usec", "pid"]), - create_index(State, "sm", "i_sm_sh_username", ["server_host", "username"]), - drop_sh_default(State, "sm"), - - add_sh_column(State, "carboncopy"), - drop_index(State, "i_carboncopy_ur"), - drop_index(State, "i_carboncopy_user"), - add_pkey(State, "carboncopy", ["server_host", "username", "resource"]), - create_index(State, "carboncopy", "i_carboncopy_sh_user", ["server_host", "username"]), - drop_sh_default(State, "carboncopy"), - - add_sh_column(State, "push_session"), - drop_index(State, "i_push_usn"), - drop_index(State, "i_push_ut"), - add_pkey(State, "push_session", ["server_host", "username", "timestamp"]), - create_index(State, "push_session", "i_push_session_susn", ["server_host", "username", "service", "node"]), - drop_sh_default(State, "push_session"), - - ok. - -add_sh_column(#state{dbtype = pgsql} = State, Table) -> - sql_query( - State#state.host, - ["ALTER TABLE ", Table, " ADD COLUMN server_host text NOT NULL DEFAULT '", - (State#state.escape)(State#state.host), - "';"]); -add_sh_column(#state{dbtype = mysql} = State, Table) -> - sql_query( - State#state.host, - ["ALTER TABLE ", Table, " ADD COLUMN server_host text NOT NULL DEFAULT '", - (State#state.escape)(State#state.host), - "';"]). - -drop_pkey(#state{dbtype = pgsql} = State, Table) -> - sql_query( - State#state.host, - ["ALTER TABLE ", Table, " DROP CONSTRAINT ", Table, "_pkey;"]); -drop_pkey(#state{dbtype = mysql} = State, Table) -> - sql_query( - State#state.host, - ["ALTER TABLE ", Table, " DROP PRIMARY KEY;"]). - -add_pkey(#state{dbtype = pgsql} = State, Table, Cols) -> - SCols = string:join(Cols, ", "), - sql_query( - State#state.host, - ["ALTER TABLE ", Table, " ADD PRIMARY KEY (", SCols, ");"]); -add_pkey(#state{dbtype = mysql} = State, Table, Cols) -> - SCols = string:join(Cols, ", "), - sql_query( - State#state.host, - ["ALTER TABLE ", Table, " ADD PRIMARY KEY (", SCols, ");"]). - -drop_sh_default(#state{dbtype = pgsql} = State, Table) -> - sql_query( - State#state.host, - ["ALTER TABLE ", Table, " ALTER COLUMN server_host DROP DEFAULT;"]); -drop_sh_default(#state{dbtype = mysql} = State, Table) -> - sql_query( - State#state.host, - ["ALTER TABLE ", Table, " ALTER COLUMN server_host DROP DEFAULT;"]). - -drop_index(#state{dbtype = pgsql} = State, Index) -> - sql_query( - State#state.host, - ["DROP INDEX ", Index, ";"]); -drop_index(#state{dbtype = mysql} = State, Index) -> - sql_query( - State#state.host, - ["DROP INDEX ", Index, ";"]). - -create_unique_index(#state{dbtype = pgsql} = State, Table, Index, Cols) -> - SCols = string:join(Cols, ", "), - sql_query( - State#state.host, - ["CREATE UNIQUE INDEX ", Index, " ON ", Table, " USING btree (", - SCols, ");"]); -create_unique_index(#state{dbtype = mysql} = State, Table, Index, Cols) -> - Cols2 = [C ++ "(75)" || C <- Cols], - SCols = string:join(Cols2, ", "), - sql_query( - State#state.host, - ["CREATE UNIQUE INDEX ", Index, " ON ", Table, "(", - SCols, ");"]). - -create_index(#state{dbtype = pgsql} = State, Table, Index, Cols) -> - SCols = string:join(Cols, ", "), - sql_query( - State#state.host, - ["CREATE INDEX ", Index, " ON ", Table, " USING btree (", - SCols, ");"]); -create_index(#state{dbtype = mysql} = State, Table, Index, Cols) -> - Cols2 = [C ++ "(75)" || C <- Cols], - SCols = string:join(Cols2, ", "), - sql_query( - State#state.host, - ["CREATE INDEX ", Index, " ON ", Table, "(", - SCols, ");"]). - -sql_query(Host, Query) -> - io:format("executing \"~s\" on ~s~n", [Query, Host]), - case ejabberd_sql:sql_query(Host, Query) of - {error, Error} -> - io:format("error: ~p~n", [Error]), - ok; - _ -> - ok - end. - -mod_options(_) -> []. diff --git a/src/mod_announce_sql.erl b/src/mod_announce_sql.erl index c4f1ba86f..46609a4d0 100644 --- a/src/mod_announce_sql.erl +++ b/src/mod_announce_sql.erl @@ -41,8 +41,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_announce). set_motd_users(LServer, USRs) -> F = fun() -> diff --git a/src/mod_bosh_sql.erl b/src/mod_bosh_sql.erl index c32714c87..e7482d2d7 100644 --- a/src/mod_bosh_sql.erl +++ b/src/mod_bosh_sql.erl @@ -38,14 +38,21 @@ %%% API %%%=================================================================== init() -> - Node = erlang:atom_to_binary(node(), latin1), - ?DEBUG("Cleaning SQL 'bosh' table...", []), - case ejabberd_sql:sql_query( - ejabberd_config:get_myname(), ?SQL("delete from bosh where node=%(Node)s")) of - {updated, _} -> - ok; + Host = ejabberd_config:get_myname(), + case ejabberd_sql:load_schema(Host, mod_bosh) of + ok -> + Node = erlang:atom_to_binary(node(), latin1), + ?DEBUG("Cleaning SQL 'bosh' table...", []), + case ejabberd_sql:sql_query( + Host, + ?SQL("delete from bosh where node=%(Node)s")) of + {updated, _} -> + ok; + Err -> + ?ERROR_MSG("failed to clean 'route' table: ~p", [Err]), + Err + end; Err -> - ?ERROR_MSG("failed to clean 'route' table: ~p", [Err]), Err end. diff --git a/src/mod_caps_sql.erl b/src/mod_caps_sql.erl index 01da67158..e0641f19d 100644 --- a/src/mod_caps_sql.erl +++ b/src/mod_caps_sql.erl @@ -38,8 +38,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_caps). caps_read(LServer, {Node, SubNode}) -> case ejabberd_sql:sql_query( diff --git a/src/mod_carboncopy_sql.erl b/src/mod_carboncopy_sql.erl index 46b6ea806..eae43ff24 100644 --- a/src/mod_carboncopy_sql.erl +++ b/src/mod_carboncopy_sql.erl @@ -35,7 +35,12 @@ %%% API %%%=================================================================== init(Host, _Opts) -> - clean_table(Host). + case ejabberd_sql:load_schema(Host, mod_carboncopy) of + ok -> + clean_table(Host); + Err -> + Err + end. enable(LUser, LServer, LResource, NS) -> NodeS = erlang:atom_to_binary(node(), latin1), diff --git a/src/mod_last_sql.erl b/src/mod_last_sql.erl index e8168f3f2..2fa3222ee 100644 --- a/src/mod_last_sql.erl +++ b/src/mod_last_sql.erl @@ -39,8 +39,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_last). get_last(LUser, LServer) -> case ejabberd_sql:sql_query( diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index 37ea8dc6f..022e92166 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -41,8 +41,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_mam). remove_user(LUser, LServer) -> ejabberd_sql:sql_query( diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index d078b64f1..4435c28bc 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -52,7 +52,12 @@ init(Host, Opts) -> case gen_mod:ram_db_mod(Host, Opts, mod_muc) of ?MODULE -> - clean_tables(Host); + case ejabberd_sql:load_schema(Host, mod_muc) of + ok -> + clean_tables(Host); + Err -> + Err + end; _ -> ok end. diff --git a/src/mod_offline_sql.erl b/src/mod_offline_sql.erl index 0e764c269..0c9f9f633 100644 --- a/src/mod_offline_sql.erl +++ b/src/mod_offline_sql.erl @@ -41,8 +41,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_offline). store_message(#offline_msg{us = {LUser, LServer}} = M) -> From = M#offline_msg.from, diff --git a/src/mod_privacy_sql.erl b/src/mod_privacy_sql.erl index 4ee0984a8..49331f8ac 100644 --- a/src/mod_privacy_sql.erl +++ b/src/mod_privacy_sql.erl @@ -43,8 +43,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_privacy). unset_default(LUser, LServer) -> case unset_default_privacy_list(LUser, LServer) of diff --git a/src/mod_private_sql.erl b/src/mod_private_sql.erl index a0ec03c6a..602db6e54 100644 --- a/src/mod_private_sql.erl +++ b/src/mod_private_sql.erl @@ -38,8 +38,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_private). set_data(LUser, LServer, Data) -> F = fun() -> diff --git a/src/mod_proxy65_sql.erl b/src/mod_proxy65_sql.erl index 0f51adb55..c47db4c11 100644 --- a/src/mod_proxy65_sql.erl +++ b/src/mod_proxy65_sql.erl @@ -35,16 +35,22 @@ %%% API %%%=================================================================== init() -> - NodeS = erlang:atom_to_binary(node(), latin1), - ?DEBUG("Cleaning SQL 'proxy65' table...", []), - case ejabberd_sql:sql_query( - ejabberd_config:get_myname(), - ?SQL("delete from proxy65 where " - "node_i=%(NodeS)s or node_t=%(NodeS)s")) of - {updated, _} -> - ok; + Host = ejabberd_config:get_myname(), + case ejabberd_sql:load_schema(Host, mod_proxy65) of + ok -> + NodeS = erlang:atom_to_binary(node(), latin1), + ?DEBUG("Cleaning SQL 'proxy65' table...", []), + case ejabberd_sql:sql_query( + Host, + ?SQL("delete from proxy65 where " + "node_i=%(NodeS)s or node_t=%(NodeS)s")) of + {updated, _} -> + ok; + Err -> + ?ERROR_MSG("failed to clean 'proxy65' table: ~p", [Err]), + Err + end; Err -> - ?ERROR_MSG("failed to clean 'proxy65' table: ~p", [Err]), Err end. diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 2609beb86..829919984 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -249,6 +249,7 @@ init([ServerHost, Opts]) -> ejabberd_mnesia:create(?MODULE, pubsub_last_item, [{ram_copies, [node()]}, {attributes, record_info(fields, pubsub_last_item)}]), + load_sql_schema(ServerHost, Opts), AllPlugins = lists:flatmap( fun(Host) -> @@ -3643,6 +3644,16 @@ do_transaction(ServerHost, Fun, Trans, DBType) -> {error, xmpp:err_internal_server_error(<<"Database failure">>, ejabberd_config:get_mylang())} end. +-spec load_sql_schema(binary(), gen_mod:opts()) -> ok | {error, atom()}. +load_sql_schema(Host, Opts) -> + case gen_mod:get_opt(db_type, Opts) of + sql -> + %% TODO: check result and stop at error + ejabberd_sql:load_schema(Host, ?MODULE); + _ -> + ok + end. + %%%% helpers %% Add pubsub-specific error element diff --git a/src/mod_push_sql.erl b/src/mod_push_sql.erl index 5879e163a..7c46d75aa 100644 --- a/src/mod_push_sql.erl +++ b/src/mod_push_sql.erl @@ -40,8 +40,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_push). store_session(LUser, LServer, NowTS, PushJID, Node, XData) -> XML = encode_xdata(XData), diff --git a/src/mod_roster_sql.erl b/src/mod_roster_sql.erl index 85019e21d..6d559316c 100644 --- a/src/mod_roster_sql.erl +++ b/src/mod_roster_sql.erl @@ -42,8 +42,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_roster). read_roster_version(LUser, LServer) -> case ejabberd_sql:sql_query( diff --git a/src/mod_shared_roster_sql.erl b/src/mod_shared_roster_sql.erl index 00714fca9..5cdd14925 100644 --- a/src/mod_shared_roster_sql.erl +++ b/src/mod_shared_roster_sql.erl @@ -44,8 +44,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_shared_roster). list_groups(Host) -> case ejabberd_sql:sql_query( diff --git a/src/mod_vcard_sql.erl b/src/mod_vcard_sql.erl index 57d2052a0..8dbba9db1 100644 --- a/src/mod_vcard_sql.erl +++ b/src/mod_vcard_sql.erl @@ -42,8 +42,8 @@ %%%=================================================================== %%% API %%%=================================================================== -init(_Host, _Opts) -> - ok. +init(Host, _Opts) -> + ejabberd_sql:load_schema(Host, mod_vcard). stop(_Host) -> ok. diff --git a/test/ejabberd_SUITE.erl b/test/ejabberd_SUITE.erl index 553eae1e4..865e64b83 100644 --- a/test/ejabberd_SUITE.erl +++ b/test/ejabberd_SUITE.erl @@ -113,7 +113,7 @@ do_init_per_group(mysql, Config) -> case catch ejabberd_sql:sql_query(?MYSQL_VHOST, [<<"select 1;">>]) of {selected, _, _} -> mod_muc:shutdown_rooms(?MYSQL_VHOST), - create_sql_tables(mysql, ?config(base_dir, Config)), + clear_sql_tables(mysql, ?MYSQL_VHOST), set_opt(server, ?MYSQL_VHOST, Config); Err -> {skip, {mysql_not_available, Err}} @@ -122,7 +122,7 @@ do_init_per_group(pgsql, Config) -> case catch ejabberd_sql:sql_query(?PGSQL_VHOST, [<<"select 1;">>]) of {selected, _, _} -> mod_muc:shutdown_rooms(?PGSQL_VHOST), - create_sql_tables(pgsql, ?config(base_dir, Config)), + clear_sql_tables(pgsql, ?PGSQL_VHOST), set_opt(server, ?PGSQL_VHOST, Config); Err -> {skip, {pgsql_not_available, Err}} @@ -131,6 +131,7 @@ do_init_per_group(sqlite, Config) -> case catch ejabberd_sql:sql_query(?SQLITE_VHOST, [<<"select 1;">>]) of {selected, _, _} -> mod_muc:shutdown_rooms(?SQLITE_VHOST), + clear_sql_tables(sqlite, ?SQLITE_VHOST), set_opt(server, ?SQLITE_VHOST, Config); Err -> {skip, {sqlite_not_available, Err}} @@ -1070,92 +1071,26 @@ bookmark_conference() -> %%%=================================================================== %%% SQL stuff %%%=================================================================== -create_sql_tables(sqlite, _BaseDir) -> - ok; -create_sql_tables(Type, BaseDir) -> - {VHost, File} = case Type of - mysql -> - Path = case ejabberd_sql:use_new_schema() of - true -> - "mysql.new.sql"; - false -> - "mysql.sql" - end, - {?MYSQL_VHOST, Path}; - pgsql -> - Path = case ejabberd_sql:use_new_schema() of - true -> - "pg.new.sql"; - false -> - "pg.sql" - end, - {?PGSQL_VHOST, Path} - end, - SQLFile = filename:join([BaseDir, "sql", File]), - CreationQueries = read_sql_queries(SQLFile), - DropTableQueries = drop_table_queries(CreationQueries), - case ejabberd_sql:sql_transaction( - VHost, DropTableQueries ++ CreationQueries) of - {atomic, ok} -> - ok; - Err -> - ct:fail({failed_to_create_sql_tables, Type, Err}) +clear_sql_tables(Type, Host) -> + case ejabberd_sql_schema:list_tables(Host, Type) of + {ok, Tabs} -> + F = fun() -> + lists:foreach( + fun(Tab) -> + ejabberd_sql:sql_query_t( + <<"DELETE FROM ", Tab/binary>>) + end, Tabs) + end, + case ejabberd_sql:sql_transaction(Host, F) of + {atomic, ok} -> + ok; + Err -> + ct:fail({failed_to_clear_sql_tables, Type, Err}) + end; + {error, _} = Err -> + ct:fail({failed_to_list_sql_tables, Type, Err}) end. -read_sql_queries(File) -> - case file:open(File, [read, binary]) of - {ok, Fd} -> - read_lines(Fd, File, []); - Err -> - ct:fail({open_file_failed, File, Err}) - end. - -drop_table_queries(Queries) -> - lists:foldl( - fun(Query, Acc) -> - case split(str:to_lower(Query)) of - [<<"create">>, <<"table">>, Table|_] -> - [<<"DROP TABLE IF EXISTS ", Table/binary, ";">>|Acc]; - _ -> - Acc - end - end, [], Queries). - -read_lines(Fd, File, Acc) -> - case file:read_line(Fd) of - {ok, Line} -> - NewAcc = case str:strip(str:strip(Line, both, $\r), both, $\n) of - <<"--", _/binary>> -> - Acc; - <<>> -> - Acc; - _ -> - [Line|Acc] - end, - read_lines(Fd, File, NewAcc); - eof -> - QueryList = str:tokens(list_to_binary(lists:reverse(Acc)), <<";">>), - lists:flatmap( - fun(Query) -> - case str:strip(str:strip(Query, both, $\r), both, $\n) of - <<>> -> - []; - Q -> - [<>] - end - end, QueryList); - {error, _} = Err -> - ct:fail({read_file_failed, File, Err}) - end. - -split(Data) -> - lists:filter( - fun(<<>>) -> - false; - (_) -> - true - end, re:split(Data, <<"\s">>)). - clear_riak_tables(Config) -> User = ?config(user, Config), Server = ?config(server, Config), diff --git a/test/ejabberd_SUITE_data/ejabberd.yml b/test/ejabberd_SUITE_data/ejabberd.yml index 51cb85a5a..c9823de60 100644 --- a/test/ejabberd_SUITE_data/ejabberd.yml +++ b/test/ejabberd_SUITE_data/ejabberd.yml @@ -489,6 +489,7 @@ listen: loglevel: @@loglevel@@ max_fsm_queue: 1000 queue_type: file +new_sql_schema: true modules: mod_adhoc: [] mod_configure: []