getIndices gets all indices of a database.
(txn *sql.Tx)
| 167 | |
| 168 | // getIndices gets all indices of a database. |
| 169 | func getIndices(txn *sql.Tx) (map[string][]*storepb.IndexMetadata, error) { |
| 170 | indexMap := make(map[string][]*storepb.IndexMetadata) |
| 171 | query := ` |
| 172 | SELECT |
| 173 | tbl_name, name, sql |
| 174 | FROM sqlite_schema |
| 175 | WHERE type ='index' AND name NOT LIKE 'sqlite_%' |
| 176 | ORDER BY tbl_name, name;` |
| 177 | rows, err := txn.Query(query) |
| 178 | if err != nil { |
| 179 | return nil, err |
| 180 | } |
| 181 | defer rows.Close() |
| 182 | |
| 183 | for rows.Next() { |
| 184 | var tableName, statement string |
| 185 | index := &storepb.IndexMetadata{} |
| 186 | if err := rows.Scan(&tableName, &index.Name, &statement); err != nil { |
| 187 | return nil, err |
| 188 | } |
| 189 | index.Unique = strings.Contains(statement, " UNIQUE INDEX ") |
| 190 | indexMap[tableName] = append(indexMap[tableName], index) |
| 191 | } |
| 192 | if err := rows.Err(); err != nil { |
| 193 | return nil, util.FormatErrorWithQuery(err, query) |
| 194 | } |
| 195 | |
| 196 | for _, indexes := range indexMap { |
| 197 | for _, index := range indexes { |
| 198 | if err := func() error { |
| 199 | query := fmt.Sprintf("pragma index_info(%s);", index.Name) |
| 200 | rows, err := txn.Query(query) |
| 201 | if err != nil { |
| 202 | return err |
| 203 | } |
| 204 | defer rows.Close() |
| 205 | for rows.Next() { |
| 206 | var unusedPosition int |
| 207 | var unusedCid, expression string |
| 208 | if err := rows.Scan(&unusedPosition, &unusedCid, &expression); err != nil { |
| 209 | return err |
| 210 | } |
| 211 | index.Expressions = append(index.Expressions, expression) |
| 212 | } |
| 213 | if err := rows.Err(); err != nil { |
| 214 | return util.FormatErrorWithQuery(err, query) |
| 215 | } |
| 216 | return nil |
| 217 | }(); err != nil { |
| 218 | return nil, err |
| 219 | } |
| 220 | } |
| 221 | } |
| 222 | |
| 223 | return indexMap, nil |
| 224 | } |
| 225 | |
| 226 | func getViews(txn *sql.Tx) ([]*storepb.ViewMetadata, error) { |