@@ -48,7 +48,10 @@ import (
48
48
// chars found in table or column name.
49
49
var ErrInvalidMsg = errors .New ("invalid message" )
50
50
51
- const fsFileNameLimit = 127
51
+ const (
52
+ defaultBufferCapacity = 128 * 1024
53
+ defaultFileNameLimit = 127
54
+ )
52
55
53
56
type tlsMode int64
54
57
@@ -64,18 +67,19 @@ const (
64
67
// Each sender corresponds to a single TCP connection. A sender
65
68
// should not be called concurrently by multiple goroutines.
66
69
type LineSender struct {
67
- address string
68
- tlsMode tlsMode
69
- keyId string // Erased once auth is done.
70
- key string // Erased once auth is done.
71
- bufCap int
72
- conn net.Conn
73
- buf * buffer
74
- lastMsgPos int
75
- lastErr error
76
- hasTable bool
77
- hasTags bool
78
- hasFields bool
70
+ address string
71
+ tlsMode tlsMode
72
+ keyId string // Erased once auth is done.
73
+ key string // Erased once auth is done.
74
+ bufCap int
75
+ fileNameLimit int
76
+ conn net.Conn
77
+ buf * buffer
78
+ lastMsgPos int
79
+ lastErr error
80
+ hasTable bool
81
+ hasTags bool
82
+ hasFields bool
79
83
}
80
84
81
85
// LineSenderOption defines line sender option.
@@ -128,6 +132,18 @@ func WithBufferCapacity(capacity int) LineSenderOption {
128
132
}
129
133
}
130
134
135
+ // WithFileNameLimit sets maximum file name length in chars
136
+ // allowed by the server. Affects maximum table and column name
137
+ // lengths accepted by the sender. Should be set to the same value
138
+ // as on the server. Defaults to 127.
139
+ func WithFileNameLimit (limit int ) LineSenderOption {
140
+ return func (s * LineSender ) {
141
+ if limit > 0 {
142
+ s .fileNameLimit = limit
143
+ }
144
+ }
145
+ }
146
+
131
147
// NewLineSender creates new InfluxDB Line Protocol (ILP) sender. Each
132
148
// sender corresponds to a single TCP connection. Sender should
133
149
// not be called concurrently by multiple goroutines.
@@ -140,9 +156,10 @@ func NewLineSender(ctx context.Context, opts ...LineSenderOption) (*LineSender,
140
156
)
141
157
142
158
s := & LineSender {
143
- address : "127.0.0.1:9009" ,
144
- bufCap : 128 * 1024 ,
145
- tlsMode : noTls ,
159
+ address : "127.0.0.1:9009" ,
160
+ bufCap : defaultBufferCapacity ,
161
+ fileNameLimit : defaultFileNameLimit ,
162
+ tlsMode : noTls ,
146
163
}
147
164
for _ , opt := range opts {
148
165
opt (s )
@@ -379,8 +396,8 @@ func (s *LineSender) writeTableName(str string) error {
379
396
}
380
397
// We use string length in bytes as an approximation. That's to
381
398
// avoid calculating the number of runes.
382
- if len (str ) > fsFileNameLimit {
383
- return fmt .Errorf ("table name length is too large : %w" , ErrInvalidMsg )
399
+ if len (str ) > s . fileNameLimit {
400
+ return fmt .Errorf ("table name length exceeds the limit : %w" , ErrInvalidMsg )
384
401
}
385
402
// Since we're interested in ASCII chars, it's fine to iterate
386
403
// through bytes instead of runes.
@@ -479,8 +496,8 @@ func (s *LineSender) writeColumnName(str string) error {
479
496
}
480
497
// We use string length in bytes as an approximation. That's to
481
498
// avoid calculating the number of runes.
482
- if len (str ) > fsFileNameLimit {
483
- return fmt .Errorf ("column name length is too large : %w" , ErrInvalidMsg )
499
+ if len (str ) > s . fileNameLimit {
500
+ return fmt .Errorf ("column name length exceeds the limit : %w" , ErrInvalidMsg )
484
501
}
485
502
// Since we're interested in ASCII chars, it's fine to iterate
486
503
// through bytes instead of runes.
0 commit comments