(ctx context.Context, out io.Writer)
| 44 | } |
| 45 | |
| 46 | func (d *Driver) dumpOneDatabase(ctx context.Context, out io.Writer) error { |
| 47 | txn, err := d.db.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}) |
| 48 | if err != nil { |
| 49 | return err |
| 50 | } |
| 51 | defer txn.Rollback() |
| 52 | |
| 53 | // Get all schemas. |
| 54 | query := "SELECT type, name, sql FROM sqlite_schema;" |
| 55 | rows, err := txn.QueryContext(ctx, query) |
| 56 | if err != nil { |
| 57 | return util.FormatErrorWithQuery(err, query) |
| 58 | } |
| 59 | defer rows.Close() |
| 60 | |
| 61 | var sqliteSchemas []sqliteSchema |
| 62 | for rows.Next() { |
| 63 | var s sqliteSchema |
| 64 | var sql sql.NullString |
| 65 | if err := rows.Scan( |
| 66 | &s.schemaType, |
| 67 | &s.name, |
| 68 | &sql, |
| 69 | ); err != nil { |
| 70 | return err |
| 71 | } |
| 72 | if sql.Valid { |
| 73 | s.statement = sql.String |
| 74 | } |
| 75 | sqliteSchemas = append(sqliteSchemas, s) |
| 76 | } |
| 77 | if err := rows.Err(); err != nil { |
| 78 | return err |
| 79 | } |
| 80 | |
| 81 | for _, s := range sqliteSchemas { |
| 82 | // We should skip sqlite sequence table. |
| 83 | if s.name == "sqlite_sequence" { |
| 84 | continue |
| 85 | } |
| 86 | if _, err := io.WriteString(out, fmt.Sprintf("%s;\n", s.statement)); err != nil { |
| 87 | return err |
| 88 | } |
| 89 | } |
| 90 | |
| 91 | return txn.Commit() |
| 92 | } |
no test coverage detected