Software / code / prosody
Comparison
util/sql.lua @ 7275:187ba2e9c012
util.sql: Don't break out of result retreival loops
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 13 Mar 2016 18:31:53 +0100 |
| parent | 7272:a23ca90d1984 |
| child | 7276:30dfaf36ea6d |
comparison
equal
deleted
inserted
replaced
| 7274:e0727512bb99 | 7275:187ba2e9c012 |
|---|---|
| 297 end | 297 end |
| 298 function engine:set_encoding() -- to UTF-8 | 298 function engine:set_encoding() -- to UTF-8 |
| 299 local driver = self.params.driver; | 299 local driver = self.params.driver; |
| 300 if driver == "SQLite3" then | 300 if driver == "SQLite3" then |
| 301 return self:transaction(function() | 301 return self:transaction(function() |
| 302 if self:select"PRAGMA encoding;"()[1] == "UTF-8" then | 302 for encoding in self:select"PRAGMA encoding;" do |
| 303 self.charset = "utf8"; | 303 if encoding[1] == "UTF-8" then |
| 304 self.charset = "utf8"; | |
| 305 end | |
| 304 end | 306 end |
| 305 end); | 307 end); |
| 306 end | 308 end |
| 307 local set_names_query = "SET NAMES '%s';" | 309 local set_names_query = "SET NAMES '%s';" |
| 308 local charset = "utf8"; | 310 local charset = "utf8"; |
| 309 if driver == "MySQL" then | 311 if driver == "MySQL" then |
| 310 local ok, charsets = self:transaction(function() | 312 self:transaction(function() |
| 311 return self:select"SELECT `CHARACTER_SET_NAME` FROM `information_schema`.`CHARACTER_SETS` WHERE `CHARACTER_SET_NAME` LIKE 'utf8%' ORDER BY MAXLEN DESC LIMIT 1;"; | 313 for row in self:select"SELECT `CHARACTER_SET_NAME` FROM `information_schema`.`CHARACTER_SETS` WHERE `CHARACTER_SET_NAME` LIKE 'utf8%' ORDER BY MAXLEN DESC LIMIT 1;" do |
| 314 charset = row and row[1] or charset; | |
| 315 end | |
| 312 end); | 316 end); |
| 313 local row = ok and charsets(); | |
| 314 charset = row and row[1] or charset; | |
| 315 set_names_query = set_names_query:gsub(";$", (" COLLATE '%s';"):format(charset.."_bin")); | 317 set_names_query = set_names_query:gsub(";$", (" COLLATE '%s';"):format(charset.."_bin")); |
| 316 end | 318 end |
| 317 self.charset = charset; | 319 self.charset = charset; |
| 318 log("debug", "Using encoding '%s' for database connection", charset); | 320 log("debug", "Using encoding '%s' for database connection", charset); |
| 319 local ok, err = self:transaction(function() return self:execute(set_names_query:format(charset)); end); | 321 local ok, err = self:transaction(function() return self:execute(set_names_query:format(charset)); end); |
| 323 | 325 |
| 324 if driver == "MySQL" then | 326 if driver == "MySQL" then |
| 325 local ok, actual_charset = self:transaction(function () | 327 local ok, actual_charset = self:transaction(function () |
| 326 return self:select"SHOW SESSION VARIABLES LIKE 'character_set_client'"; | 328 return self:select"SHOW SESSION VARIABLES LIKE 'character_set_client'"; |
| 327 end); | 329 end); |
| 330 local charset_ok; | |
| 328 for row in actual_charset do | 331 for row in actual_charset do |
| 329 if row[2] ~= charset then | 332 if row[2] ~= charset then |
| 330 log("error", "MySQL %s is actually %q (expected %q)", row[1], row[2], charset); | 333 log("error", "MySQL %s is actually %q (expected %q)", row[1], row[2], charset); |
| 331 return false, "Failed to set connection encoding"; | 334 charset_ok = false; |
| 332 end | 335 end |
| 336 end | |
| 337 if not charset_ok then | |
| 338 return false, "Failed to set connection encoding"; | |
| 333 end | 339 end |
| 334 end | 340 end |
| 335 | 341 |
| 336 return true; | 342 return true; |
| 337 end | 343 end |