This is an automated email from the ASF dual-hosted git repository.

francischuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite-avatica-go.git


The following commit(s) were added to refs/heads/master by this push:
     new 7a35be7  [CALCITE-3275] add nil checks to error parsing (Tino Rusch).
7a35be7 is described below

commit 7a35be7713b740eb9bd8e18d2996ca2c279c27f3
Author: Tino Rusch <tino.ru...@gmail.com>
AuthorDate: Tue Aug 20 13:33:46 2019 +0200

    [CALCITE-3275] add nil checks to error parsing (Tino Rusch).
    
    This commit introduces a small helper method to get the server address from 
the
    message metadata. Before using this helper the driver would crash the whole
    application if the server sends an error message without setting up the 
metadata
    object.
---
 connection.go      |  7 +------
 generic/generic.go | 15 +++++++--------
 hsqldb/hsqldb.go   | 15 +++++++--------
 message/helper.go  | 14 ++++++++++++++
 phoenix/phoenix.go | 15 +++++++--------
 5 files changed, 36 insertions(+), 30 deletions(-)

diff --git a/connection.go b/connection.go
index ce5d1c1..222cc9d 100644
--- a/connection.go
+++ b/connection.go
@@ -216,11 +216,6 @@ func (c *conn) avaticaErrorToResponseErrorOrError(err 
error) error {
                return 
c.adapter.ErrorResponseToResponseError(avaticaErr.message)
        }
 
-       serverAddress := "unknown"
-       md := avaticaErr.message.GetMetadata()
-       if md != nil {
-               serverAddress = md.ServerAddress
-       }
        return errors.ResponseError{
                Exceptions:   avaticaErr.message.Exceptions,
                ErrorMessage: avaticaErr.message.ErrorMessage,
@@ -228,7 +223,7 @@ func (c *conn) avaticaErrorToResponseErrorOrError(err 
error) error {
                ErrorCode:    errors.ErrorCode(avaticaErr.message.ErrorCode),
                SqlState:     errors.SQLState(avaticaErr.message.SqlState),
                Metadata: &errors.RPCMetadata{
-                       ServerAddress: serverAddress,
+                       ServerAddress: 
message.ServerAddressFromMetadata(avaticaErr.message),
                },
        }
 }
diff --git a/generic/generic.go b/generic/generic.go
index 3ca0bd9..a1ed68d 100644
--- a/generic/generic.go
+++ b/generic/generic.go
@@ -109,16 +109,15 @@ func (a Adapter) GetColumnTypeDefinition(col 
*message.ColumnMetaData) *internal.
        return column
 }
 
-func (a Adapter) ErrorResponseToResponseError(message *message.ErrorResponse) 
errors.ResponseError {
-
+func (a Adapter) ErrorResponseToResponseError(err *message.ErrorResponse) 
errors.ResponseError {
        return errors.ResponseError{
-               Exceptions:   message.Exceptions,
-               ErrorMessage: message.ErrorMessage,
-               Severity:     int8(message.Severity),
-               ErrorCode:    errors.ErrorCode(message.ErrorCode),
-               SqlState:     errors.SQLState(message.SqlState),
+               Exceptions:   err.Exceptions,
+               ErrorMessage: err.ErrorMessage,
+               Severity:     int8(err.Severity),
+               ErrorCode:    errors.ErrorCode(err.ErrorCode),
+               SqlState:     errors.SQLState(err.SqlState),
                Metadata: &errors.RPCMetadata{
-                       ServerAddress: message.GetMetadata().ServerAddress,
+                       ServerAddress: message.ServerAddressFromMetadata(err),
                },
        }
 }
diff --git a/hsqldb/hsqldb.go b/hsqldb/hsqldb.go
index 2cb14cd..2ac6f3b 100644
--- a/hsqldb/hsqldb.go
+++ b/hsqldb/hsqldb.go
@@ -109,16 +109,15 @@ func (a Adapter) GetColumnTypeDefinition(col 
*message.ColumnMetaData) *internal.
        return column
 }
 
-func (a Adapter) ErrorResponseToResponseError(message *message.ErrorResponse) 
errors.ResponseError {
-
+func (a Adapter) ErrorResponseToResponseError(err *message.ErrorResponse) 
errors.ResponseError {
        return errors.ResponseError{
-               Exceptions:   message.Exceptions,
-               ErrorMessage: message.ErrorMessage,
-               Severity:     int8(message.Severity),
-               ErrorCode:    errors.ErrorCode(message.ErrorCode),
-               SqlState:     errors.SQLState(message.SqlState),
+               Exceptions:   err.Exceptions,
+               ErrorMessage: err.ErrorMessage,
+               Severity:     int8(err.Severity),
+               ErrorCode:    errors.ErrorCode(err.ErrorCode),
+               SqlState:     errors.SQLState(err.SqlState),
                Metadata: &errors.RPCMetadata{
-                       ServerAddress: message.GetMetadata().ServerAddress,
+                       ServerAddress: message.ServerAddressFromMetadata(err),
                },
        }
 }
diff --git a/message/helper.go b/message/helper.go
new file mode 100644
index 0000000..a17ab53
--- /dev/null
+++ b/message/helper.go
@@ -0,0 +1,14 @@
+package message
+
+type MetadataProvider interface {
+       GetMetadata() *RpcMetadata
+}
+
+func ServerAddressFromMetadata(message MetadataProvider) string {
+       serverAddress := "unknown"
+       md := message.GetMetadata()
+       if md != nil {
+               serverAddress = md.ServerAddress
+       }
+       return serverAddress
+}
diff --git a/phoenix/phoenix.go b/phoenix/phoenix.go
index 77ee648..6ed4448 100644
--- a/phoenix/phoenix.go
+++ b/phoenix/phoenix.go
@@ -115,14 +115,14 @@ func (a Adapter) GetColumnTypeDefinition(col 
*message.ColumnMetaData) *internal.
        return column
 }
 
-func (a Adapter) ErrorResponseToResponseError(message *message.ErrorResponse) 
errors.ResponseError {
+func (a Adapter) ErrorResponseToResponseError(err *message.ErrorResponse) 
errors.ResponseError {
        var (
                errorCode int
                sqlState  string
        )
 
        re := regexp.MustCompile(`ERROR (\d+) \(([0-9a-zA-Z]+)\)`)
-       codes := re.FindStringSubmatch(message.ErrorMessage)
+       codes := re.FindStringSubmatch(err.ErrorMessage)
 
        if len(codes) > 1 {
                errorCode, _ = strconv.Atoi(codes[1])
@@ -132,19 +132,18 @@ func (a Adapter) ErrorResponseToResponseError(message 
*message.ErrorResponse) er
                sqlState = codes[2]
        }
 
-       err := errors.ResponseError{
-               Exceptions:   message.Exceptions,
-               ErrorMessage: message.ErrorMessage,
-               Severity:     int8(message.Severity),
+       return errors.ResponseError{
+               Exceptions:   err.Exceptions,
+               ErrorMessage: err.ErrorMessage,
+               Severity:     int8(err.Severity),
                ErrorCode:    errors.ErrorCode(errorCode),
                SqlState:     errors.SQLState(sqlState),
                Metadata: &errors.RPCMetadata{
-                       ServerAddress: message.GetMetadata().ServerAddress,
+                       ServerAddress: message.ServerAddressFromMetadata(err),
                },
                Name: errorCodeNames[uint32(errorCode)],
        }
 
-       return err
 }
 
 var errorCodeNames = map[uint32]string{

Reply via email to