Skip to content
Permalink
Browse files

Ignore "mix of collations" error on invite SELECT

This adds the `isIgnorableError` method and calls it when error checking
in `GetUserInvite()`, returning "not found" if the rror comes up.
  • Loading branch information
thebaer committed Jan 30, 2020
1 parent d6b7a59 commit 51700cc7da47ad205187435ff8beaec2535b926f
Showing with 28 additions and 3 deletions.
  1. +13 −1 database-no-sqlite.go
  2. +12 −0 database-sqlite.go
  3. +3 −2 database.go
@@ -1,7 +1,7 @@
// +build !sqlite,!wflib

/*
* Copyright © 2019 A Bunch Tell LLC.
* Copyright © 2019-2020 A Bunch Tell LLC.
*
* This file is part of WriteFreely.
*
@@ -28,3 +28,15 @@ func (db *datastore) isDuplicateKeyErr(err error) bool {

return false
}

func (db *datastore) isIgnorableError(err error) bool {
if db.driverName == driverMySQL {
if mysqlErr, ok := err.(*mysql.MySQLError); ok {
return mysqlErr.Number == mySQLErrCollationMix
}
} else {
log.Error("isIgnorableError: failed check for unrecognized driver '%s'", db.driverName)
}

return false
}
@@ -48,3 +48,15 @@ func (db *datastore) isDuplicateKeyErr(err error) bool {

return false
}

func (db *datastore) isIgnorableError(err error) bool {
if db.driverName == driverMySQL {
if mysqlErr, ok := err.(*mysql.MySQLError); ok {
return mysqlErr.Number == mySQLErrCollationMix
}
} else {
log.Error("isIgnorableError: failed check for unrecognized driver '%s'", db.driverName)
}

return false
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2018 A Bunch Tell LLC.
* Copyright © 2018-2020 A Bunch Tell LLC.
*
* This file is part of WriteFreely.
*
@@ -37,6 +37,7 @@ import (

const (
mySQLErrDuplicateKey = 1062
mySQLErrCollationMix = 1267

driverMySQL = "mysql"
driverSQLite = "sqlite3"
@@ -2281,7 +2282,7 @@ func (db *datastore) GetUserInvite(id string) (*Invite, error) {
var i Invite
err := db.QueryRow("SELECT id, max_uses, created, expires, inactive FROM userinvites WHERE id = ?", id).Scan(&i.ID, &i.MaxUses, &i.Created, &i.Expires, &i.Inactive)
switch {
case err == sql.ErrNoRows:
case err == sql.ErrNoRows, db.isIgnorableError(err):
return nil, impart.HTTPError{http.StatusNotFound, "Invite doesn't exist."}
case err != nil:
log.Error("Failed selecting invite: %v", err)

0 comments on commit 51700cc

Please sign in to comment.
You can’t perform that action at this time.