Skip to content

Commit cf0dbf6

Browse files
committed
refactor(drivers): Modify the concatenation method of SQL statements
- Use + to concatenate SQL statements instead of fmt.Sprintf Signed-off-by: happy game <[email protected]>
1 parent 8e3dbbe commit cf0dbf6

File tree

4 files changed

+81
-75
lines changed

4 files changed

+81
-75
lines changed

pkg/drivers/generic/generic.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func (d *Generic) Migrate(ctx context.Context) {
9797
var (
9898
count = 0
9999
countKV = d.queryRow(ctx, "SELECT COUNT(*) FROM key_value")
100-
countKine = d.queryRow(ctx, fmt.Sprintf("SELECT COUNT(*) FROM %s", quotedTableName))
100+
countKine = d.queryRow(ctx, "SELECT COUNT(*) FROM "+quotedTableName)
101101
)
102102

103103
if err := countKV.Scan(&count); err != nil || count == 0 {
@@ -110,10 +110,10 @@ func (d *Generic) Migrate(ctx context.Context) {
110110

111111
logrus.Infof("Migrating content from old table")
112112
_, err := d.execute(ctx,
113-
fmt.Sprintf(`INSERT INTO %s(deleted, create_revision, prev_revision, name, value, created, lease)
113+
`INSERT INTO `+quotedTableName+`(deleted, create_revision, prev_revision, name, value, created, lease)
114114
SELECT 0, 0, 0, kv.name, kv.value, 1, CASE WHEN kv.ttl > 0 THEN 15 ELSE 0 END
115115
FROM key_value kv
116-
WHERE kv.id IN (SELECT MAX(kvd.id) FROM key_value kvd GROUP BY kvd.name)`, quotedTableName))
116+
WHERE kv.id IN (SELECT MAX(kvd.id) FROM key_value kvd GROUP BY kvd.name)`)
117117
if err != nil {
118118
logrus.Errorf("Migration failed: %v", err)
119119
}

pkg/drivers/mysql/mysql.go

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@ const (
2424
defaultHostDSN = "root@tcp(127.0.0.1)/"
2525
)
2626

27+
var createDB = "CREATE DATABASE IF NOT EXISTS `%s`;"
28+
2729
func getSchema(tableName string) []string {
30+
quotedTableName := "`" + tableName + "`"
2831
return []string{
29-
fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s
32+
`CREATE TABLE IF NOT EXISTS ` + quotedTableName + `
3033
(
3134
id BIGINT UNSIGNED AUTO_INCREMENT,
3235
name VARCHAR(630) CHARACTER SET ascii,
@@ -38,26 +41,25 @@ func getSchema(tableName string) []string {
3841
value MEDIUMBLOB,
3942
old_value MEDIUMBLOB,
4043
PRIMARY KEY (id)
41-
);`, tableName),
42-
fmt.Sprintf(`CREATE INDEX %s_name_index ON %s (name)`, tableName, tableName),
43-
fmt.Sprintf(`CREATE INDEX %s_name_id_index ON %s (name,id)`, tableName, tableName),
44-
fmt.Sprintf(`CREATE INDEX %s_id_deleted_index ON %s (id,deleted)`, tableName, tableName),
45-
fmt.Sprintf(`CREATE INDEX %s_prev_revision_index ON %s (prev_revision)`, tableName, tableName),
46-
fmt.Sprintf(`CREATE UNIQUE INDEX %s_name_prev_revision_uindex ON %s (name, prev_revision)`, tableName, tableName),
44+
);`,
45+
"CREATE INDEX `" + tableName + "_name_index` ON " + quotedTableName + " (name)",
46+
"CREATE INDEX `" + tableName + "_name_id_index` ON " + quotedTableName + " (name,id)",
47+
"CREATE INDEX `" + tableName + "_id_deleted_index` ON " + quotedTableName + " (id,deleted)",
48+
"CREATE INDEX `" + tableName + "_prev_revision_index` ON " + quotedTableName + " (prev_revision)",
49+
"CREATE UNIQUE INDEX `" + tableName + "_name_prev_revision_uindex` ON " + quotedTableName + " (name, prev_revision)",
4750
}
4851
}
4952

5053
func getSchemaMigrations(tableName string) []string {
54+
quotedTableName := "`" + tableName + "`"
5155
return []string{
52-
fmt.Sprintf(`ALTER TABLE %s MODIFY COLUMN id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL UNIQUE, MODIFY COLUMN create_revision BIGINT UNSIGNED, MODIFY COLUMN prev_revision BIGINT UNSIGNED`, tableName),
56+
`ALTER TABLE ` + quotedTableName + ` MODIFY COLUMN id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL UNIQUE, MODIFY COLUMN create_revision BIGINT UNSIGNED, MODIFY COLUMN prev_revision BIGINT UNSIGNED`,
5357
// Creating an empty migration to ensure that postgresql and mysql migrations match up
5458
// with each other for a give value of KINE_SCHEMA_MIGRATION env var
5559
``,
5660
}
5761
}
5862

59-
var createDB = "CREATE DATABASE IF NOT EXISTS `%s`;"
60-
6163
func New(ctx context.Context, cfg *drivers.Config) (bool, server.Backend, error) {
6264
tlsConfig, err := cfg.BackendTLSConfig.ClientConfig()
6365
if err != nil {
@@ -77,38 +79,39 @@ func New(ctx context.Context, cfg *drivers.Config) (bool, server.Backend, error)
7779
return false, nil, err
7880
}
7981

80-
dialect, err := generic.Open(ctx, "mysql", parsedDSN, cfg.ConnectionPoolConfig, "?", false, cfg.MetricsRegisterer, cfg.TableName)
81-
if err != nil {
82-
return false, nil, err
83-
}
84-
8582
tableName := cfg.TableName
8683
if tableName == "" {
8784
tableName = "kine"
8885
}
86+
quotedTableName := "`" + tableName + "`"
87+
88+
dialect, err := generic.Open(ctx, "mysql", parsedDSN, cfg.ConnectionPoolConfig, "?", false, cfg.MetricsRegisterer, tableName)
89+
if err != nil {
90+
return false, nil, err
91+
}
8992

9093
dialect.LastInsertID = true
91-
dialect.GetSizeSQL = fmt.Sprintf(`
94+
dialect.GetSizeSQL = `
9295
SELECT SUM(data_length + index_length)
9396
FROM information_schema.TABLES
94-
WHERE table_schema = DATABASE() AND table_name = '%s'`, tableName)
95-
dialect.CompactSQL = fmt.Sprintf(`
96-
DELETE kv FROM %s AS kv
97+
WHERE table_schema = DATABASE() AND table_name = '` + tableName + `'`
98+
dialect.CompactSQL = `
99+
DELETE kv FROM ` + quotedTableName + ` AS kv
97100
INNER JOIN (
98101
SELECT kp.prev_revision AS id
99-
FROM %s AS kp
102+
FROM ` + quotedTableName + ` AS kp
100103
WHERE
101104
kp.name != 'compact_rev_key' AND
102105
kp.prev_revision != 0 AND
103106
kp.id <= ?
104107
UNION
105108
SELECT kd.id AS id
106-
FROM %s AS kd
109+
FROM ` + quotedTableName + ` AS kd
107110
WHERE
108111
kd.deleted != 0 AND
109112
kd.id <= ?
110113
) AS ks
111-
ON kv.id = ks.id`, tableName, tableName, tableName)
114+
ON kv.id = ks.id`
112115
dialect.TranslateErr = func(err error) error {
113116
if err, ok := err.(*mysql.MySQLError); ok && err.Number == 1062 {
114117
return server.ErrKeyExists

pkg/drivers/pgsql/pgsql.go

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@ const (
2828
defaultDSN = "postgres://postgres:postgres@localhost/"
2929
)
3030

31+
var createDB = `CREATE DATABASE "%s";`
32+
3133
func getSchema(tableName string) []string {
34+
quotedTableName := `"` + tableName + `"`
3235
return []string{
33-
fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s
36+
`CREATE TABLE IF NOT EXISTS ` + quotedTableName + `
3437
(
3538
id BIGSERIAL PRIMARY KEY,
3639
name text COLLATE "C",
@@ -41,28 +44,27 @@ func getSchema(tableName string) []string {
4144
lease INTEGER,
4245
value bytea,
4346
old_value bytea
44-
);`, tableName),
47+
);`,
4548

46-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_name_index ON %s (name)`, tableName, tableName),
47-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_name_id_index ON %s (name,id)`, tableName, tableName),
48-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_id_deleted_index ON %s (id,deleted)`, tableName, tableName),
49-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_prev_revision_index ON %s (prev_revision)`, tableName, tableName),
50-
fmt.Sprintf(`CREATE UNIQUE INDEX IF NOT EXISTS %s_name_prev_revision_uindex ON %s (name, prev_revision)`, tableName, tableName),
51-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_list_query_index on %s(name, id DESC, deleted)`, tableName, tableName),
49+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_name_index" ON ` + quotedTableName + ` (name)`,
50+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_name_id_index" ON ` + quotedTableName + ` (name,id)`,
51+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_id_deleted_index" ON ` + quotedTableName + ` (id,deleted)`,
52+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_prev_revision_index" ON ` + quotedTableName + ` (prev_revision)`,
53+
`CREATE UNIQUE INDEX IF NOT EXISTS "` + tableName + `_name_prev_revision_uindex" ON ` + quotedTableName + ` (name, prev_revision)`,
54+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_list_query_index" on ` + quotedTableName + `(name, id DESC, deleted)`,
5255
}
5356
}
5457

