]> granicus.if.org Git - ejabberd/commitdiff
Initial SQL auto-update version
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Wed, 18 Jul 2018 11:01:29 +0000 (14:01 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Wed, 18 Jul 2018 11:01:29 +0000 (14:01 +0300)
35 files changed:
rebar.config
sql/lite.new.sql [deleted file]
sql/lite.sql [deleted file]
sql/mssql.sql [deleted file]
sql/mysql.new.sql [deleted file]
sql/mysql.sql [deleted file]
sql/pg.new.sql [deleted file]
sql/pg.sql [deleted file]
src/ejabberd_auth_sql.erl
src/ejabberd_oauth_sql.erl
src/ejabberd_router_sql.erl
src/ejabberd_sm_sql.erl
src/ejabberd_sql.erl
src/ejabberd_sql_schema.erl [new file with mode: 0644]
src/ejabberd_sql_sup.erl
src/gen_mod.erl
src/mod_admin_update_sql.erl [deleted file]
src/mod_announce_sql.erl
src/mod_bosh_sql.erl
src/mod_caps_sql.erl
src/mod_carboncopy_sql.erl
src/mod_last_sql.erl
src/mod_mam_sql.erl
src/mod_muc_sql.erl
src/mod_offline_sql.erl
src/mod_privacy_sql.erl
src/mod_private_sql.erl
src/mod_proxy65_sql.erl
src/mod_pubsub.erl
src/mod_push_sql.erl
src/mod_roster_sql.erl
src/mod_shared_roster_sql.erl
src/mod_vcard_sql.erl
test/ejabberd_SUITE.erl
test/ejabberd_SUITE_data/ejabberd.yml

index 4a32eac442a19109f70d7bc38c52f19b7429c517..7f0c609470fd918bde198b7cb863cda82d697a30 100644 (file)
@@ -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 (file)
index d58d04c..0000000
+++ /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 (file)
index abb25d5..0000000
+++ /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 (file)
index c6a8931..0000000
+++ /dev/null
@@ -1,559 +0,0 @@
---\r
--- ejabberd, Copyright (C) 2002-2017   ProcessOne\r
---\r
--- This program is free software; you can redistribute it and/or\r
--- modify it under the terms of the GNU General Public License as\r
--- published by the Free Software Foundation; either version 2 of the\r
--- License, or (at your option) any later version.\r
---\r
--- This program is distributed in the hope that it will be useful,\r
--- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
--- General Public License for more details.\r
---\r
--- You should have received a copy of the GNU General Public License along\r
--- with this program; if not, write to the Free Software Foundation, Inc.,\r
--- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
---\r
-\r
-SET ANSI_PADDING OFF;\r
-SET ANSI_NULLS ON;\r
-SET QUOTED_IDENTIFIER ON;\r
-SET ANSI_PADDING ON;\r
-\r
-CREATE TABLE [dbo].[archive] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [timestamp] [bigint] NOT NULL,\r
-        [peer] [varchar] (250) NOT NULL,\r
-        [bare_peer] [varchar] (250) NOT NULL,\r
-        [xml] [text] NOT NULL,\r
-        [txt] [text] NULL,\r
-        [id] [bigint] IDENTITY(1,1) NOT NULL,\r
-        [kind] [varchar] (10) NULL,\r
-        [nick] [varchar] (250) NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE(),\r
- CONSTRAINT [archive_PK] PRIMARY KEY CLUSTERED \r
-(\r
-        [id] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE INDEX [archive_username_timestamp] ON [archive] (username, timestamp)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [archive_username_peer] ON [archive] (username, peer)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [archive_username_bare_peer] ON [archive] (username, bare_peer)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [archive_timestamp] ON [archive] (timestamp)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[archive_prefs] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [def] [text] NOT NULL,\r
-        [always] [text] NOT NULL,\r
-        [never] [text] NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE(),\r
- CONSTRAINT [archive_prefs_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [username] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[caps_features] (\r
-        [node] [varchar] (250) NOT NULL,\r
-        [subnode] [varchar] (250) NOT NULL,\r
-        [feature] [text] NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE()\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE CLUSTERED INDEX [caps_features_node_subnode] ON [caps_features] (node, subnode)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[last] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [seconds] [text] NOT NULL,\r
-        [state] [text] NOT NULL,\r
- CONSTRAINT [last_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [username] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[motd] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [xml] [text] NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE(),\r
- CONSTRAINT [motd_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [username] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[muc_registered] (\r
-        [jid] [varchar] (255) NOT NULL,\r
-        [host] [varchar] (255) NOT NULL,\r
-        [nick] [varchar] (255) NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE()\r
-);\r
-\r
-CREATE INDEX [muc_registered_nick] ON [muc_registered] (nick)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [muc_registered_jid_host] ON [muc_registered] (jid, host)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[muc_room] (\r
-        [name] [varchar] (250) NOT NULL,\r
-        [host] [varchar] (250) NOT NULL,\r
-        [opts] [text] NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE()\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [muc_room_name_host] ON [muc_room] (name, host)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[muc_online_room] (\r
-        [name] [varchar] (250) NOT NULL,\r
-       [host] [varchar] (250) NOT NULL,\r
-       [node] [text] NOT NULL,\r
-       [pid] [text] NOT NULL\r
-);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [muc_online_room_name_host] ON [muc_online_room] (name, host)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[muc_online_users] (\r
-    [username] [varchar] (250) NOT NULL,\r
-    [server] [varchar] (250) NOT NULL,\r
-    [resource] [varchar] (250) NOT NULL,\r
-    [name] [varchar] (250) NOT NULL,\r
-    [host] [varchar] (250) NOT NULL,\r
-    node text NOT NULL\r
-);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [muc_online_users_i] ON [muc_online_users] (username, server, resource, name, host)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-CREATE UNIQUE CLUSTERED INDEX [muc_online_users_us] ON [muc_online_users] (username, server);\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[muc_room_subscribers] (\r
-        [room] [varchar] (191) NOT NULL,\r
-        [host] [varchar] (191) NOT NULL,\r
-        [jid] [varchar] (191) NOT NULL,\r
-        [nick] [text] NOT NULL,\r
-        [nodes] [text] NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE()\r
-);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [muc_room_subscribers_host_room_jid] ON [muc_room_subscribers] (host, room, jid);\r
-CREATE INDEX [muc_room_subscribers_host_jid] ON [muc_room_subscribers] (host, jid);\r
-\r
-CREATE TABLE [dbo].[privacy_default_list] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [name] [varchar] (250) NOT NULL,\r
- CONSTRAINT [privacy_default_list_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [username] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-);\r
-\r
-CREATE TABLE [dbo].[privacy_list] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [name] [varchar] (250) NOT NULL,\r
-        [id] [bigint] IDENTITY(1,1) NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE(),\r
- CONSTRAINT [privacy_list_PK] PRIMARY KEY CLUSTERED \r
-(\r
-        [id] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-);\r
-\r
-CREATE INDEX [privacy_list_username] ON [privacy_list] (username)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE UNIQUE INDEX [privacy_list_username_name] ON [privacy_list] (username, name)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[privacy_list_data] (\r
-        [id] [bigint] NULL,\r
-        [t] [char] (1) NOT NULL,\r
-        [value] [text] NOT NULL,\r
-        [action] [char] (1) NOT NULL,\r
-        [ord] [smallint] NOT NULL,\r
-        [match_all] [smallint] NOT NULL,\r
-        [match_iq] [smallint] NOT NULL,\r
-        [match_message] [smallint] NOT NULL,\r
-        [match_presence_in] [smallint] NOT NULL,\r
-        [match_presence_out] [smallint] NOT NULL\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE CLUSTERED INDEX [privacy_list_data_id] ON [privacy_list_data] (id)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[private_storage] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [namespace] [varchar] (250) NOT NULL,\r
-        [data] [text] NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE()\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE INDEX [private_storage_username] ON [private_storage] (username)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [private_storage_username_namespace] ON [private_storage] (username, namespace)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[pubsub_item] (\r
-        [nodeid] [bigint] NULL,\r
-        [itemid] [varchar] (255) NOT NULL,\r
-        [publisher] [text] NOT NULL,\r
-        [creation] [varchar] (32) NOT NULL,\r
-        [modification] [varchar] (32) NOT NULL,\r
-        [payload] [text] NOT NULL DEFAULT ''\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE INDEX [pubsub_item_itemid] ON [pubsub_item] (itemid)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [pubsub_item_nodeid_itemid] ON [pubsub_item] (nodeid, itemid)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[pubsub_node_option] (\r
-        [nodeid] [bigint] NULL,\r
-        [name] [text] NOT NULL,\r
-        [val] [text] NOT NULL\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE CLUSTERED INDEX [pubsub_node_option_nodeid] ON [pubsub_node_option] (nodeid)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[pubsub_node_owner] (\r
-        [nodeid] [bigint] NULL,\r
-        [owner] [text] NOT NULL\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE CLUSTERED INDEX [pubsub_node_owner_nodeid] ON [pubsub_node_owner] (nodeid)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[pubsub_state] (\r
-        [nodeid] [bigint] NULL,\r
-        [jid] [varchar] (255) NOT NULL,\r
-        [affiliation] [char] (1) NOT NULL,\r
-        [subscriptions] [text] NOT NULL DEFAULT '',\r
-        [stateid] [bigint] IDENTITY(1,1) NOT NULL,\r
- CONSTRAINT [pubsub_state_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [stateid] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE INDEX [pubsub_state_jid] ON [pubsub_state] (jid)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE UNIQUE INDEX [pubsub_state_nodeid_jid] ON [pubsub_state] (nodeid, jid)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[pubsub_subscription_opt] (\r
-        [subid] [varchar] (255) NOT NULL,\r
-        [opt_name] [varchar] (32) NOT NULL,\r
-        [opt_value] [text] NOT NULL\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [pubsub_subscription_opt_subid_opt_name] ON [pubsub_subscription_opt] (subid, opt_name)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[pubsub_node] (\r
-        [host] [varchar] (255) NOT NULL,\r
-        [node] [varchar] (255) NOT NULL,\r
-        [parent] [varchar] (255) NOT NULL DEFAULT '',\r
-        [plugin] [text] NOT NULL,\r
-        [nodeid] [bigint] IDENTITY(1,1) NOT NULL,\r
- CONSTRAINT [pubsub_node_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [nodeid] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE INDEX [pubsub_node_parent] ON [pubsub_node] (parent)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE UNIQUE INDEX [pubsub_node_host_node] ON [pubsub_node] (host, node)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[roster_version] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [version] [text] NOT NULL,\r
- CONSTRAINT [roster_version_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [username] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[rostergroups] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [jid] [varchar] (250) NOT NULL,\r
-        [grp] [text] NOT NULL\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE CLUSTERED INDEX [rostergroups_username_jid] ON [rostergroups] ([username], [jid])\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[rosterusers] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [jid] [varchar] (250) NOT NULL,\r
-        [nick] [text] NOT NULL,\r
-        [subscription] [char] (1) NOT NULL,\r
-        [ask] [char] (1) NOT NULL,\r
-        [askmessage] [text] NOT NULL,\r
-        [server] [char] (1) NOT NULL,\r
-        [subscribe] [text] NOT NULL,\r
-        [type] [text] NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE()\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [rosterusers_username_jid] ON [rosterusers] ([username], [jid])\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [rosterusers_username] ON [rosterusers] ([username])\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [rosterusers_jid] ON [rosterusers] ([jid])\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[sm] (\r
-        [usec] [bigint] NOT NULL,\r
-        [pid] [varchar] (100) NOT NULL,\r
-        [node] [varchar] (255) NOT NULL,\r
-        [username] [varchar] (255) NOT NULL,\r
-        [resource] [varchar] (255) NOT NULL,\r
-        [priority] [text] NOT NULL,\r
-        [info] [text] NOT NULL\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [sm_sid] ON [sm] (usec, pid)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [sm_node] ON [sm] (node)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [sm_username] ON [sm] (username)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[spool] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [xml] [text] NOT NULL,\r
-        [seq] [bigint] IDENTITY(1,1) NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE(),\r
- CONSTRAINT [spool_PK] PRIMARY KEY CLUSTERED \r
-(\r
-        [seq] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE INDEX [spool_username] ON [spool] (username)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [spool_created_at] ON [spool] (created_at)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-;\r
-\r
-CREATE TABLE [dbo].[sr_group] (\r
-        [name] [varchar] (250) NOT NULL,\r
-        [opts] [text] NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE(),\r
- CONSTRAINT [sr_group_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [name] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[sr_user] (\r
-        [jid] [varchar] (250) NOT NULL,\r
-        [grp] [varchar] (250) NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE()\r
-);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [sr_user_jid_group] ON [sr_user] ([jid], [grp])\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [sr_user_jid] ON [sr_user] ([jid])\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [sr_user_grp] ON [sr_user] ([grp])\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[users] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [password] [text] NOT NULL,\r
-        [serverkey] [text] NOT NULL DEFAULT '',\r
-        [salt] [text] NOT NULL DEFAULT '',\r
-        [iterationcount] [smallint] NOT NULL DEFAULT 0,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE(),\r
- CONSTRAINT [users_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [username] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[vcard] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [vcard] [text] NOT NULL,\r
-        [created_at] [datetime] NOT NULL DEFAULT GETDATE(),\r
- CONSTRAINT [vcard_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [username] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[vcard_search] (\r
-        [username] [varchar] (250) NOT NULL,\r
-        [lusername] [varchar] (250) NOT NULL,\r
-        [fn] [text] NOT NULL,\r
-        [lfn] [varchar] (250) NOT NULL,\r
-        [family] [text] NOT NULL,\r
-        [lfamily] [varchar] (250) NOT NULL,\r
-        [given] [text] NOT NULL,\r
-        [lgiven] [varchar] (250) NOT NULL,\r
-        [middle] [text] NOT NULL,\r
-        [lmiddle] [varchar] (250) NOT NULL,\r
-        [nickname] [text] NOT NULL,\r
-        [lnickname] [varchar] (250) NOT NULL,\r
-        [bday] [text] NOT NULL,\r
-        [lbday] [varchar] (250) NOT NULL,\r
-        [ctry] [text] NOT NULL,\r
-        [lctry] [varchar] (250) NOT NULL,\r
-        [locality] [text] NOT NULL,\r
-        [llocality] [varchar] (250) NOT NULL,\r
-        [email] [text] NOT NULL,\r
-        [lemail] [varchar] (250) NOT NULL,\r
-        [orgname] [text] NOT NULL,\r
-        [lorgname] [varchar] (250) NOT NULL,\r
-        [orgunit] [text] NOT NULL,\r
-        [lorgunit] [varchar] (250) NOT NULL,\r
- CONSTRAINT [vcard_search_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [lusername] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE INDEX [vcard_search_lfn] ON [vcard_search] (lfn)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lfamily] ON [vcard_search] (lfamily)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lgiven] ON [vcard_search] (lgiven)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lmiddle] ON [vcard_search] (lmiddle)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lnickname] ON [vcard_search] (lnickname)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lbday] ON [vcard_search] (lbday)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lctry] ON [vcard_search] (lctry)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_llocality] ON [vcard_search] (llocality)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lemail] ON [vcard_search] (lemail)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lorgname] ON [vcard_search] (lorgname)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [vcard_search_lorgunit] ON [vcard_search] (lorgunit)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-ALTER TABLE [dbo].[pubsub_item]  WITH CHECK ADD  CONSTRAINT [pubsub_item_ibfk_1] FOREIGN KEY([nodeid])\r
-REFERENCES [dbo].[pubsub_node] ([nodeid])\r
-ON DELETE CASCADE;\r
-\r
-ALTER TABLE [dbo].[pubsub_item] CHECK CONSTRAINT [pubsub_item_ibfk_1];\r
-\r
-ALTER TABLE [dbo].[pubsub_node_option]  WITH CHECK ADD  CONSTRAINT [pubsub_node_option_ibfk_1] FOREIGN KEY([nodeid])\r
-REFERENCES [dbo].[pubsub_node] ([nodeid])\r
-ON DELETE CASCADE;\r
-\r
-ALTER TABLE [dbo].[pubsub_node_option] CHECK CONSTRAINT [pubsub_node_option_ibfk_1];\r
-\r
-ALTER TABLE [dbo].[pubsub_node_owner]  WITH CHECK ADD  CONSTRAINT [pubsub_node_owner_ibfk_1] FOREIGN KEY([nodeid])\r
-REFERENCES [dbo].[pubsub_node] ([nodeid])\r
-ON DELETE CASCADE;\r
-\r
-ALTER TABLE [dbo].[pubsub_node_owner] CHECK CONSTRAINT [pubsub_node_owner_ibfk_1];\r
-\r
-ALTER TABLE [dbo].[pubsub_state]  WITH CHECK ADD  CONSTRAINT [pubsub_state_ibfk_1] FOREIGN KEY([nodeid])\r
-REFERENCES [dbo].[pubsub_node] ([nodeid])\r
-ON DELETE CASCADE;\r
-\r
-ALTER TABLE [dbo].[pubsub_state] CHECK CONSTRAINT [pubsub_state_ibfk_1];\r
-\r
-CREATE TABLE [dbo].[oauth_token] (\r
-    [token] [varchar] (250) NOT NULL,\r
-    [jid] [text] NOT NULL,\r
-    [scope] [text] NOT NULL,\r
-    [expire] [bigint] NOT NULL,\r
- CONSTRAINT [oauth_token_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [token] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[route] (\r
-    [domain] [varchar] (255) NOT NULL,\r
-    [server_host] [varchar] (255) NOT NULL,\r
-    [node] [varchar] (255) NOT NULL,\r
-    [pid] [varchar](100) NOT NULL,\r
-    [local_hint] [text] NOT NULL\r
-);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [route_i] ON [route] (domain, server_host, node, pid)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [route_domain] ON [route] (domain)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[bosh] (\r
-    [sid] [varchar] (255) NOT NULL,\r
-    [node] [varchar] (255) NOT NULL,\r
-    [pid] [varchar](100) NOT NULL\r
- CONSTRAINT [bosh_PRIMARY] PRIMARY KEY CLUSTERED \r
-(\r
-        [sid] ASC\r
-)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)\r
-) TEXTIMAGE_ON [PRIMARY];\r
-\r
-CREATE TABLE [dbo].[carboncopy] (\r
-    [username] [varchar] (255) NOT NULL,\r
-    [resource] [varchar] (255) NOT NULL,\r
-    [namespace] [varchar] (255) NOT NULL,\r
-    [node] [varchar] (255) NOT NULL\r
-);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [carboncopy_ur] ON [carboncopy] (username, resource)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE INDEX [carboncopy_user] ON [carboncopy] (username)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE TABLE [dbo].[push_session] (\r
-    [username] [varchar] (255) NOT NULL,\r
-    [timestamp] [bigint] NOT NULL,\r
-    [service] [varchar] (255) NOT NULL,\r
-    [node] [varchar] (255) NOT NULL,\r
-    [xml] [varchar] (255) NOT NULL\r
-);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [i_push_usn] ON [push_session] (username, service, node)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
-\r
-CREATE UNIQUE CLUSTERED INDEX [i_push_ut] ON [push_session] (username, timestamp)\r
-WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);\r
diff --git a/sql/mysql.new.sql b/sql/mysql.new.sql
deleted file mode 100644 (file)
index 544135e..0000000
+++ /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 (file)
index 7894fa5..0000000
+++ /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 (file)
index 928d74d..0000000
+++ /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 <HOST> with the host's domain:
-
--- ALTER TABLE users ADD COLUMN server_host text NOT NULL DEFAULT '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- ALTER TABLE muc_room ALTER COLUMN server_host DROP DEFAULT;
-
--- ALTER TABLE muc_registered ADD COLUMN server_host text NOT NULL DEFAULT '<HOST>';
--- ALTER TABLE muc_registered ALTER COLUMN server_host DROP DEFAULT;
-
--- ALTER TABLE muc_online_room ADD COLUMN server_host text NOT NULL DEFAULT '<HOST>';
--- ALTER TABLE muc_online_room ALTER COLUMN server_host DROP DEFAULT;
-
--- ALTER TABLE muc_online_users ADD COLUMN server_host text NOT NULL DEFAULT '<HOST>';
--- ALTER TABLE muc_online_users ALTER COLUMN server_host DROP DEFAULT;
-
--- ALTER TABLE motd ADD COLUMN server_host text NOT NULL DEFAULT '<HOST>';
--- 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 '<HOST>';
--- 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 '<HOST>';
--- 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 (file)
index a0cfe0e..0000000
+++ /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);
index 4d1cf0667090f84a26181a17988852bf048e64f0..d43074462c6305c26e3f414321351c3ecf753daf 100644 (file)
@@ -47,7 +47,8 @@
 %%%----------------------------------------------------------------------
 %%% API
 %%%----------------------------------------------------------------------
-start(_Host) -> ok.
+start(Host) ->
+    ejabberd_sql:load_schema(Host, ejabberd_auth).
 
 stop(_Host) -> ok.
 
index f8daa51bd21a14a471c03b885ded8c01cc37fb1f..a0e14d91d167e9d0b5585aeb35c38ecb73bd89d9 100644 (file)
@@ -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,
index b7017d5281b4a4b51ccd3acf7f2df32c99833696..ea858c2f35dbb463b800fd786b9048c19a3f2a4b 100644 (file)
 %%% 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.
 
index bdc32a27c7239a8991f52256ea951c4e898d8227..b368de44ef366a4b41366fe1fae0be61a95cb150 100644 (file)
@@ -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
index 970dece3fac07dc10ecae0fe128164d25a8516b7..ab79966024ef2a9364fe7c081d6473543673ce36 100644 (file)
@@ -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 (file)
index 0000000..a8eea2b
--- /dev/null
@@ -0,0 +1,386 @@
+%%%-------------------------------------------------------------------
+%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%% Created : 15 July 2018 by Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%%
+%%%
+%%% 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)).
index 874a9f99df4a3dc3c1615055791f8c7ebc1d3f5b..eba81bf19ffbe284da488349028f47ec295b9cbc 100644 (file)
@@ -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 ->
-                              [<<Q/binary, $;>>]
-                      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()].
index 040bcb7b8fd87e275806eee39afd641bfdf85dd9..73d54c8b9e8fddcedcef71daf1cbe65311043b81 100644 (file)
@@ -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 (file)
index 3c036f3..0000000
+++ /dev/null
@@ -1,361 +0,0 @@
-%%%-------------------------------------------------------------------
-%%% File    : mod_admin_update_sql.erl
-%%% Author  : Alexey Shchepin <alexey@process-one.net>
-%%% Purpose : Convert SQL DB to the new format
-%%% Created :  9 Aug 2017 by Alexey Shchepin <alexey@process-one.net>
-%%%
-%%%
-%%% 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(_) -> [].
index c4f1ba86f629328e95f7d5462bc9ecc22e82c1ab..46609a4d0dee5b445dd4b6282b825d71bb083215 100644 (file)
@@ -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() ->
index c32714c87887b65cfd69e561b39ee90df30a023a..e7482d2d7c7b9f6b4eadd92087422efd167e414a 100644 (file)
 %%% 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.
 
index 01da671584cc64557efa94d7f16f0ffc1afe907f..e0641f19d446e5d82e362ac95f718139e298fa35 100644 (file)
@@ -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(
index 46b6ea806bc737f21f6dfed25ba347ae845f96af..eae43ff24fd69c64fdc656aeae0fdb73a251c04f 100644 (file)
 %%% 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),
index e8168f3f2b9bd67ca5dc87989619d980e18499d2..2fa3222eeb3d685b03acf8490abc7f056bb87d97 100644 (file)
@@ -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(
index 37ea8dc6f22387ea0bd551a18c756157bc1f60cf..022e921660e729c9e3d23601e83fd8c2c66868a9 100644 (file)
@@ -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(
index d078b64f152e0e4f97657ecc37974ca74d1249f2..4435c28bcf3a311f228e3cb9ec331e0e561393f6 100644 (file)
 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.
index 0e764c26932a43e75eeae5093669ec54d0031cd8..0c9f9f6335ab0447b5742dfec0ff2c088486d132 100644 (file)
@@ -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,
index 4ee0984a8f64cc16847c8c15cf39c2cf609a2e6b..49331f8ac2b3909aa924583cb0b02e4787552285 100644 (file)
@@ -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
index a0ec03c6a829b0d8516748b1ba0587752f98a0fd..602db6e54c7839c7d3b16cd2e976c79116d5ce12 100644 (file)
@@ -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() ->
index 0f51adb5580e5fa9d553e93f27f157d08cbc89b8..c47db4c11ebc8fa9511bab6b22f42bd024e54e46 100644 (file)
 %%% 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.
 
index 2609beb86bd53f9c499291e3559a231732149a56..829919984f94d588e85f7c543fc8a47adfb86dd7 100644 (file)
@@ -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
index 5879e163a60abdf7458044614a036fe0fc5ac56f..7c46d75aa2b8a55eeb52823ae2caf0fc57627cfc 100644 (file)
@@ -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),
index 85019e21d8ea821068b4e1208d2241ce3f64eca4..6d559316c75dcbbe4c267249a5f11e373806e82f 100644 (file)
@@ -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(
index 00714fca925652e801678d141466ae68fe972191..5cdd149251b44243a060de556644a407e4ea5fdc 100644 (file)
@@ -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(
index 57d2052a0e0176a8487bec3493f8b0d1f24d6d34..8dbba9db108a69a84552b4840862c7e3175ddc0a 100644 (file)
@@ -42,8 +42,8 @@
 %%%===================================================================
 %%% API
 %%%===================================================================
-init(_Host, _Opts) ->
-    ok.
+init(Host, _Opts) ->
+    ejabberd_sql:load_schema(Host, mod_vcard).
 
 stop(_Host) ->
     ok.
index 553eae1e49a241a29c6ae5961a86c25ae6f02810..865e64b839e17048384376a975086e89019dee6b 100644 (file)
@@ -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})
-    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 ->
-                              [<<Q/binary, $;>>]
-                      end
-              end, QueryList);
-        {error, _} = Err ->
-            ct:fail({read_file_failed, File, 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.
 
-split(Data) ->
-    lists:filter(
-      fun(<<>>) ->
-              false;
-         (_) ->
-              true
-      end, re:split(Data, <<"\s">>)).
-
 clear_riak_tables(Config) ->
     User = ?config(user, Config),
     Server = ?config(server, Config),
index 51cb85a5a1e728bc188ffb099946206649923361..c9823de6069fed9f0e08015a6c0b8557bc2a752b 100644 (file)
@@ -489,6 +489,7 @@ listen:
 loglevel: @@loglevel@@
 max_fsm_queue: 1000
 queue_type: file
+new_sql_schema: true
 modules: 
   mod_adhoc: []
   mod_configure: []