From cb5c93837054736058a3d35342d5a52d6e27600c Mon Sep 17 00:00:00 2001 From: Thanh Nguyen Date: Wed, 31 May 2023 22:52:05 +1000 Subject: [PATCH] prepare to release v0.2.0 --- RELEASE-NOTES.md | 2 +- godynamo.go | 22 +++++----- stmt_document.go | 18 ++++---- stmt_index.go | 2 +- stmt_table.go | 2 +- tx.go | 106 +++++++++++++++++++++++------------------------ 6 files changed, 73 insertions(+), 79 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index a466174..8cd8f42 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,6 +1,6 @@ # godynamo release notes -## 2023-05-xx - v0.2.0 +## 2023-05-31 - v0.2.0 - Add transation support. diff --git a/godynamo.go b/godynamo.go index 9179238..af93181 100644 --- a/godynamo.go +++ b/godynamo.go @@ -14,7 +14,7 @@ import ( const ( // Version of package godynamo. - Version = "0.1.0" + Version = "0.2.0" ) var ( @@ -59,16 +59,16 @@ func ValuesToNamedValues(values []driver.Value) []driver.NamedValue { return result } -// NamedValuesToValues transforms a []driver.NamedValue to []driver.Value. -// -// @Available since v0.2.0 -func NamedValuesToValues(values []driver.NamedValue) []driver.Value { - result := make([]driver.Value, len(values)) - for i, v := range values { - result[i] = v.Value - } - return result -} +// // NamedValuesToValues transforms a []driver.NamedValue to []driver.Value. +// // +// // @Available since v0.2.0 +// func NamedValuesToValues(values []driver.NamedValue) []driver.Value { +// result := make([]driver.Value, len(values)) +// for i, v := range values { +// result[i] = v.Value +// } +// return result +// } // ToAttributeValue marshals a Go value to AWS AttributeValue. func ToAttributeValue(value interface{}) (types.AttributeValue, error) { diff --git a/stmt_document.go b/stmt_document.go index eee1738..046dc6e 100644 --- a/stmt_document.go +++ b/stmt_document.go @@ -101,13 +101,11 @@ func (s *StmtSelect) Query(values []driver.Value) (driver.Rows, error) { // @Available since v0.2.0 func (s *StmtSelect) QueryContext(ctx context.Context, values []driver.NamedValue) (driver.Rows, error) { outputFn, err := s.conn.executeContext(ctx, s.Stmt, values) - if err == ErrInTx { - return &TxResultResultSet{wrap: ResultResultSet{err: err}, outputFn: outputFn}, nil - } - result := &ResultResultSet{stmtOutput: outputFn()} - if err == nil { - result.init() - } + // TODO Query is not supported yet in tx mode + // if err == ErrInTx { + // return &TxResultResultSet{wrap: ResultResultSet{err: err}, outputFn: outputFn}, nil + // } + result := (&ResultResultSet{stmtOutput: outputFn()}).init() return result, err } @@ -139,9 +137,8 @@ func (s *StmtUpdate) Query(values []driver.Value) (driver.Rows, error) { // @Available since v0.2.0 func (s *StmtUpdate) QueryContext(ctx context.Context, values []driver.NamedValue) (driver.Rows, error) { outputFn, err := s.conn.executeContext(ctx, s.Stmt, values) - result := &ResultResultSet{stmtOutput: outputFn()} + result := (&ResultResultSet{stmtOutput: outputFn()}).init() if err == nil || IsAwsError(err, "ConditionalCheckFailedException") { - result.init() err = nil } return result, err @@ -198,9 +195,8 @@ func (s *StmtDelete) Query(values []driver.Value) (driver.Rows, error) { // @Available since v0.2.0 func (s *StmtDelete) QueryContext(ctx context.Context, values []driver.NamedValue) (driver.Rows, error) { outputFn, err := s.conn.executeContext(ctx, s.Stmt, values) - result := &ResultResultSet{stmtOutput: outputFn()} + result := (&ResultResultSet{stmtOutput: outputFn()}).init() if err == nil || IsAwsError(err, "ConditionalCheckFailedException") { - result.init() err = nil } return result, err diff --git a/stmt_index.go b/stmt_index.go index 00869b5..347b661 100644 --- a/stmt_index.go +++ b/stmt_index.go @@ -99,7 +99,7 @@ func (s *StmtDescribeLSI) Query(_ []driver.Value) (driver.Rows, error) { // QueryContext implements driver.StmtQueryContext/QueryContext. // // @Available since v0.2.0 -func (s *StmtDescribeLSI) QueryContext(ctx context.Context, _ []driver.Value) (driver.Rows, error) { +func (s *StmtDescribeLSI) QueryContext(ctx context.Context, _ []driver.NamedValue) (driver.Rows, error) { input := &dynamodb.DescribeTableInput{ TableName: &s.tableName, } diff --git a/stmt_table.go b/stmt_table.go index 80e3388..ee8f655 100644 --- a/stmt_table.go +++ b/stmt_table.go @@ -395,7 +395,7 @@ func (s *StmtAlterTable) Query(_ []driver.Value) (driver.Rows, error) { // QueryContext implements driver.StmtQueryContext/QueryContext. // This function is not implemented, use ExecContext instead. -func (s *StmtAlterTable) QueryContext(_ []driver.Value) (driver.Rows, error) { +func (s *StmtAlterTable) QueryContext(_ []driver.NamedValue) (driver.Rows, error) { return nil, errors.New("this operation is not supported, please use ExecContext") } diff --git a/tx.go b/tx.go index e8295c2..d3a6459 100644 --- a/tx.go +++ b/tx.go @@ -1,9 +1,7 @@ package godynamo import ( - "database/sql/driver" "fmt" - "reflect" ) // TxResultNoResultSet is transaction-aware version of ResultNoResultSet. @@ -35,59 +33,59 @@ func (t *TxResultNoResultSet) RowsAffected() (int64, error) { return t.affectedRows, nil } -// TxResultResultSet is transaction-aware version of ResultResultSet. +// // TxResultResultSet is transaction-aware version of ResultResultSet. +// // +// // @Available since v0.2.0 +// type TxResultResultSet struct { +// wrap ResultResultSet +// hasOutput bool +// outputFn executeStatementOutputWrapper +// } // -// @Available since v0.2.0 -type TxResultResultSet struct { - wrap ResultResultSet - hasOutput bool - outputFn executeStatementOutputWrapper -} - -func (r *TxResultResultSet) checkOutput() { - if !r.hasOutput { - r.wrap.stmtOutput = r.outputFn() - fmt.Println("DEBUG", r.wrap.stmtOutput) - if r.wrap.stmtOutput != nil { - r.wrap.err = nil - r.hasOutput = true - r.wrap.init() - } - } -} - -// Columns implements driver.Rows/Columns. -func (r *TxResultResultSet) Columns() []string { - r.checkOutput() - return r.wrap.Columns() -} - -// ColumnTypeScanType implements driver.RowsColumnTypeScanType/ColumnTypeScanType -func (r *TxResultResultSet) ColumnTypeScanType(index int) reflect.Type { - r.checkOutput() - return r.wrap.ColumnTypeScanType(index) -} - -// ColumnTypeDatabaseTypeName implements driver.RowsColumnTypeDatabaseTypeName/ColumnTypeDatabaseTypeName -func (r *TxResultResultSet) ColumnTypeDatabaseTypeName(index int) string { - r.checkOutput() - return r.wrap.ColumnTypeDatabaseTypeName(index) -} - -// Close implements driver.Rows/Close. -func (r *TxResultResultSet) Close() error { - r.checkOutput() - if !r.hasOutput { - return ErrInTx - } - return nil -} - -// Next implements driver.Rows/Next. -func (r *TxResultResultSet) Next(dest []driver.Value) error { - r.checkOutput() - return r.wrap.Next(dest) -} +// func (r *TxResultResultSet) checkOutput() { +// if !r.hasOutput { +// r.wrap.stmtOutput = r.outputFn() +// fmt.Println("DEBUG", r.wrap.stmtOutput) +// if r.wrap.stmtOutput != nil { +// r.wrap.err = nil +// r.hasOutput = true +// r.wrap.init() +// } +// } +// } +// +// // Columns implements driver.Rows/Columns. +// func (r *TxResultResultSet) Columns() []string { +// r.checkOutput() +// return r.wrap.Columns() +// } +// +// // ColumnTypeScanType implements driver.RowsColumnTypeScanType/ColumnTypeScanType +// func (r *TxResultResultSet) ColumnTypeScanType(index int) reflect.Type { +// r.checkOutput() +// return r.wrap.ColumnTypeScanType(index) +// } +// +// // ColumnTypeDatabaseTypeName implements driver.RowsColumnTypeDatabaseTypeName/ColumnTypeDatabaseTypeName +// func (r *TxResultResultSet) ColumnTypeDatabaseTypeName(index int) string { +// r.checkOutput() +// return r.wrap.ColumnTypeDatabaseTypeName(index) +// } +// +// // Close implements driver.Rows/Close. +// func (r *TxResultResultSet) Close() error { +// r.checkOutput() +// if !r.hasOutput { +// return ErrInTx +// } +// return nil +// } +// +// // Next implements driver.Rows/Next. +// func (r *TxResultResultSet) Next(dest []driver.Value) error { +// r.checkOutput() +// return r.wrap.Next(dest) +// } /*----------------------------------------------------------------------*/