@@ -28,9 +28,12 @@ const (
2828 defaultDSN = "postgres://postgres:postgres@localhost/"
2929)
3030
31+ var createDB = `CREATE DATABASE "%s";`
32+
3133func 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
5558func 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-
6668func 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
0 commit comments