@@ -28,7 +28,10 @@ type Table struct {
2828}
2929
3030var _ sql.Table = (* Table )(nil )
31- var _ sql.Inserter = (* Table )(nil )
31+ var _ sql.InsertableTable = (* Table )(nil )
32+ var _ sql.UpdatableTable = (* Table )(nil )
33+ var _ sql.DeletableTable = (* Table )(nil )
34+ var _ sql.ReplaceableTable = (* Table )(nil )
3235var _ sql.FilteredTable = (* Table )(nil )
3336var _ sql.ProjectedTable = (* Table )(nil )
3437var _ sql.IndexableTable = (* Table )(nil )
@@ -241,30 +244,70 @@ func encodeIndexValue(value *indexValue) ([]byte, error) {
241244 return buf .Bytes (), nil
242245}
243246
244- // Insert a new row into the table.
247+ type tableEditor struct {
248+ table * Table
249+ }
250+
251+ var _ sql.RowReplacer = (* tableEditor )(nil )
252+ var _ sql.RowUpdater = (* tableEditor )(nil )
253+ var _ sql.RowInserter = (* tableEditor )(nil )
254+ var _ sql.RowDeleter = (* tableEditor )(nil )
255+
256+ func (t tableEditor ) Close (* sql.Context ) error {
257+ // TODO: it would be nice to apply all pending updates here at once, rather than directly in the Insert / Update
258+ // / Delete methods.
259+ return nil
260+ }
261+
262+ func (t * Table ) Inserter (* sql.Context ) sql.RowInserter {
263+ return & tableEditor {t }
264+ }
265+
266+ func (t * Table ) Updater (* sql.Context ) sql.RowUpdater {
267+ return & tableEditor {t }
268+ }
269+
270+ func (t * Table ) Replacer (* sql.Context ) sql.RowReplacer {
271+ return & tableEditor {t }
272+ }
273+
274+ func (t * Table ) Deleter (* sql.Context ) sql.RowDeleter {
275+ return & tableEditor {t }
276+ }
277+
278+ // Convenience method to avoid having to create an inserter in test setup
245279func (t * Table ) Insert (ctx * sql.Context , row sql.Row ) error {
246- if err := checkRow (t .schema , row ); err != nil {
280+ inserter := t .Inserter (ctx )
281+ if err := inserter .Insert (ctx , row ); err != nil {
282+ return err
283+ }
284+ return inserter .Close (ctx )
285+ }
286+
287+ // Insert a new row into the table.
288+ func (t * tableEditor ) Insert (ctx * sql.Context , row sql.Row ) error {
289+ if err := checkRow (t .table .schema , row ); err != nil {
247290 return err
248291 }
249292
250- key := string (t .keys [t .insert ])
251- t .insert ++
252- if t .insert == len (t .keys ) {
253- t .insert = 0
293+ key := string (t .table . keys [t . table .insert ])
294+ t .table . insert ++
295+ if t .table . insert == len (t . table .keys ) {
296+ t .table . insert = 0
254297 }
255298
256- t .partitions [key ] = append (t .partitions [key ], row )
299+ t .table . partitions [key ] = append (t . table .partitions [key ], row )
257300 return nil
258301}
259302
260303// Delete the given row from the table.
261- func (t * Table ) Delete (ctx * sql.Context , row sql.Row ) error {
262- if err := checkRow (t .schema , row ); err != nil {
304+ func (t * tableEditor ) Delete (ctx * sql.Context , row sql.Row ) error {
305+ if err := checkRow (t .table . schema , row ); err != nil {
263306 return err
264307 }
265308
266309 matches := false
267- for partitionIndex , partition := range t .partitions {
310+ for partitionIndex , partition := range t .table . partitions {
268311 for partitionRowIndex , partitionRow := range partition {
269312 matches = true
270313 for rIndex , val := range row {
@@ -274,7 +317,7 @@ func (t *Table) Delete(ctx *sql.Context, row sql.Row) error {
274317 }
275318 }
276319 if matches {
277- t .partitions [partitionIndex ] = append (partition [:partitionRowIndex ], partition [partitionRowIndex + 1 :]... )
320+ t .table . partitions [partitionIndex ] = append (partition [:partitionRowIndex ], partition [partitionRowIndex + 1 :]... )
278321 break
279322 }
280323 }
@@ -290,16 +333,16 @@ func (t *Table) Delete(ctx *sql.Context, row sql.Row) error {
290333 return nil
291334}
292335
293- func (t * Table ) Update (ctx * sql.Context , oldRow sql.Row , newRow sql.Row ) error {
294- if err := checkRow (t .schema , oldRow ); err != nil {
336+ func (t * tableEditor ) Update (ctx * sql.Context , oldRow sql.Row , newRow sql.Row ) error {
337+ if err := checkRow (t .table . schema , oldRow ); err != nil {
295338 return err
296339 }
297- if err := checkRow (t .schema , newRow ); err != nil {
340+ if err := checkRow (t .table . schema , newRow ); err != nil {
298341 return err
299342 }
300343
301344 matches := false
302- for partitionIndex , partition := range t .partitions {
345+ for partitionIndex , partition := range t .table . partitions {
303346 for partitionRowIndex , partitionRow := range partition {
304347 matches = true
305348 for rIndex , val := range oldRow {
@@ -309,7 +352,7 @@ func (t *Table) Update(ctx *sql.Context, oldRow sql.Row, newRow sql.Row) error {
309352 }
310353 }
311354 if matches {
312- t.partitions [partitionIndex ][partitionRowIndex ] = newRow
355+ t .table . partitions [partitionIndex ][partitionRowIndex ] = newRow
313356 break
314357 }
315358 }
0 commit comments