5558
func getSchemaMigrations(tableName string) []string {
59+
quotedTableName := `"` + tableName + `"`
5660
return []string{
57-
fmt.Sprintf(`ALTER TABLE %s ALTER COLUMN id SET DATA TYPE BIGINT, ALTER COLUMN create_revision SET DATA TYPE BIGINT, ALTER COLUMN prev_revision SET DATA TYPE BIGINT; ALTER SEQUENCE %s_id_seq AS BIGINT`, tableName, tableName),
61+
`ALTER TABLE ` + quotedTableName + ` ALTER COLUMN id SET DATA TYPE BIGINT, ALTER COLUMN create_revision SET DATA TYPE BIGINT, ALTER COLUMN prev_revision SET DATA TYPE BIGINT; ALTER SEQUENCE "` + tableName + `_id_seq" AS BIGINT`,
5862
// It is important to set the collation to "C" to ensure that LIKE and COMPARISON
5963
// queries use the index.
60-
fmt.Sprintf(`ALTER TABLE %s ALTER COLUMN name SET DATA TYPE TEXT COLLATE "C" USING name::TEXT COLLATE "C"`, tableName),
64+
`ALTER TABLE ` + quotedTableName + ` ALTER COLUMN name SET DATA TYPE TEXT COLLATE "C" USING name::TEXT COLLATE "C"`,
6165
}
6266
}
6367

