util.sql: Return failure if set_encoding() fails
[prosody.git] / util / sql.lua
index 5aa12f94f9a8d55e8e1b8690d3ca49369bb8d391..d0da930279fcf7ef1a17029d12c373100a98d0b6 100644 (file)
@@ -110,9 +110,19 @@ function engine:connect()
        dbh:autocommit(false); -- don't commit automatically
        self.conn = dbh;
        self.prepared = {};
-       self:set_encoding();
+       local ok, err = self:set_encoding();
+       if not ok then
+               return ok, err;
+       end
+       local ok, err = self:onconnect();
+       if ok == false then
+               return ok, err;
+       end
        return true;
 end
+function engine:onconnect()
+       -- Override from create_engine()
+end
 function engine:execute(sql, ...)
        local success, err = self:connect();
        if not success then return success, err; end
@@ -238,7 +248,7 @@ function engine:_create_table(table)
        if self.params.driver == "PostgreSQL" then
                sql = sql:gsub("`", "\"");
        elseif self.params.driver == "MySQL" then
-               sql = sql:gsub(";$", " CHARACTER SET 'utf8' COLLATE 'utf8_bin';");
+               sql = sql:gsub(";$", (" CHARACTER SET '%s' COLLATE '%s_bin';"):format(self.charset, self.charset));
        end
        local success,err = self:execute(sql);
        if not success then return success,err; end
@@ -261,12 +271,12 @@ function engine:set_encoding() -- to UTF-8
        local set_names_query = "SET NAMES '%s';"
        local charset = "utf8";
        if driver == "MySQL" then
-               set_names_query = set_names_query:gsub(";$", " COLLATE 'utf8_bin';");
                local ok, charsets = self:transaction(function()
                        return self:select"SELECT `CHARACTER_SET_NAME` FROM `information_schema`.`CHARACTER_SETS` WHERE `CHARACTER_SET_NAME` LIKE 'utf8%' ORDER BY MAXLEN DESC LIMIT 1;";
                end);
                local row = ok and charsets();
                charset = row and row[1] or charset;
+               set_names_query = set_names_query:gsub(";$", (" COLLATE '%s';"):format(charset.."_bin"));
        end
        self.charset = charset;
        return self:transaction(function() return self:execute(set_names_query:format(charset)); end);