Comparison

plugins/mod_storage_sql.lua @ 4109:d26db1f936f8

mod_storage_sql: Create index when creating a new table
author Matthew Wild <mwild1@gmail.com>
date Tue, 11 Jan 2011 04:19:26 +0000
parent 4105:08560575762f
child 4218:8a271b3fcaa7
comparison
equal deleted inserted replaced
4108:e3e3aa286334 4109:d26db1f936f8
62 connection = dbh; 62 connection = dbh;
63 return connection; 63 return connection;
64 end 64 end
65 end 65 end
66 66
67 do -- process options to get a db connection 67 local function create_table()
68 DBI = require "DBI";
69
70 params = params or { driver = "SQLite3" };
71
72 if params.driver == "SQLite3" then
73 params.database = resolve_relative_path(prosody.paths.data or ".", params.database or "prosody.sqlite");
74 end
75
76 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified");
77
78 assert(connect());
79
80 -- Automatically create table, ignore failure (table probably already exists)
81 local create_sql = "CREATE TABLE `prosody` (`host` TEXT, `user` TEXT, `store` TEXT, `key` TEXT, `type` TEXT, `value` TEXT);"; 68 local create_sql = "CREATE TABLE `prosody` (`host` TEXT, `user` TEXT, `store` TEXT, `key` TEXT, `type` TEXT, `value` TEXT);";
82 if params.driver == "PostgreSQL" then 69 if params.driver == "PostgreSQL" then
83 create_sql = create_sql:gsub("`", "\""); 70 create_sql = create_sql:gsub("`", "\"");
84 end 71 end
85 72
87 if stmt then 74 if stmt then
88 local ok = stmt:execute(); 75 local ok = stmt:execute();
89 local commit_ok = connection:commit(); 76 local commit_ok = connection:commit();
90 if ok and commit_ok then 77 if ok and commit_ok then
91 module:log("info", "Initialized new %s database with prosody table", params.driver); 78 module:log("info", "Initialized new %s database with prosody table", params.driver);
92 end 79 local index_sql = "CREATE INDEX `prosody_index` ON `prosody` (`host`, `user`, `store`, `key`)";
93 end 80 if params.driver == "PostgreSQL" then
81 index_sql = index_sql:gsub("`", "\"");
82 elseif params.driver == "MySQL" then
83 index_sql = index_sql:gsub("`([,)])", "`(20)%1");
84 end
85 local stmt, err = connection:prepare(index_sql);
86 local ok, commit_ok, commit_err;
87 if stmt then
88 ok, err = stmt:execute();
89 commit_ok, commit_err = connection:commit();
90 end
91 if not(ok and commit_ok) then
92 module:log("warn", "Failed to create index (%s), lookups may not be optimised", err or commit_err);
93 end
94 end
95 end
96 end
97
98 do -- process options to get a db connection
99 DBI = require "DBI";
100
101 params = params or { driver = "SQLite3" };
102
103 if params.driver == "SQLite3" then
104 params.database = resolve_relative_path(prosody.paths.data or ".", params.database or "prosody.sqlite");
105 end
106
107 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified");
108
109 assert(connect());
110
111 -- Automatically create table, ignore failure (table probably already exists)
112 create_table();
94 end 113 end
95 114
96 local function serialize(value) 115 local function serialize(value)
97 local t = type(value); 116 local t = type(value);
98 if t == "string" or t == "boolean" or t == "number" then 117 if t == "string" or t == "boolean" or t == "number" then