@@ -121,6 +121,7 @@ type SQLiteTx struct {
121121type SQLiteStmt struct {
122122 c * SQLiteConn
123123 s * C.sqlite3_stmt
124+ nv int
124125 t string
125126 closed bool
126127 cls bool
@@ -368,7 +369,19 @@ func (c *SQLiteConn) Prepare(query string) (driver.Stmt, error) {
368369 if tail != nil && C .strlen (tail ) > 0 {
369370 t = strings .TrimSpace (C .GoString (tail ))
370371 }
371- ss := & SQLiteStmt {c : c , s : s , t : t }
372+ nv := int (C .sqlite3_bind_parameter_count (s ))
373+ if nv > 0 {
374+ pn := C .GoString (C .sqlite3_bind_parameter_name (s , 1 ))
375+ /* TODO: map argument for named parameters
376+ if len(pn) > 0 && pn[0] == '$' && pn[1] != '1' {
377+ nv = -1
378+ }
379+ */
380+ if len (pn ) > 0 && pn [0 ] != '?' {
381+ nv = - 1
382+ }
383+ }
384+ ss := & SQLiteStmt {c : c , s : s , nv : nv , t : t }
372385 runtime .SetFinalizer (ss , (* SQLiteStmt ).Close )
373386 return ss , nil
374387}
@@ -392,7 +405,12 @@ func (s *SQLiteStmt) Close() error {
392405
393406// Return a number of parameters.
394407func (s * SQLiteStmt ) NumInput () int {
395- return int (C .sqlite3_bind_parameter_count (s .s ))
408+ return s .nv
409+ }
410+
411+ type bindArg struct {
412+ n int
413+ v driver.Value
396414}
397415
398416func (s * SQLiteStmt ) bind (args []driver.Value ) error {
@@ -401,8 +419,43 @@ func (s *SQLiteStmt) bind(args []driver.Value) error {
401419 return s .c .lastError ()
402420 }
403421
404- for i , v := range args {
405- n := C .int (i + 1 )
422+ var vargs []bindArg
423+ narg := len (args )
424+ if s .nv == - 1 {
425+ /* TODO: map argument for named parameters
426+ if narg == 1 {
427+ if m, ok := args[0].(map[string]driver.Value); ok {
428+ for k, v := range m {
429+ pn := C.CString(k)
430+ if pi := int(C.sqlite3_bind_parameter_index(s.s, pn)); pi > 0 {
431+ println(pi)
432+ vargs = append(vargs, bindArg{pi, v})
433+ }
434+ C.free(unsafe.Pointer(pn))
435+ }
436+ }
437+ narg = 0
438+ }
439+ */
440+ if narg > 0 {
441+ for i := 0 ; i < narg ; i ++ {
442+ pn := C .CString (fmt .Sprint (i + 1 ))
443+ if pi := int (C .sqlite3_bind_parameter_index (s .s , pn )); pi > 0 {
444+ vargs = append (vargs , bindArg {pi , args [i ]})
445+ }
446+ C .free (unsafe .Pointer (pn ))
447+ }
448+ }
449+ } else {
450+ vargs = make ([]bindArg , narg )
451+ for i , v := range args {
452+ vargs [i ] = bindArg {i + 1 , v }
453+ }
454+ }
455+
456+ for _ , varg := range vargs {
457+ n := C .int (varg .n )
458+ v := varg .v
406459 switch v := v .(type ) {
407460 case nil :
408461 rv = C .sqlite3_bind_null (s .s , n )
0 commit comments