Moved start and close code for json writer around

This commit is contained in:
Zach Musgrave
2022-08-24 10:30:54 -07:00
parent e29e128d9a
commit a07dceeb75
3 changed files with 105 additions and 40 deletions

View File

@@ -337,7 +337,8 @@ type diffWriter interface {
// RowWriter returns a row writer for the table delta provided, which will have Close() called on it when rows are
// done being written.
RowWriter(ctx context.Context, td diff.TableDelta, unionSch sql.Schema) (diff.SqlRowDiffWriter, error)
// todo: close method
// Close finalizes the work of the writer
Close(ctx context.Context) error
}
func diffUserTables(ctx context.Context, dEnv *env.DoltEnv, dArgs *diffArgs) errhand.VerboseError {
@@ -357,7 +358,11 @@ func diffUserTables(ctx context.Context, dEnv *env.DoltEnv, dArgs *diffArgs) err
return strings.Compare(tableDeltas[i].ToName, tableDeltas[j].ToName) < 0
})
dw := newDiffWriter(ctx, engine, dArgs)
dw, err := newDiffWriter(ctx, engine, dArgs)
if err != nil {
return errhand.VerboseErrorFromError(err)
}
for _, td := range tableDeltas {
verr := diffUserTable(ctx, td, engine, dArgs, dw)
if verr != nil {
@@ -365,23 +370,28 @@ func diffUserTables(ctx context.Context, dEnv *env.DoltEnv, dArgs *diffArgs) err
}
}
err = dw.Close(ctx)
if err != nil {
return errhand.VerboseErrorFromError(err)
}
return nil
}
func newDiffWriter(ctx context.Context, sqlEngine *engine.SqlEngine, args *diffArgs) diffWriter {
func newDiffWriter(ctx context.Context, sqlEngine *engine.SqlEngine, args *diffArgs) (diffWriter, error) {
switch args.diffOutput {
case TabularDiffOutput:
return tabularDiffWriter{}
return tabularDiffWriter{}, nil
case SQLDiffOutput:
return sqlDiffWriter{}
return sqlDiffWriter{}, nil
case JsonDiffOutput:
return jsonDiffWriter{}
return newJsonDiffWriter(iohelp.NopWrCloser(cli.CliOut))
default:
panic(fmt.Sprintf("unexpected diff output: %v", args.diffOutput))
}
return nil
}
func diffUserTable(
ctx context.Context,
td diff.TableDelta,
@@ -698,14 +708,7 @@ func diffRows(
}
rowWriter = sqlexport.NewSqlDiffWriter(tableName, targetSch, iohelp.NopWrCloser(cli.CliOut))
case JsonDiffOutput:
targetSch := td.ToSch
if targetSch == nil {
targetSch = td.FromSch
}
rowWriter, err = json.NewJsonDiffWriter(iohelp.NopWrCloser(cli.CliOut), td.ToName, targetSch)
if err != nil {
return nil
}
// handled by interface
}
err = writeDiffResults(sqlCtx, sch, unionSch, rowIter, rowWriter)
@@ -936,6 +939,10 @@ func pluralize(singular, plural string, n uint64) string {
type tabularDiffWriter struct {}
func (t tabularDiffWriter) Close(ctx context.Context) error {
return nil
}
func (t tabularDiffWriter) BeginTable(ctx context.Context, td diff.TableDelta) error {
printTableDiffSummary(td)
return nil
@@ -951,6 +958,10 @@ func (t tabularDiffWriter) RowWriter(ctx context.Context, td diff.TableDelta, un
type sqlDiffWriter struct {}
func (s sqlDiffWriter) Close(ctx context.Context) error {
return nil
}
func (s sqlDiffWriter) BeginTable(ctx context.Context, td diff.TableDelta) error {
return nil
}
@@ -964,8 +975,9 @@ func (s sqlDiffWriter) RowWriter(ctx context.Context, td diff.TableDelta, unionS
}
type jsonDiffWriter struct {
wr io.WriteCloser
diffTableWriter diff.TableDiffWriter
wr io.WriteCloser
schemaDiffWriter diff.SchemaDiffWriter
rowDiffWriter diff.SqlRowDiffWriter
}
func newJsonDiffWriter(wr io.WriteCloser) (*jsonDiffWriter, error) {
@@ -974,23 +986,39 @@ func newJsonDiffWriter(wr io.WriteCloser) (*jsonDiffWriter, error) {
}, nil
}
func (j jsonDiffWriter) BeginTable(ctx context.Context, td diff.TableDelta) error {
if j.diffTableWriter == nil {
const jsonTableHeader = `{"table":{name: "%s","schema_diff":`
const jsonTableFooter = `]}`
func (j *jsonDiffWriter) BeginTable(ctx context.Context, td diff.TableDelta) error {
if j.schemaDiffWriter == nil {
err := iohelp.WriteAll(j.wr, []byte(`{"tables":[`))
if err != nil {
return err
}
} else {
err := iohelp.WriteAll(j.wr, []byte(`,`))
err := j.rowDiffWriter.Close(ctx)
if err != nil {
return err
}
err = iohelp.WriteAll(j.wr, []byte(`},`))
if err != nil {
return err
}
}
return nil
err := iohelp.WriteAll(j.wr, []byte(fmt.Sprintf(jsonTableHeader, td.ToTable)))
if err != nil {
return err
}
j.schemaDiffWriter, err = json.NewSchemaDiffWriter(iohelp.NopWrCloser(j.wr))
return err
}
func (j jsonDiffWriter) WriteSchemaDiff(ctx context.Context, toRoot *doltdb.RootValue, td diff.TableDelta) error {
func (j *jsonDiffWriter) WriteSchemaDiff(ctx context.Context, toRoot *doltdb.RootValue, td diff.TableDelta) error {
toSchemas, err := toRoot.GetAllSchemas(ctx)
if err != nil {
return errhand.BuildDError("could not read schemas from toRoot").AddCause(err).Build()
@@ -1002,7 +1030,7 @@ func (j jsonDiffWriter) WriteSchemaDiff(ctx context.Context, toRoot *doltdb.Root
}
for _, stmt := range stmts {
err := j.diffTableWriter.WriteSchemaDiff(ctx, stmt)
err := j.schemaDiffWriter.WriteSchemaDiff(ctx, stmt)
if err != nil {
return err
}
@@ -1011,7 +1039,17 @@ func (j jsonDiffWriter) WriteSchemaDiff(ctx context.Context, toRoot *doltdb.Root
return nil
}
func (j jsonDiffWriter) RowWriter(ctx context.Context, td diff.TableDelta, unionSch sql.Schema) (diff.SqlRowDiffWriter, error) {
return nil, nil
func (j *jsonDiffWriter) RowWriter(ctx context.Context, td diff.TableDelta, unionSch sql.Schema) (diff.SqlRowDiffWriter, error) {
targetSch := td.ToSch
if targetSch == nil {
targetSch = td.FromSch
}
var err error
j.rowDiffWriter, err = json.NewJsonDiffWriter(iohelp.NopWrCloser(cli.CliOut), td.ToName, targetSch)
return j.rowDiffWriter, err
}
func (j *jsonDiffWriter) Close(ctx context.Context) error {
return iohelp.WriteAll(j.wr, []byte(`}`))
}

View File

@@ -67,12 +67,12 @@ type SqlRowDiffWriter interface {
Close(ctx context.Context) error
}
// TableDiffWriter knows how to write SQL DDL statements for a schema diff for a table to an arbitrary format and
// SchemaDiffWriter knows how to write SQL DDL statements for a schema diff for a table to an arbitrary format and
// destination.
type TableDiffWriter interface {
SqlRowDiffWriter
type SchemaDiffWriter interface {
// WriteSchemaDiff writes the schema diff given (a SQL statement) and returns any error. A single table may have
// many SQL statements for a single diff. WriteSchemaDiff will be called before any row diffs via |WriteRow|
WriteSchemaDiff(ctx context.Context, schemaDiffStatement string) error
// Close finalizes the work of this writer.
Close(ctx context.Context) error
}

View File

@@ -30,13 +30,9 @@ type JsonDiffWriter struct {
rowWriter *RowWriter
wr io.WriteCloser
rowsWritten int
schemaDiffsWritten int
}
const jsonTableHeader = `{"table":{name: "%s","schema_diff":[`
const jsonTableFooter = `]}`
var _ diff.TableDiffWriter = (*JsonDiffWriter)(nil)
var _ diff.SqlRowDiffWriter = (*JsonDiffWriter)(nil)
func NewJsonDiffWriter(wr io.WriteCloser, tableName string, outSch schema.Schema) (*JsonDiffWriter, error) {
// leading diff type column with empty name
@@ -50,11 +46,6 @@ func NewJsonDiffWriter(wr io.WriteCloser, tableName string, outSch schema.Schema
return nil, err
}
err = iohelp.WriteAll(wr, []byte(fmt.Sprintf(jsonTableHeader, tableName)))
if err != nil {
return nil, err
}
writer, err := NewJSONWriterWithHeader(iohelp.NopWrCloser(wr), newSchema, `"rows":[`, "]")
if err != nil {
return nil, err
@@ -103,7 +94,43 @@ func (j *JsonDiffWriter) Close(ctx context.Context) error {
return err
}
err = iohelp.WriteAll(j.wr, []byte(jsonTableFooter))
return j.wr.Close()
}
type SchemaDiffWriter struct {
wr io.WriteCloser
schemaStmtsWritten int
}
var _ diff.SchemaDiffWriter = (*SchemaDiffWriter)(nil)
const jsonSchemaHeader = `[`
const jsonSchemaFooter = `]`
func NewSchemaDiffWriter(wr io.WriteCloser) (*SchemaDiffWriter, error) {
err := iohelp.WriteAll(wr, []byte(jsonSchemaHeader))
if err != nil {
return nil, err
}
return &SchemaDiffWriter{
wr: wr,
}, nil
}
func (j *SchemaDiffWriter) WriteSchemaDiff(ctx context.Context, schemaDiffStatement string) error {
if j.schemaStmtsWritten > 0 {
err := iohelp.WriteAll(j.wr, []byte(","))
if err != nil {
return err
}
}
return iohelp.WriteAll(j.wr, []byte(fmt.Sprintf(`"%s"`, schemaDiffStatement)))
}
func (j *SchemaDiffWriter) Close(ctx context.Context) error {
err := iohelp.WriteAll(j.wr, []byte(jsonSchemaFooter))
if err != nil {
return err
}