mirror of
https://github.com/Eggbertx/gochan.git
synced 2025-08-02 10:56:25 -07:00
Remove SQLite support due to instability
This commit is contained in:
parent
31f9c57a35
commit
a69b6748c7
16 changed files with 22 additions and 97 deletions
|
@ -6,5 +6,4 @@ Split tripcode from username during migration
|
||||||
|
|
||||||
Mysql: SERIAL = uint64 NOT NULL AUTO_INCREMENT UNIQUE
|
Mysql: SERIAL = uint64 NOT NULL AUTO_INCREMENT UNIQUE
|
||||||
Postgres SERIAL = int32 NOT NULL AUTO_INCREMENT UNIQUE
|
Postgres SERIAL = int32 NOT NULL AUTO_INCREMENT UNIQUE
|
||||||
sqlite INTEGER = variable INTEGER
|
|
||||||
|
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -69,7 +69,6 @@ dependencies:
|
||||||
github.com/aquilax/tripcode \
|
github.com/aquilax/tripcode \
|
||||||
golang.org/x/crypto/bcrypt \
|
golang.org/x/crypto/bcrypt \
|
||||||
github.com/frustra/bbcode \
|
github.com/frustra/bbcode \
|
||||||
github.com/mattn/go-sqlite3 \
|
|
||||||
github.com/tdewolff/minify \
|
github.com/tdewolff/minify \
|
||||||
github.com/mojocn/base64Captcha
|
github.com/mojocn/base64Captcha
|
||||||
|
|
||||||
|
@ -88,7 +87,7 @@ install:
|
||||||
$(info cp sample-configs/gochan.example.json /etc/gochan/gochan.json)
|
$(info cp sample-configs/gochan.example.json /etc/gochan/gochan.json)
|
||||||
ifeq (${GCOS_NAME},linux)
|
ifeq (${GCOS_NAME},linux)
|
||||||
$(info If your distro has systemd, you will also need to run the following commands)
|
$(info If your distro has systemd, you will also need to run the following commands)
|
||||||
$(info cp sample-configs/gochan-[mysql|postgresql|sqlite3].service /lib/systemd/system/gochan.service)
|
$(info cp sample-configs/gochan-[mysql|postgresql].service /lib/systemd/system/gochan.service)
|
||||||
$(info systemctl daemon-reload)
|
$(info systemctl daemon-reload)
|
||||||
$(info systemctl enable gochan.service)
|
$(info systemctl enable gochan.service)
|
||||||
$(info systemctl start gochan.service)
|
$(info systemctl start gochan.service)
|
||||||
|
@ -140,7 +139,6 @@ else ifeq (${GCOS_NAME},windows)
|
||||||
else
|
else
|
||||||
cp sample-configs/gochan-mysql.service ${RELEASE_DIR}/sample-configs/
|
cp sample-configs/gochan-mysql.service ${RELEASE_DIR}/sample-configs/
|
||||||
cp sample-configs/gochan-postgresql.service ${RELEASE_DIR}/sample-configs/
|
cp sample-configs/gochan-postgresql.service ${RELEASE_DIR}/sample-configs/
|
||||||
cp sample-configs/gochan-sqlite3.service ${RELEASE_DIR}/sample-configs/
|
|
||||||
tar -C releases -zcvf ${RELEASE_DIR}.tar.gz ${RELEASE_NAME}
|
tar -C releases -zcvf ${RELEASE_DIR}.tar.gz ${RELEASE_NAME}
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,9 @@ Demo installation: https://gochan.org
|
||||||
5. Go to http://[gochan url]/manage?action=staff, log in (default username/password is admin/password), and create a new admin user (and any other staff users as necessary). Then delete the admin user for security.
|
5. Go to http://[gochan url]/manage?action=staff, log in (default username/password is admin/password), and create a new admin user (and any other staff users as necessary). Then delete the admin user for security.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
1. Make sure to set `DBtype`, `DBhost`, `DBname`, `DBusername`, and `DBpassword`, since these are required to connect to your SQL database. Valid `DBtype` values are "mysql", "postgres", and "sqlite3".
|
1. Make sure to set `DBtype`, `DBhost`, `DBname`, `DBusername`, and `DBpassword`, since these are required to connect to your SQL database. Valid `DBtype` values are "mysql" and "postgres" (sqlite3 is no longer supported for stability reasons).
|
||||||
1. To connect to a MySQL database, set `DBhost` to "tcp(ip:3306)" or a different port, if necessary.
|
1. To connect to a MySQL database, set `DBhost` to "tcp(ip:3306)" or a different port, if necessary.
|
||||||
2. To connect to a PostgreSQL database, set `DBhost` to the IP address or hostname. Using a UNIX socket may work as well, but it is currently untested.
|
2. To connect to a PostgreSQL database, set `DBhost` to the IP address or hostname. Using a UNIX socket may work as well, but it is currently untested.
|
||||||
3. To connect to a SQLite database, set `DBhost` to the path of the database file. It will be created if it does not already exist.
|
|
||||||
2. Set `DomainRegex`,`SiteDomain`, since these are necessary in order to post and log in as a staff member.
|
2. Set `DomainRegex`,`SiteDomain`, since these are necessary in order to post and log in as a staff member.
|
||||||
3. If you want to see debugging info/noncritical warnings, set verbosity to 1.
|
3. If you want to see debugging info/noncritical warnings, set verbosity to 1.
|
||||||
|
|
||||||
|
@ -29,7 +28,7 @@ See [`docker/README.md`](docker/README.md)
|
||||||
|
|
||||||
## For developers (using Vagrant)
|
## For developers (using Vagrant)
|
||||||
1. Install Vagrant and Virtualbox. Vagrant lets you create a virtual machine and run a custom setup/installation script to make installation easier and faster.
|
1. Install Vagrant and Virtualbox. Vagrant lets you create a virtual machine and run a custom setup/installation script to make installation easier and faster.
|
||||||
2. From the command line, cd into vagrant/ and run `vagrant up`. By default, MySQL/MariaDB is used, but if you want to test with a different SQL type, run `GC_DBTYPE=dbtype vagrant up`, replacing "dbtype" with either mysql, postgresql, or sqlite3.
|
2. From the command line, cd into vagrant/ and run `vagrant up`. By default, MySQL/MariaDB is used, but if you want to test with a different SQL type, run `GC_DBTYPE=dbtype vagrant up`, replacing "dbtype" with either mysql or postgresql
|
||||||
3. After it finishes installing the Ubuntu VM, follow the printed instructions.
|
3. After it finishes installing the Ubuntu VM, follow the printed instructions.
|
||||||
|
|
||||||
# Theme development
|
# Theme development
|
||||||
|
|
|
@ -65,7 +65,6 @@ function dependencies {
|
||||||
github.com/aquilax/tripcode `
|
github.com/aquilax/tripcode `
|
||||||
golang.org/x/crypto/bcrypt `
|
golang.org/x/crypto/bcrypt `
|
||||||
github.com/frustra/bbcode `
|
github.com/frustra/bbcode `
|
||||||
github.com/mattn/go-sqlite3 `
|
|
||||||
github.com/tdewolff/minify `
|
github.com/tdewolff/minify `
|
||||||
github.com/mojocn/base64Captcha
|
github.com/mojocn/base64Captcha
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ import (
|
||||||
|
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
_ "github.com/lib/pq"
|
_ "github.com/lib/pq"
|
||||||
_ "github.com/mattn/go-sqlite3"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -3,7 +3,6 @@ FROM golang:1.13.9-alpine3.11
|
||||||
RUN apk --no-cache add \
|
RUN apk --no-cache add \
|
||||||
postgresql-client \
|
postgresql-client \
|
||||||
mariadb-client \
|
mariadb-client \
|
||||||
sqlite \
|
|
||||||
nginx \
|
nginx \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
make \
|
make \
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
if [ -z "$DBTYPE" ]; then
|
if [ -z "$DBTYPE" ]; then
|
||||||
echo "DBTYPE environment variable not set, must be 'mysql', 'postgresql', or 'sqlite3'"
|
echo "DBTYPE environment variable not set, must be 'mysql' or 'postgresql' (sqlite3 no longer supported)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -88,10 +88,6 @@ if [ "$DBTYPE" = "postgresql" ]; then
|
||||||
sed -i /etc/gochan/gochan.json \
|
sed -i /etc/gochan/gochan.json \
|
||||||
-e 's/"DBtype": ".*"/"DBtype": "postgres"/' \
|
-e 's/"DBtype": ".*"/"DBtype": "postgres"/' \
|
||||||
-e 's/"DBhost": ".*"/"DBhost": "127.0.0.1"/'
|
-e 's/"DBhost": ".*"/"DBhost": "127.0.0.1"/'
|
||||||
elif [ "$DBTYPE" = "sqlite3" ]; then
|
|
||||||
sed -i /etc/gochan/gochan.json \
|
|
||||||
-e 's/"DBtype": ".*"/"DBtype": "sqlite3"/' \
|
|
||||||
-e 's/"DBhost": ".*"/"DBhost": "/usr/local/share/gochan/gochan.db"/'
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -8,7 +8,6 @@ require (
|
||||||
github.com/frustra/bbcode v0.0.0-20180807171629-48be21ce690c
|
github.com/frustra/bbcode v0.0.0-20180807171629-48be21ce690c
|
||||||
github.com/go-sql-driver/mysql v1.5.0
|
github.com/go-sql-driver/mysql v1.5.0
|
||||||
github.com/lib/pq v1.5.2
|
github.com/lib/pq v1.5.2
|
||||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible
|
|
||||||
github.com/mojocn/base64Captcha v1.3.1
|
github.com/mojocn/base64Captcha v1.3.1
|
||||||
github.com/nranchev/go-libGeoIP v0.0.0-20170629073846-d6d4a9a4c7e8 // indirect
|
github.com/nranchev/go-libGeoIP v0.0.0-20170629073846-d6d4a9a4c7e8 // indirect
|
||||||
github.com/tdewolff/minify v2.3.6+incompatible
|
github.com/tdewolff/minify v2.3.6+incompatible
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -12,8 +12,6 @@ github.com/lib/pq v1.4.0 h1:TmtCFbH+Aw0AixwyttznSMQDgbR5Yed/Gg6S8Funrhc=
|
||||||
github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/lib/pq v1.5.2 h1:yTSXVswvWUOQ3k1sd7vJfDrbSl8lKuscqFJRqjC0ifw=
|
github.com/lib/pq v1.5.2 h1:yTSXVswvWUOQ3k1sd7vJfDrbSl8lKuscqFJRqjC0ifw=
|
||||||
github.com/lib/pq v1.5.2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.5.2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
|
|
||||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
|
||||||
github.com/mojocn/base64Captcha v1.2.2 h1:NTFnThPVrb3tR66JO/N8/ZHsyFrNc7ho+xRpxBUEIlo=
|
github.com/mojocn/base64Captcha v1.2.2 h1:NTFnThPVrb3tR66JO/N8/ZHsyFrNc7ho+xRpxBUEIlo=
|
||||||
github.com/mojocn/base64Captcha v1.2.2/go.mod h1:wAQCKEc5bDujxKRmbT6/vTnTt5CjStQ8bRfPWUuz/iY=
|
github.com/mojocn/base64Captcha v1.2.2/go.mod h1:wAQCKEc5bDujxKRmbT6/vTnTt5CjStQ8bRfPWUuz/iY=
|
||||||
github.com/mojocn/base64Captcha v1.3.1 h1:2Wbkt8Oc8qjmNJ5GyOfSo4tgVQPsbKMftqASnq8GlT0=
|
github.com/mojocn/base64Captcha v1.3.1 h1:2Wbkt8Oc8qjmNJ5GyOfSo4tgVQPsbKMftqASnq8GlT0=
|
||||||
|
|
|
@ -190,7 +190,7 @@ func InitConfig(versionStr string) {
|
||||||
"TemplateDir not set in gochan.json or unable to locate template directory, halting.")
|
"TemplateDir not set in gochan.json or unable to locate template directory, halting.")
|
||||||
|
|
||||||
Config.checkString(Config.DBtype, "", true,
|
Config.checkString(Config.DBtype, "", true,
|
||||||
"DBtype not set in gochan.json, halting (currently supported values: mysql,postgresql,sqlite3)")
|
"DBtype not set in gochan.json, halting (currently supported values: mysql,postgresql)")
|
||||||
Config.checkString(Config.DBhost, "", true,
|
Config.checkString(Config.DBhost, "", true,
|
||||||
"DBhost not set in gochan.json, halting.")
|
"DBhost not set in gochan.json, halting.")
|
||||||
Config.DBname = Config.checkString(Config.DBname, "gochan", false,
|
Config.DBname = Config.checkString(Config.DBname, "gochan", false,
|
||||||
|
|
|
@ -39,14 +39,9 @@ func ConnectToDB(host string, dbType string, dbName string, username string, pas
|
||||||
connStr = fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=disable",
|
connStr = fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=disable",
|
||||||
username, password, host, dbName)
|
username, password, host, dbName)
|
||||||
nilTimestamp = "0001-01-01 00:00:00"
|
nilTimestamp = "0001-01-01 00:00:00"
|
||||||
case "sqlite3":
|
|
||||||
gclog.Print(gclog.LStdLog, "sqlite3 support is still flaky, consider using mysql or postgres")
|
|
||||||
connStr = fmt.Sprintf("file:%s?mode=rwc&_auth&_auth_user=%s&_auth_pass=%s&cache=shared",
|
|
||||||
host, username, password)
|
|
||||||
nilTimestamp = "0001-01-01 00:00:00+00:00"
|
|
||||||
default:
|
default:
|
||||||
gclog.Printf(FatalSQLFlags,
|
gclog.Printf(FatalSQLFlags,
|
||||||
`Invalid DBtype %q in gochan.json, valid values are "mysql", "postgres", and "sqlite3"`, dbType)
|
`Invalid DBtype %q in gochan.json, valid values are "mysql" and "postgres" (sqlite3 is no longer supported for stability reasons)`, dbType)
|
||||||
}
|
}
|
||||||
dbDriver = dbType
|
dbDriver = dbType
|
||||||
var err error
|
var err error
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
var (
|
var (
|
||||||
ErrMultipleDBVersions = errors.New("More than one version in database")
|
ErrMultipleDBVersions = errors.New("More than one version in database")
|
||||||
ErrNilBoard = errors.New("Board is nil")
|
ErrNilBoard = errors.New("Board is nil")
|
||||||
|
ErrUnsupportedDB = errors.New("Unsupported DBtype")
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetAllNondeletedMessageRaw gets all the raw message texts from the database, saved per id
|
// GetAllNondeletedMessageRaw gets all the raw message texts from the database, saved per id
|
||||||
|
@ -597,7 +598,7 @@ func InsertPost(post *Post, bump bool) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Retrieves next free ID, explicitly inserts it, keeps retrying until succesfull insert or until a non-pk error is encountered.
|
//Retrieves next free ID, explicitly inserts it, keeps retrying until succesfull insert or until a non-pk error is encountered.
|
||||||
//This is done because mysql/sqlite doesnt support RETURNING and both LAST_INSERT_ID() and last_row_id() are not thread-safe
|
//This is done because mysql doesnt support RETURNING and both LAST_INSERT_ID() and last_row_id() are not thread-safe
|
||||||
isPrimaryKeyError := true
|
isPrimaryKeyError := true
|
||||||
for isPrimaryKeyError {
|
for isPrimaryKeyError {
|
||||||
nextFreeID, err := getNextFreeID("DBPREFIXposts")
|
nextFreeID, err := getNextFreeID("DBPREFIXposts")
|
||||||
|
@ -630,7 +631,7 @@ func InsertPost(post *Post, bump bool) error {
|
||||||
func createThread(boardID int, locked bool, stickied bool, anchored bool, cyclical bool) (threadID int, err error) {
|
func createThread(boardID int, locked bool, stickied bool, anchored bool, cyclical bool) (threadID int, err error) {
|
||||||
const sql = `INSERT INTO DBPREFIXthreads (board_id, locked, stickied, anchored, cyclical) VALUES (?,?,?,?,?)`
|
const sql = `INSERT INTO DBPREFIXthreads (board_id, locked, stickied, anchored, cyclical) VALUES (?,?,?,?,?)`
|
||||||
//Retrieves next free ID, explicitly inserts it, keeps retrying until succesfull insert or until a non-pk error is encountered.
|
//Retrieves next free ID, explicitly inserts it, keeps retrying until succesfull insert or until a non-pk error is encountered.
|
||||||
//This is done because mysql/sqlite doesnt support RETURNING and both LAST_INSERT_ID() and last_row_id() are not thread-safe
|
//This is done because mysql doesnt support RETURNING and both LAST_INSERT_ID() and last_row_id() are not thread-safe
|
||||||
isPrimaryKeyError := true
|
isPrimaryKeyError := true
|
||||||
for isPrimaryKeyError {
|
for isPrimaryKeyError {
|
||||||
threadID, err = getNextFreeID("DBPREFIXthreads")
|
threadID, err = getNextFreeID("DBPREFIXthreads")
|
||||||
|
@ -992,25 +993,12 @@ func getNextFreeID(tableName string) (ID int, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func doesTableExist(tableName string) (bool, error) {
|
func doesTableExist(tableName string) (bool, error) {
|
||||||
const mysqlPostgresql = `SELECT COUNT(*)
|
const existQuery = `SELECT COUNT(*)
|
||||||
FROM INFORMATION_SCHEMA.TABLES
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
WHERE TABLE_NAME = ?`
|
WHERE TABLE_NAME = ?`
|
||||||
const sqlite = `SELECT
|
|
||||||
COUNT(name)
|
|
||||||
FROM
|
|
||||||
sqlite_master
|
|
||||||
WHERE
|
|
||||||
type ='table' AND
|
|
||||||
name NOT LIKE 'sqlite_%' AND name = ?;`
|
|
||||||
var sql string
|
|
||||||
switch config.Config.DBtype {
|
|
||||||
case "mysql":
|
|
||||||
sql = mysqlPostgresql
|
|
||||||
case "postgres":
|
|
||||||
sql = mysqlPostgresql
|
|
||||||
}
|
|
||||||
var count int
|
var count int
|
||||||
err := QueryRowSQL(sql, []interface{}{config.Config.DBprefix + tableName}, []interface{}{&count})
|
err := QueryRowSQL(existQuery, []interface{}{config.Config.DBprefix + tableName}, []interface{}{&count})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
@ -1023,27 +1011,12 @@ func doesGochanPrefixTableExist() (bool, error) {
|
||||||
if config.Config.DBprefix == "" {
|
if config.Config.DBprefix == "" {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
var mysqlPostgresql = `SELECT count(*)
|
var prefixTableExist = `SELECT count(*)
|
||||||
FROM INFORMATION_SCHEMA.TABLES
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
WHERE TABLE_NAME LIKE '` + config.Config.DBprefix + `%'`
|
WHERE TABLE_NAME LIKE 'DBPREFIX%'`
|
||||||
var sqlite = `SELECT
|
|
||||||
COUNT(name)
|
|
||||||
FROM
|
|
||||||
sqlite_master
|
|
||||||
WHERE
|
|
||||||
type ='table' AND
|
|
||||||
name LIKE '` + config.Config.DBprefix + `%';`
|
|
||||||
var sql string
|
|
||||||
switch config.Config.DBtype {
|
|
||||||
case "mysql":
|
|
||||||
sql = mysqlPostgresql
|
|
||||||
case "postgres":
|
|
||||||
sql = mysqlPostgresql
|
|
||||||
case "sqlite3":
|
|
||||||
sql = sqlite
|
|
||||||
}
|
|
||||||
var count int
|
var count int
|
||||||
err := QueryRowSQL(sql, []interface{}{}, []interface{}{&count})
|
err := QueryRowSQL(prefixTableExist, []interface{}{}, []interface{}{&count})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,13 +7,12 @@ import (
|
||||||
|
|
||||||
"github.com/gochan-org/gochan/pkg/config"
|
"github.com/gochan-org/gochan/pkg/config"
|
||||||
"github.com/gochan-org/gochan/pkg/gclog"
|
"github.com/gochan-org/gochan/pkg/gclog"
|
||||||
"github.com/gochan-org/gochan/pkg/gcutil"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MySQLDatetimeFormat = "2006-01-02 15:04:05"
|
MySQLDatetimeFormat = "2006-01-02 15:04:05"
|
||||||
unsupportedSQLVersionMsg = `Received syntax error while preparing a SQL string.
|
unsupportedSQLVersionMsg = `Received syntax error while preparing a SQL string.
|
||||||
This means that either there is a bug in gochan's code (hopefully not) or that you are using an unsupported My/Postgre/SQLite version.
|
This means that either there is a bug in gochan's code (hopefully not) or that you are using an unsupported My/Postgre version.
|
||||||
Before reporting an error, make sure that you are using the up to date version of your selected SQL server.
|
Before reporting an error, make sure that you are using the up to date version of your selected SQL server.
|
||||||
Error text: %s`
|
Error text: %s`
|
||||||
)
|
)
|
||||||
|
@ -32,10 +31,6 @@ func sqlVersionErr(err error, query *string) error {
|
||||||
if !strings.Contains(errText, "syntax error at or near") {
|
if !strings.Contains(errText, "syntax error at or near") {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case "sqlite3":
|
|
||||||
if !strings.Contains(errText, "Error: near ") {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if config.Config.DebugMode {
|
if config.Config.DebugMode {
|
||||||
return fmt.Errorf(unsupportedSQLVersionMsg+"\nQuery: "+*query, errText)
|
return fmt.Errorf(unsupportedSQLVersionMsg+"\nQuery: "+*query, errText)
|
||||||
|
@ -49,8 +44,6 @@ func PrepareSQL(query string) (*sql.Stmt, error) {
|
||||||
switch dbDriver {
|
switch dbDriver {
|
||||||
case "mysql":
|
case "mysql":
|
||||||
fallthrough
|
fallthrough
|
||||||
case "sqlite3":
|
|
||||||
preparedStr = query
|
|
||||||
case "postgres":
|
case "postgres":
|
||||||
arr := strings.Split(query, "?")
|
arr := strings.Split(query, "?")
|
||||||
for i := range arr {
|
for i := range arr {
|
||||||
|
@ -60,6 +53,8 @@ func PrepareSQL(query string) (*sql.Stmt, error) {
|
||||||
arr[i] += fmt.Sprintf("$%d", i+1)
|
arr[i] += fmt.Sprintf("$%d", i+1)
|
||||||
}
|
}
|
||||||
preparedStr = strings.Join(arr, "")
|
preparedStr = strings.Join(arr, "")
|
||||||
|
default:
|
||||||
|
return nil, ErrUnsupportedDB
|
||||||
}
|
}
|
||||||
stmt, err := db.Prepare(sqlReplacer.Replace(preparedStr))
|
stmt, err := db.Prepare(sqlReplacer.Replace(preparedStr))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -168,11 +163,6 @@ func errFilterDuplicatePrimaryKey(err error) (isPKerror bool, nonPKerror error)
|
||||||
if !strings.Contains(err.Error(), "duplicate key value violates unique constraint") {
|
if !strings.Contains(err.Error(), "duplicate key value violates unique constraint") {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
case "sqlite3":
|
|
||||||
return false, gcutil.ErrNotImplemented
|
|
||||||
// if !strings.Contains(err.Error(), "Error: near ") {//TODO fill in correct error string
|
|
||||||
// return false, err
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
[Unit]
|
|
||||||
Description=gochan Daemon
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
ExecStart=/usr/local/bin/gochan
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
4
vagrant/Vagrantfile
vendored
4
vagrant/Vagrantfile
vendored
|
@ -2,8 +2,8 @@
|
||||||
# vi: set ft=ruby :
|
# vi: set ft=ruby :
|
||||||
|
|
||||||
DBTYPE = ENV.fetch("GC_DBTYPE", "mysql")
|
DBTYPE = ENV.fetch("GC_DBTYPE", "mysql")
|
||||||
if DBTYPE != "mysql" && DBTYPE != "postgresql" && DBTYPE != "sqlite3"
|
if DBTYPE != "mysql" && DBTYPE != "postgresql"
|
||||||
puts "Invalid GC_DBTYPE environment variable, must be mysql, postgresql, or sqlite3, got #{DBTYPE}"
|
puts "Invalid GC_DBTYPE environment variable, must be mysql or postgresql, got #{DBTYPE}"
|
||||||
abort
|
abort
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ set -euo pipefail
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
if [ -z "$DBTYPE" ]; then
|
if [ -z "$DBTYPE" ]; then
|
||||||
echo "DBTYPE environment variable not set, must be 'mysql', 'postgresql', or 'sqlite3'"
|
echo "DBTYPE environment variable not set, must be 'mysql' or 'postgresql' (sqlite3 no longer supported)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -52,9 +52,6 @@ elif [ "$DBTYPE" == "postgresql" ]; then
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable gochan.service
|
systemctl enable gochan.service
|
||||||
fi
|
fi
|
||||||
elif [ "$DBTYPE" == "sqlite3" ]; then
|
|
||||||
# using SQLite (mostly stable)
|
|
||||||
apt-get -y install sqlite3
|
|
||||||
elif [ "$DBTYPE" == "mssql" ]; then
|
elif [ "$DBTYPE" == "mssql" ]; then
|
||||||
# using Microsoft SQL Server (currently unsupported)
|
# using Microsoft SQL Server (currently unsupported)
|
||||||
echo "Microsoft SQL Server not supported yet";
|
echo "Microsoft SQL Server not supported yet";
|
||||||
|
@ -99,10 +96,6 @@ if [ "$DBTYPE" = "postgresql" ]; then
|
||||||
sed -i /etc/gochan/gochan.json \
|
sed -i /etc/gochan/gochan.json \
|
||||||
-e 's/"DBtype": ".*"/"DBtype": "postgres"/' \
|
-e 's/"DBtype": ".*"/"DBtype": "postgres"/' \
|
||||||
-e 's/"DBhost": ".*"/"DBhost": "127.0.0.1"/'
|
-e 's/"DBhost": ".*"/"DBhost": "127.0.0.1"/'
|
||||||
elif [ "$DBTYPE" = "sqlite3" ]; then
|
|
||||||
sed -i /etc/gochan/gochan.json \
|
|
||||||
-e 's/"DBtype": ".*"/"DBtype": "sqlite3"/' \
|
|
||||||
-e 's/"DBhost": ".*"/"DBhost": "gochan.db"/'
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# a convenient script for connecting to the db, whichever type we're using
|
# a convenient script for connecting to the db, whichever type we're using
|
||||||
|
@ -113,8 +106,6 @@ if [ "$DBTYPE" = "mysql" ] || [ -z "$DBTYPE" ]; then
|
||||||
mysql -stu gochan -D gochan -pgochan
|
mysql -stu gochan -D gochan -pgochan
|
||||||
elif [ "$DBTYPE" = "postgresql" ]; then
|
elif [ "$DBTYPE" = "postgresql" ]; then
|
||||||
psql -U gochan -h 127.0.0.1 gochan
|
psql -U gochan -h 127.0.0.1 gochan
|
||||||
elif [ "$DBTYPE" = "sqlite3" ]; then
|
|
||||||
sqlite3 ~/gochan/gochan.db
|
|
||||||
else
|
else
|
||||||
echo "DB type '$DBTYPE' not supported"
|
echo "DB type '$DBTYPE' not supported"
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue