Comparison

plugins/mod_storage_sql2.lua @ 5882:fbba2997aabb

mod_storage_sql2: Move all schema upgrade code to the same place
author Kim Alvefur <zash@zash.se>
date Mon, 28 Oct 2013 21:37:30 +0100
parent 5881:12d12bda4b8c
child 5883:39b187e7e892
comparison
equal deleted inserted replaced
5881:12d12bda4b8c 5882:fbba2997aabb
62 62
63 local success,err = engine:transaction(function() 63 local success,err = engine:transaction(function()
64 engine:execute(create_sql); 64 engine:execute(create_sql);
65 engine:execute(index_sql); 65 engine:execute(index_sql);
66 end); 66 end);
67 if not success then -- so we failed to create 67
68 if params.driver == "MySQL" then
69 success,err = engine:transaction(function()
70 local result = engine:execute("SHOW COLUMNS FROM prosody WHERE Field='value' and Type='text'");
71 if result:rowcount() > 0 then
72 module:log("info", "Upgrading database schema...");
73 engine:execute("ALTER TABLE prosody MODIFY COLUMN `value` MEDIUMTEXT");
74 module:log("info", "Database table automatically upgraded");
75 end
76 return true;
77 end);
78 if not success then
79 module:log("error", "Failed to check/upgrade database schema (%s), please see "
80 .."http://prosody.im/doc/mysql for help",
81 err or "unknown error");
82 end
83 end
84 end
85 local ProsodyArchiveTable = Table { 68 local ProsodyArchiveTable = Table {
86 name="prosodyarchive"; 69 name="prosodyarchive";
87 Column { name="sort_id", type="INTEGER PRIMARY KEY AUTOINCREMENT", nullable=false }; 70 Column { name="sort_id", type="INTEGER PRIMARY KEY AUTOINCREMENT", nullable=false };
88 Column { name="host", type="TEXT", nullable=false }; 71 Column { name="host", type="TEXT", nullable=false };
89 Column { name="user", type="TEXT", nullable=false }; 72 Column { name="user", type="TEXT", nullable=false };
110 module:log("error", "Failed to set database connection encoding to UTF8: %s", err); 93 module:log("error", "Failed to set database connection encoding to UTF8: %s", err);
111 end 94 end
112 end 95 end
113 local function upgrade_table() 96 local function upgrade_table()
114 if params.driver == "MySQL" then 97 if params.driver == "MySQL" then
98 local success,err = engine:transaction(function()
99 local result = engine:execute("SHOW COLUMNS FROM prosody WHERE Field='value' and Type='text'");
100 if result:rowcount() > 0 then
101 module:log("info", "Upgrading database schema...");
102 engine:execute("ALTER TABLE prosody MODIFY COLUMN `value` MEDIUMTEXT");
103 module:log("info", "Database table automatically upgraded");
104 end
105 return true;
106 end);
107 if not success then
108 module:log("error", "Failed to check/upgrade database schema (%s), please see "
109 .."http://prosody.im/doc/mysql for help",
110 err or "unknown error");
111 return false;
112 end
115 -- COMPAT w/pre-0.9: Upgrade tables to UTF-8 if not already 113 -- COMPAT w/pre-0.9: Upgrade tables to UTF-8 if not already
116 local check_encoding_query = "SELECT `COLUMN_NAME`,`COLUMN_TYPE` FROM `information_schema`.`columns` WHERE `TABLE_NAME`='prosody' AND ( `CHARACTER_SET_NAME`!='utf8' OR `COLLATION_NAME`!='utf8_bin' );"; 114 local check_encoding_query = "SELECT `COLUMN_NAME`,`COLUMN_TYPE` FROM `information_schema`.`columns` WHERE `TABLE_NAME`='prosody' AND ( `CHARACTER_SET_NAME`!='utf8' OR `COLLATION_NAME`!='utf8_bin' );";
117 local success,err = engine:transaction(function() 115 success,err = engine:transaction(function()
118 local result = engine:execute(check_encoding_query); 116 local result = engine:execute(check_encoding_query);
119 local n_bad_columns = result:rowcount(); 117 local n_bad_columns = result:rowcount();
120 if n_bad_columns > 0 then 118 if n_bad_columns > 0 then
121 module:log("warn", "Found %d columns in prosody table requiring encoding change, updating now...", n_bad_columns); 119 module:log("warn", "Found %d columns in prosody table requiring encoding change, updating now...", n_bad_columns);
122 local fix_column_query1 = "ALTER TABLE `prosody` CHANGE `%s` `%s` BLOB;"; 120 local fix_column_query1 = "ALTER TABLE `prosody` CHANGE `%s` `%s` BLOB;";
127 engine:execute(fix_column_query2:format(column_name, column_name, column_type)); 125 engine:execute(fix_column_query2:format(column_name, column_name, column_type));
128 end 126 end
129 module:log("info", "Database encoding upgrade complete!"); 127 module:log("info", "Database encoding upgrade complete!");
130 end 128 end
131 end); 129 end);
132 local success,err = engine:transaction(function() return engine:execute(check_encoding_query); end); 130 success,err = engine:transaction(function() return engine:execute(check_encoding_query); end);
133 if not success then 131 if not success then
134 module:log("error", "Failed to check/upgrade database encoding: %s", err or "unknown error"); 132 module:log("error", "Failed to check/upgrade database encoding: %s", err or "unknown error");
135 end 133 end
136 end 134 end
137 end 135 end
146 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified"); 144 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified");
147 145
148 --local dburi = db2uri(params); 146 --local dburi = db2uri(params);
149 engine = mod_sql:create_engine(params); 147 engine = mod_sql:create_engine(params);
150 148
151 -- Encoding mess
152 set_encoding(); 149 set_encoding();
153 upgrade_table();
154 150
155 -- Automatically create table, ignore failure (table probably already exists) 151 -- Automatically create table, ignore failure (table probably already exists)
156 create_table(); 152 create_table();
153 -- Encoding mess
154 upgrade_table();
157 end 155 end
158 156
159 local function serialize(value) 157 local function serialize(value)
160 local t = type(value); 158 local t = type(value);
161 if t == "string" or t == "boolean" or t == "number" then 159 if t == "string" or t == "boolean" or t == "number" then