64-
var createDB = `CREATE DATABASE "%s";`
65-
6668
func New(ctx context.Context, cfg *drivers.Config) (bool, server.Backend, error) {
6769
parsedDSN, err := prepareDSN(cfg.DataSourceName, cfg.BackendTLSConfig)
6870
if err != nil {
@@ -73,78 +75,77 @@ func New(ctx context.Context, cfg *drivers.Config) (bool, server.Backend, error)
7375
return false, nil, err
7476
}
7577

76-
dialect, err := generic.Open(ctx, "pgx", parsedDSN, cfg.ConnectionPoolConfig, "$", true, cfg.MetricsRegisterer, cfg.TableName)
77-
if err != nil {
78-
return false, nil, err
79-
}
80-
8178
tableName := cfg.TableName
8279
if tableName == "" {
8380
tableName = "kine"
8481
}
82+
quotedTableName := `"` + tableName + `"`
8583

86-
listSQL := fmt.Sprintf(`
84+
dialect, err := generic.Open(ctx, "pgx", parsedDSN, cfg.ConnectionPoolConfig, "$", true, cfg.MetricsRegisterer, tableName)
85+
if err != nil {
86+
return false, nil, err
87+
}
88+
listSQL := `
8789
SELECT
88-
(SELECT MAX(rkv.id) AS id FROM %s AS rkv),
89-
(SELECT MAX(crkv.prev_revision) AS prev_revision FROM %s AS crkv WHERE crkv.name = 'compact_rev_key'),
90+
(SELECT MAX(rkv.id) AS id FROM ` + quotedTableName + ` AS rkv),
91+
(SELECT MAX(crkv.prev_revision) AS prev_revision FROM ` + quotedTableName + ` AS crkv WHERE crkv.name = 'compact_rev_key'),
9092
maxkv.*
9193
FROM (
9294
SELECT DISTINCT ON (name)
9395
kv.id AS theid, kv.name, kv.created, kv.deleted, kv.create_revision, kv.prev_revision, kv.lease, kv.value, kv.old_value
9496
FROM
95-
%s AS kv
97+
` + quotedTableName + ` AS kv
9698
WHERE
9799
kv.name LIKE ?
98-
%%s
100+
%s
99101
ORDER BY kv.name, theid DESC
100102
) AS maxkv
101103
WHERE
102104
maxkv.deleted = 0 OR ?
103105
ORDER BY maxkv.name, maxkv.theid DESC
104-
`, tableName, tableName, tableName)
106+
`
105107

106-
countSQL := fmt.Sprintf(`
108+
countSQL := `
107109
SELECT
108-
(SELECT MAX(rkv.id) AS id FROM %s AS rkv),
110+
(SELECT MAX(rkv.id) AS id FROM ` + quotedTableName + ` AS rkv),
109111
COUNT(c.theid)
110112
FROM (
111113
SELECT DISTINCT ON (name)
112114
kv.id AS theid, kv.deleted
113-
FROM %s AS kv
115+
FROM ` + quotedTableName + ` AS kv
114116
WHERE
115117
kv.name LIKE ?
116-
%%s
118+
%s
117119
ORDER BY kv.name, theid DESC
118120
) AS c
119121
WHERE c.deleted = 0 OR ?
120-
`, tableName, tableName)
121-
122-
dialect.GetSizeSQL = fmt.Sprintf(`SELECT pg_total_relation_size('%s')`, tableName)
123-
dialect.CompactSQL = fmt.Sprintf(`
124-
DELETE FROM %s AS kv
122+
`
123+
dialect.GetSizeSQL = `SELECT pg_total_relation_size('` + tableName + `')`
124+
dialect.CompactSQL = `
125+
DELETE FROM ` + quotedTableName + ` AS kv
125126
USING (
126127
SELECT kp.prev_revision AS id
127-
FROM %s AS kp
128+
FROM ` + quotedTableName + ` AS kp
128129
WHERE
129130
kp.name != 'compact_rev_key' AND
130131
kp.prev_revision != 0 AND
131132
kp.id <= $1
132133
UNION
133134
SELECT kd.id AS id
134-
FROM %s AS kd
135+
FROM ` + quotedTableName + ` AS kd
135136
WHERE
136137
kd.deleted != 0 AND
137138
kd.id <= $2
138139
) AS ks
139-
WHERE kv.id = ks.id`, tableName, tableName, tableName)
140+
WHERE kv.id = ks.id`
140141
dialect.GetCurrentSQL = q(fmt.Sprintf(listSQL, "AND kv.name > ?"))
141142
dialect.ListRevisionStartSQL = q(fmt.Sprintf(listSQL, "AND kv.id <= ?"))
142143
dialect.GetRevisionAfterSQL = q(fmt.Sprintf(listSQL, "AND kv.name > ? AND kv.id <= ?"))
143144
dialect.CountCurrentSQL = q(fmt.Sprintf(countSQL, "AND kv.name > ?"))
144145
dialect.CountRevisionSQL = q(fmt.Sprintf(countSQL, "AND kv.name > ? AND kv.id <= ?"))
145146
dialect.FillRetryDuration = time.Millisecond + 5
146147
dialect.InsertRetry = func(err error) bool {
147-
if err, ok := err.(*pgconn.PgError); ok && err.Code == pgerrcode.UniqueViolation && err.ConstraintName == fmt.Sprintf("%s_pkey", cfg.TableName) {
148+
if err, ok := err.(*pgconn.PgError); ok && err.Code == pgerrcode.UniqueViolation && err.ConstraintName == "kine_pkey" {
148149
return true
149150
}
150151
return false

pkg/drivers/sqlite/sqlite.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import (
2121
)
2222

2323
func getSchema(tableName string) []string {
24+
quotedTableName := `"` + tableName + `"`
2425
return []string{
25-
fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s
26+
`CREATE TABLE IF NOT EXISTS ` + quotedTableName + `
2627
(
2728
id INTEGER PRIMARY KEY AUTOINCREMENT,
2829
name INTEGER,
@@ -33,12 +34,12 @@ func getSchema(tableName string) []string {
3334
lease INTEGER,
3435
value BLOB,
3536
old_value BLOB
36-
)`, tableName),
37-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_name_index ON %s (name)`, tableName, tableName),
38-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_name_id_index ON %s (name,id)`, tableName, tableName),
39-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_id_deleted_index ON %s (id,deleted)`, tableName, tableName),
40-
fmt.Sprintf(`CREATE INDEX IF NOT EXISTS %s_prev_revision_index ON %s (prev_revision)`, tableName, tableName),
41-
fmt.Sprintf(`CREATE UNIQUE INDEX IF NOT EXISTS %s_name_prev_revision_uindex ON %s (name, prev_revision)`, tableName, tableName),
37+
)`,
38+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_name_index" ON ` + quotedTableName + ` (name)`,
39+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_name_id_index" ON ` + quotedTableName + ` (name,id)`,
40+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_id_deleted_index" ON ` + quotedTableName + ` (id,deleted)`,
41+
`CREATE INDEX IF NOT EXISTS "` + tableName + `_prev_revision_index" ON ` + quotedTableName + ` (prev_revision)`,
42+
`CREATE UNIQUE INDEX IF NOT EXISTS "` + tableName + `_name_prev_revision_uindex" ON ` + quotedTableName + ` (name, prev_revision)`,
4243
`PRAGMA wal_checkpoint(TRUNCATE)`,
4344
}
4445
}
@@ -61,31 +62,32 @@ func NewVariant(ctx context.Context, driverName string, cfg *drivers.Config) (se
6162
if tableName == "" {
6263
tableName = "kine"
6364
}
65+
quotedTableName := `"` + tableName + `"`
6466

65-
dialect, err := generic.Open(ctx, driverName, dataSourceName, cfg.ConnectionPoolConfig, "?", false, cfg.MetricsRegisterer, cfg.TableName)
67+
dialect, err := generic.Open(ctx, driverName, dataSourceName, cfg.ConnectionPoolConfig, "?", false, cfg.MetricsRegisterer, tableName)
6668
if err != nil {
6769
return nil, nil, err
6870
}
6971

7072
dialect.LastInsertID = true
7173
dialect.GetSizeSQL = `SELECT SUM(pgsize) FROM dbstat`
72-
dialect.CompactSQL = fmt.Sprintf(`
73-
DELETE FROM %s AS kv
74+
dialect.CompactSQL = `
75+
DELETE FROM ` + quotedTableName + ` AS kv
7476
WHERE
7577
kv.id IN (
7678
SELECT kp.prev_revision AS id
77-
FROM %s AS kp
79+
FROM ` + quotedTableName + ` AS kp
7880
WHERE
7981
kp.name != 'compact_rev_key' AND
8082
kp.prev_revision != 0 AND
8183
kp.id <= ?
8284
UNION
8385
SELECT kd.id AS id
84-
FROM %s AS kd
86+
FROM ` + quotedTableName + ` AS kd
8587
WHERE
8688
kd.deleted != 0 AND
8789
kd.id <= ?
88-
)`, tableName, tableName, tableName)
90+
)`
8991
dialect.PostCompactSQL = `PRAGMA wal_checkpoint(FULL)`
9092
dialect.TranslateErr = func(err error) error {
9193
if err, ok := err.(sqlite3.Error); ok && err.ExtendedCode == sqlite3.ErrConstraintUnique {
@@ -103,7 +105,7 @@ func NewVariant(ctx context.Context, driverName string, cfg *drivers.Config) (se
103105
return err.Error()
104106
}
105107

106-
if err := setup(dialect.DB, tableName); err != nil {
108+
if err := setup(dialect.DB, cfg.TableName); err != nil {
107109
return nil, nil, errors.Wrap(err, "setup db")
108110
}
109111

0 commit comments

Comments
 (0)