feat(resolvemcp): read/write limits, preload validation, query timeout, stable client error codes

Config gains DefaultLimit/MaxLimit/MaxOffset/MaxBatch/MaxPreloadDepth/MaxWriteRows/QueryTimeout/
ConfirmTTL. Reads are capped and the total COUNT is optional. Errors reach clients as
{code,message}; everything else is logged with a reference. Panics (handler and hooks) are
recovered without returning the panic value.
This commit is contained in:
Hein
2026-10-01 13:35:00 +02:00
parent 82f901a49c
commit 276c3814d8
8 changed files with 414 additions and 36 deletions
+3 -4
View File
@@ -1,7 +1,6 @@
package resolvemcp
import (
"fmt"
"reflect"
"sort"
"strings"
@@ -23,7 +22,7 @@ func writeColumns(model interface{}, data map[string]interface{}) (map[string]in
modelType = modelType.Elem()
}
if modelType == nil || modelType.Kind() != reflect.Struct {
return nil, fmt.Errorf("invalid model")
return nil, errInternal
}
accepted := make(map[string]string)
@@ -44,13 +43,13 @@ func writeColumns(model interface{}, data map[string]interface{}) (map[string]in
continue
}
if _, dup := out[col]; dup {
return nil, fmt.Errorf("column %q given more than once", col)
return nil, invalidArg("column %q given more than once", col)
}
out[col] = value
}
if len(unknown) > 0 {
sort.Strings(unknown)
return nil, fmt.Errorf("unknown or read-only fields: %s", strings.Join(unknown, ", "))
return nil, invalidArg("unknown or read-only fields: %s", strings.Join(unknown, ", "))
}
return out, nil
}