github.com/RevenueMonster/sqlike@v1.0.6/sql/stmt/builder.go (about)

     1  package sqlstmt
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	"reflect"
     8  
     9  	"github.com/RevenueMonster/sqlike/reflext"
    10  )
    11  
    12  // BuildStatementFunc :
    13  type BuildStatementFunc func(stmt Stmt, it interface{}) error
    14  
    15  // StatementBuilder :
    16  type StatementBuilder struct {
    17  	mutex    *sync.Mutex
    18  	builders map[interface{}]BuildStatementFunc
    19  }
    20  
    21  // NewStatementBuilder :
    22  func NewStatementBuilder() *StatementBuilder {
    23  	return &StatementBuilder{
    24  		mutex:    new(sync.Mutex),
    25  		builders: make(map[interface{}]BuildStatementFunc),
    26  	}
    27  }
    28  
    29  // SetBuilder :
    30  func (sb *StatementBuilder) SetBuilder(it interface{}, p BuildStatementFunc) {
    31  	sb.mutex.Lock()
    32  	defer sb.mutex.Unlock()
    33  	sb.builders[it] = p
    34  }
    35  
    36  // LookupBuilder :
    37  func (sb *StatementBuilder) LookupBuilder(t reflect.Type) (blr BuildStatementFunc, ok bool) {
    38  	blr, ok = sb.builders[t]
    39  	return
    40  }
    41  
    42  // BuildStatement :
    43  func (sb *StatementBuilder) BuildStatement(stmt Stmt, it interface{}) error {
    44  	v := reflext.ValueOf(it)
    45  	if x, ok := sb.builders[v.Type()]; ok {
    46  		return x(stmt, it)
    47  	}
    48  	if x, ok := sb.builders[v.Kind()]; ok {
    49  		return x(stmt, it)
    50  	}
    51  
    52  	return fmt.Errorf("sqlstmt: invalid data type support %v", v.Type())
    53  }