func (s *BaseSession) GetAll() map[string]TypedValue {
	m := make(map[string]TypedValue)
	s.mu.RLock()
	defer s.mu.RUnlock()
	for k, v := range s.config {
		m[k] = v
	}
	return m
}
GetAll returns a copy of session configuration
package sql
import (
	"context"
	"fmt"
	"io"
	"math"
	"sync"
	"time"
	opentracing "github.com/opentracing/opentracing-go"
	"github.com/opentracing/opentracing-go/log"
)
type key uint
const (
	QueryKey key = iota
)
type Client struct {
	User string
	Address string
}
type Session interface {
	Address() string
	Client() Client
	Set(key string, typ Type, value interface{})
	Get(key string) (Type, interface{})
	GetAll() map[string]TypedValue
	ID() uint32
	Warn(warn *Warning)
	Warnings() []*Warning
	ClearWarnings()
	WarningCount() uint16
}
type BaseSession struct {
	id       uint32
	addr     string
	client   Client
	mu       sync.RWMutex
	config   map[string]TypedValue
	warnings []*Warning
	warncnt  uint16
}
func (s *BaseSession) Address() string { return s.addr }
func (s *BaseSession) Client() Client { return s.client }
func (s *BaseSession) Set(key string, typ Type, value interface{}) {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.config[key] = TypedValue{typ, value}
}
func (s *BaseSession) Get(key string) (Type, interface{}) {
	s.mu.RLock()
	defer s.mu.RUnlock()
	v, ok := s.config[key]
	if !ok {
		return Null, nil
	}
	return v.Typ, v.Value
}