From b11468757ceab4e424a425a686c4bd72bf358fc3 Mon Sep 17 00:00:00 2001 From: Daniel Nelson Date: Tue, 8 May 2018 12:10:25 -0700 Subject: [PATCH] Add uint/bool support to cratedb output (#4117) --- docker-compose.yml | 24 ++++++++++++------------ plugins/outputs/cratedb/cratedb.go | 19 +++++++++++++++---- plugins/outputs/cratedb/cratedb_test.go | 8 ++++---- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7dd3feeb4..822d7fff1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -79,15 +79,15 @@ services: - "389:389" - "636:636" crate: - image: crate/crate - ports: - - "4200:4200" - - "4230:4230" - command: - - crate - - -Cnetwork.host=0.0.0.0 - - -Ctransport.host=localhost - - -Clicense.enterprise=false - environment: - - CRATE_HEAP_SIZE=128m - - JAVA_OPTS='-Xms256m -Xmx256m' + image: crate/crate + ports: + - "4200:4200" + - "4230:4230" + - "5432:5432" + command: + - crate + - -Cnetwork.host=0.0.0.0 + - -Ctransport.host=localhost + - -Clicense.enterprise=false + environment: + - CRATE_HEAP_SIZE=128m diff --git a/plugins/outputs/cratedb/cratedb.go b/plugins/outputs/cratedb/cratedb.go index 5a5987c77..01213011f 100644 --- a/plugins/outputs/cratedb/cratedb.go +++ b/plugins/outputs/cratedb/cratedb.go @@ -7,6 +7,7 @@ import ( "encoding/binary" "fmt" "sort" + "strconv" "strings" "time" @@ -16,6 +17,8 @@ import ( _ "github.com/jackc/pgx/stdlib" ) +const MaxInt64 = int64(^uint64(0) >> 1) + type CrateDB struct { URL string Timeout internal.Duration @@ -115,11 +118,19 @@ func escapeValue(val interface{}) (string, error) { switch t := val.(type) { case string: return escapeString(t, `'`), nil - // We don't handle uint, uint32 and uint64 here because CrateDB doesn't - // seem to support unsigned types. But it seems like input plugins don't - // produce those types, so it's hopefully ok. - case int, int32, int64, float32, float64: + case int64, float64: return fmt.Sprint(t), nil + case uint64: + // The long type is the largest integer type in CrateDB and is the + // size of a signed int64. If our value is too large send the largest + // possible value. + if t <= uint64(MaxInt64) { + return strconv.FormatInt(int64(t), 10), nil + } else { + return strconv.FormatInt(MaxInt64, 10), nil + } + case bool: + return strconv.FormatBool(t), nil case time.Time: // see https://crate.io/docs/crate/reference/sql/data_types.html#timestamp return escapeValue(t.Format("2006-01-02T15:04:05.999-0700")) diff --git a/plugins/outputs/cratedb/cratedb_test.go b/plugins/outputs/cratedb/cratedb_test.go index be1d889c0..0cd93e827 100644 --- a/plugins/outputs/cratedb/cratedb_test.go +++ b/plugins/outputs/cratedb/cratedb_test.go @@ -111,12 +111,12 @@ func Test_escapeValue(t *testing.T) { {`foo`, `'foo'`}, {`foo'bar 'yeah`, `'foo''bar ''yeah'`}, // int types - {123, `123`}, // int {int64(123), `123`}, - {int32(123), `123`}, + {uint64(123), `123`}, + {uint64(MaxInt64) + 1, `9223372036854775807`}, + {true, `true`}, + {false, `false`}, // float types - {123.456, `123.456`}, - {float32(123.456), `123.456`}, // floating point SNAFU {float64(123.456), `123.456`}, // time.Time {time.Date(2017, 8, 7, 16, 44, 52, 123*1000*1000, time.FixedZone("Dreamland", 5400)), `'2017-08-07T16:44:52.123+0130'`},