| 179 | } |
| 180 | |
| 181 | func (p *Postgresql) List(ctx context.Context, prefix string) ([]engine.Entry, error) { |
| 182 | prefixWithWildcard := prefix + "%" |
| 183 | query := "SELECT key, value from kv WHERE key LIKE $1" |
| 184 | rows, err := p.db.Query(query, prefixWithWildcard) |
| 185 | if err != nil { |
| 186 | return nil, err |
| 187 | } |
| 188 | defer rows.Close() |
| 189 | |
| 190 | prefixLen := len(prefix) |
| 191 | entries := make([]engine.Entry, 0) |
| 192 | for rows.Next() { |
| 193 | var key string |
| 194 | var value []byte |
| 195 | |
| 196 | err := rows.Scan(&key, &value) |
| 197 | if err != nil { |
| 198 | return nil, err |
| 199 | } |
| 200 | |
| 201 | if key == prefix { |
| 202 | continue |
| 203 | } |
| 204 | |
| 205 | key = strings.TrimLeft(key[prefixLen+1:], "/") |
| 206 | if strings.ContainsRune(key, '/') { |
| 207 | continue |
| 208 | } |
| 209 | entries = append(entries, engine.Entry{ |
| 210 | Key: key, |
| 211 | Value: value, |
| 212 | }) |
| 213 | } |
| 214 | |
| 215 | if err := rows.Err(); err != nil { |
| 216 | return nil, err |
| 217 | } |
| 218 | |
| 219 | return entries, nil |
| 220 | } |
| 221 | |
| 222 | func (p *Postgresql) electLoop() { |
| 223 | defer p.wg.Done() |