Source file src/pkg/database/sql/sql.go
1
2
3
4
5
6
7
8
9
10 package sql
11
12 import (
13 "database/sql/driver"
14 "errors"
15 "fmt"
16 "io"
17 "runtime"
18 "sync"
19 )
20
21 var drivers = make(map[string]driver.Driver)
22
23
24
25
26 func Register(name string, driver driver.Driver) {
27 if driver == nil {
28 panic("sql: Register driver is nil")
29 }
30 if _, dup := drivers[name]; dup {
31 panic("sql: Register called twice for driver " + name)
32 }
33 drivers[name] = driver
34 }
35
36
37
38
39 type RawBytes []byte
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 type NullString struct {
55 String string
56 Valid bool
57 }
58
59
60 func (ns *NullString) Scan(value interface{}) error {
61 if value == nil {
62 ns.String, ns.Valid = "", false
63 return nil
64 }
65 ns.Valid = true
66 return convertAssign(&ns.String, value)
67 }
68
69
70 func (ns NullString) Value() (driver.Value, error) {
71 if !ns.Valid {
72 return nil, nil
73 }
74 return ns.String, nil
75 }
76
77
78
79
80 type NullInt64 struct {
81 Int64 int64
82 Valid bool
83 }
84
85
86 func (n *NullInt64) Scan(value interface{}) error {
87 if value == nil {
88 n.Int64, n.Valid = 0, false
89 return nil
90 }
91 n.Valid = true
92 return convertAssign(&n.Int64, value)
93 }
94
95
96 func (n NullInt64) Value() (driver.Value, error) {
97 if !n.Valid {
98 return nil, nil
99 }
100 return n.Int64, nil
101 }
102
103
104
105
106 type NullFloat64 struct {
107 Float64 float64
108 Valid bool
109 }
110
111
112 func (n *NullFloat64) Scan(value interface{}) error {
113 if value == nil {
114 n.Float64, n.Valid = 0, false
115 return nil
116 }
117 n.Valid = true
118 return convertAssign(&n.Float64, value)
119 }
120
121
122 func (n NullFloat64) Value() (driver.Value, error) {
123 if !n.Valid {
124 return nil, nil
125 }
126 return n.Float64, nil
127 }
128
129
130
131
132 type NullBool struct {
133 Bool bool
134 Valid bool
135 }
136
137
138 func (n *NullBool) Scan(value interface{}) error {
139 if value == nil {
140 n.Bool, n.Valid = false, false
141 return nil
142 }
143 n.Valid = true
144 return convertAssign(&n.Bool, value)
145 }
146
147
148 func (n NullBool) Value() (driver.Value, error) {
149 if !n.Valid {
150 return nil, nil
151 }
152 return n.Bool, nil
153 }
154
155
156 type Scanner interface {
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172 Scan(src interface{}) error
173 }
174
175
176
177
178 var ErrNoRows = errors.New("sql: no rows in result set")
179
180
181
182
183
184
185
186
187
188
189
190
191 type DB struct {
192 driver driver.Driver
193 dsn string
194
195 mu sync.Mutex
196 freeConn []*driverConn
197 closed bool
198 dep map[finalCloser]depSet
199 lastPut map[*driverConn]string
200 maxIdle int
201 }
202
203
204
205
206
207 type driverConn struct {
208 db *DB
209
210 sync.Mutex
211 ci driver.Conn
212 closed bool
213 finalClosed bool
214 openStmt map[driver.Stmt]bool
215
216
217 inUse bool
218 onPut []func()
219 dbmuClosed bool
220 }
221
222 func (dc *driverConn) removeOpenStmt(si driver.Stmt) {
223 dc.Lock()
224 defer dc.Unlock()
225 delete(dc.openStmt, si)
226 }
227
228 func (dc *driverConn) prepareLocked(query string) (driver.Stmt, error) {
229 si, err := dc.ci.Prepare(query)
230 if err == nil {
231
232
233
234
235
236
237
238
239
240
241
242
243
244 if dc.openStmt == nil {
245 dc.openStmt = make(map[driver.Stmt]bool)
246 }
247 dc.openStmt[si] = true
248 }
249 return si, err
250 }
251
252
253 func (dc *driverConn) closeDBLocked() error {
254 dc.Lock()
255 if dc.closed {
256 dc.Unlock()
257 return errors.New("sql: duplicate driverConn close")
258 }
259 dc.closed = true
260 dc.Unlock()
261 return dc.db.removeDepLocked(dc, dc)()
262 }
263
264 func (dc *driverConn) Close() error {
265 dc.Lock()
266 if dc.closed {
267 dc.Unlock()
268 return errors.New("sql: duplicate driverConn close")
269 }
270 dc.closed = true
271 dc.Unlock()
272
273
274 dc.db.mu.Lock()
275 dc.dbmuClosed = true
276 fn := dc.db.removeDepLocked(dc, dc)
277 dc.db.mu.Unlock()
278 return fn()
279 }
280
281 func (dc *driverConn) finalClose() error {
282 dc.Lock()
283
284 for si := range dc.openStmt {
285 si.Close()
286 }
287 dc.openStmt = nil
288
289 err := dc.ci.Close()
290 dc.ci = nil
291 dc.finalClosed = true
292
293 dc.Unlock()
294 return err
295 }
296
297
298
299
300 type driverStmt struct {
301 sync.Locker
302 si driver.Stmt
303 }
304
305 func (ds *driverStmt) Close() error {
306 ds.Lock()
307 defer ds.Unlock()
308 return ds.si.Close()
309 }
310
311
312 type depSet map[interface{}]bool
313
314
315
316 type finalCloser interface {
317
318
319 finalClose() error
320 }
321
322
323
324 func (db *DB) addDep(x finalCloser, dep interface{}) {
325
326 db.mu.Lock()
327 defer db.mu.Unlock()
328 db.addDepLocked(x, dep)
329 }
330
331 func (db *DB) addDepLocked(x finalCloser, dep interface{}) {
332 if db.dep == nil {
333 db.dep = make(map[finalCloser]depSet)
334 }
335 xdep := db.dep[x]
336 if xdep == nil {
337 xdep = make(depSet)
338 db.dep[x] = xdep
339 }
340 xdep[dep] = true
341 }
342
343
344
345
346
347 func (db *DB) removeDep(x finalCloser, dep interface{}) error {
348 db.mu.Lock()
349 fn := db.removeDepLocked(x, dep)
350 db.mu.Unlock()
351 return fn()
352 }
353
354 func (db *DB) removeDepLocked(x finalCloser, dep interface{}) func() error {
355
356 done := false
357
358 xdep := db.dep[x]
359 if xdep != nil {
360 delete(xdep, dep)
361 if len(xdep) == 0 {
362 delete(db.dep, x)
363 done = true
364 }
365 }
366
367 if !done {
368 return func() error { return nil }
369 }
370 return func() error {
371
372 return x.finalClose()
373 }
374 }
375
376
377
378
379
380
381
382
383
384
385
386
387
388 func Open(driverName, dataSourceName string) (*DB, error) {
389 driveri, ok := drivers[driverName]
390 if !ok {
391 return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
392 }
393 db := &DB{
394 driver: driveri,
395 dsn: dataSourceName,
396 lastPut: make(map[*driverConn]string),
397 }
398 return db, nil
399 }
400
401
402
403 func (db *DB) Ping() error {
404
405
406
407 dc, err := db.conn()
408 if err != nil {
409 return err
410 }
411 db.putConn(dc, nil)
412 return nil
413 }
414
415
416 func (db *DB) Close() error {
417 db.mu.Lock()
418 defer db.mu.Unlock()
419 var err error
420 for _, dc := range db.freeConn {
421 err1 := dc.closeDBLocked()
422 if err1 != nil {
423 err = err1
424 }
425 }
426 db.freeConn = nil
427 db.closed = true
428 return err
429 }
430
431 const defaultMaxIdleConns = 2
432
433 func (db *DB) maxIdleConnsLocked() int {
434 n := db.maxIdle
435 switch {
436 case n == 0:
437
438 return defaultMaxIdleConns
439 case n < 0:
440 return 0
441 default:
442 return n
443 }
444 }
445
446
447
448
449
450 func (db *DB) SetMaxIdleConns(n int) {
451 db.mu.Lock()
452 defer db.mu.Unlock()
453 if n > 0 {
454 db.maxIdle = n
455 } else {
456
457 db.maxIdle = -1
458 }
459 for len(db.freeConn) > 0 && len(db.freeConn) > n {
460 nfree := len(db.freeConn)
461 dc := db.freeConn[nfree-1]
462 db.freeConn[nfree-1] = nil
463 db.freeConn = db.freeConn[:nfree-1]
464 go dc.Close()
465 }
466 }
467
468
469 func (db *DB) conn() (*driverConn, error) {
470 db.mu.Lock()
471 if db.closed {
472 db.mu.Unlock()
473 return nil, errors.New("sql: database is closed")
474 }
475 if n := len(db.freeConn); n > 0 {
476 conn := db.freeConn[n-1]
477 db.freeConn = db.freeConn[:n-1]
478 conn.inUse = true
479 db.mu.Unlock()
480 return conn, nil
481 }
482 db.mu.Unlock()
483
484 ci, err := db.driver.Open(db.dsn)
485 if err != nil {
486 return nil, err
487 }
488 dc := &driverConn{
489 db: db,
490 ci: ci,
491 }
492 db.mu.Lock()
493 db.addDepLocked(dc, dc)
494 dc.inUse = true
495 db.mu.Unlock()
496 return dc, nil
497 }
498
499 var (
500 errConnClosed = errors.New("database/sql: internal sentinel error: conn is closed")
501 errConnBusy = errors.New("database/sql: internal sentinel error: conn is busy")
502 )
503
504
505
506
507
508
509
510
511 func (db *DB) connIfFree(wanted *driverConn) (*driverConn, error) {
512 db.mu.Lock()
513 defer db.mu.Unlock()
514 if wanted.inUse {
515 return nil, errConnBusy
516 }
517 if wanted.dbmuClosed {
518 return nil, errConnClosed
519 }
520 for i, conn := range db.freeConn {
521 if conn != wanted {
522 continue
523 }
524 db.freeConn[i] = db.freeConn[len(db.freeConn)-1]
525 db.freeConn = db.freeConn[:len(db.freeConn)-1]
526 wanted.inUse = true
527 return wanted, nil
528 }
529
530
531
532
533
534 return nil, errConnBusy
535 }
536
537
538 var putConnHook func(*DB, *driverConn)
539
540
541
542
543 func (db *DB) noteUnusedDriverStatement(c *driverConn, si driver.Stmt) {
544 db.mu.Lock()
545 defer db.mu.Unlock()
546 if c.inUse {
547 c.onPut = append(c.onPut, func() {
548 si.Close()
549 })
550 } else {
551 c.Lock()
552 defer c.Unlock()
553 if !c.finalClosed {
554 si.Close()
555 }
556 }
557 }
558
559
560
561 const debugGetPut = false
562
563
564
565 func (db *DB) putConn(dc *driverConn, err error) {
566 db.mu.Lock()
567 if !dc.inUse {
568 if debugGetPut {
569 fmt.Printf("putConn(%v) DUPLICATE was: %s\n\nPREVIOUS was: %s", dc, stack(), db.lastPut[dc])
570 }
571 panic("sql: connection returned that was never out")
572 }
573 if debugGetPut {
574 db.lastPut[dc] = stack()
575 }
576 dc.inUse = false
577
578 for _, fn := range dc.onPut {
579 fn()
580 }
581 dc.onPut = nil
582
583 if err == driver.ErrBadConn {
584
585 db.mu.Unlock()
586 return
587 }
588 if putConnHook != nil {
589 putConnHook(db, dc)
590 }
591 if n := len(db.freeConn); !db.closed && n < db.maxIdleConnsLocked() {
592 db.freeConn = append(db.freeConn, dc)
593 db.mu.Unlock()
594 return
595 }
596 db.mu.Unlock()
597
598 dc.Close()
599 }
600
601
602
603
604 func (db *DB) Prepare(query string) (*Stmt, error) {
605 var stmt *Stmt
606 var err error
607 for i := 0; i < 10; i++ {
608 stmt, err = db.prepare(query)
609 if err != driver.ErrBadConn {
610 break
611 }
612 }
613 return stmt, err
614 }
615
616 func (db *DB) prepare(query string) (*Stmt, error) {
617
618
619
620
621
622
623 dc, err := db.conn()
624 if err != nil {
625 return nil, err
626 }
627 dc.Lock()
628 si, err := dc.prepareLocked(query)
629 dc.Unlock()
630 if err != nil {
631 db.putConn(dc, err)
632 return nil, err
633 }
634 stmt := &Stmt{
635 db: db,
636 query: query,
637 css: []connStmt{{dc, si}},
638 }
639 db.addDep(stmt, stmt)
640 db.putConn(dc, nil)
641 return stmt, nil
642 }
643
644
645
646 func (db *DB) Exec(query string, args ...interface{}) (Result, error) {
647 var res Result
648 var err error
649 for i := 0; i < 10; i++ {
650 res, err = db.exec(query, args)
651 if err != driver.ErrBadConn {
652 break
653 }
654 }
655 return res, err
656 }
657
658 func (db *DB) exec(query string, args []interface{}) (res Result, err error) {
659 dc, err := db.conn()
660 if err != nil {
661 return nil, err
662 }
663 defer func() {
664 db.putConn(dc, err)
665 }()
666
667 if execer, ok := dc.ci.(driver.Execer); ok {
668 dargs, err := driverArgs(nil, args)
669 if err != nil {
670 return nil, err
671 }
672 dc.Lock()
673 resi, err := execer.Exec(query, dargs)
674 dc.Unlock()
675 if err != driver.ErrSkip {
676 if err != nil {
677 return nil, err
678 }
679 return driverResult{dc, resi}, nil
680 }
681 }
682
683 dc.Lock()
684 si, err := dc.ci.Prepare(query)
685 dc.Unlock()
686 if err != nil {
687 return nil, err
688 }
689 defer withLock(dc, func() { si.Close() })
690 return resultFromStatement(driverStmt{dc, si}, args...)
691 }
692
693
694
695 func (db *DB) Query(query string, args ...interface{}) (*Rows, error) {
696 var rows *Rows
697 var err error
698 for i := 0; i < 10; i++ {
699 rows, err = db.query(query, args)
700 if err != driver.ErrBadConn {
701 break
702 }
703 }
704 return rows, err
705 }
706
707 func (db *DB) query(query string, args []interface{}) (*Rows, error) {
708 ci, err := db.conn()
709 if err != nil {
710 return nil, err
711 }
712
713 releaseConn := func(err error) { db.putConn(ci, err) }
714
715 return db.queryConn(ci, releaseConn, query, args)
716 }
717
718
719
720 func (db *DB) queryConn(dc *driverConn, releaseConn func(error), query string, args []interface{}) (*Rows, error) {
721 if queryer, ok := dc.ci.(driver.Queryer); ok {
722 dargs, err := driverArgs(nil, args)
723 if err != nil {
724 releaseConn(err)
725 return nil, err
726 }
727 dc.Lock()
728 rowsi, err := queryer.Query(query, dargs)
729 dc.Unlock()
730 if err != driver.ErrSkip {
731 if err != nil {
732 releaseConn(err)
733 return nil, err
734 }
735
736
737 rows := &Rows{
738 dc: dc,
739 releaseConn: releaseConn,
740 rowsi: rowsi,
741 }
742 return rows, nil
743 }
744 }
745
746 dc.Lock()
747 si, err := dc.ci.Prepare(query)
748 dc.Unlock()
749 if err != nil {
750 releaseConn(err)
751 return nil, err
752 }
753
754 ds := driverStmt{dc, si}
755 rowsi, err := rowsiFromStatement(ds, args...)
756 if err != nil {
757 releaseConn(err)
758 dc.Lock()
759 si.Close()
760 dc.Unlock()
761 return nil, err
762 }
763
764
765
766 rows := &Rows{
767 dc: dc,
768 releaseConn: releaseConn,
769 rowsi: rowsi,
770 closeStmt: si,
771 }
772 return rows, nil
773 }
774
775
776
777
778 func (db *DB) QueryRow(query string, args ...interface{}) *Row {
779 rows, err := db.Query(query, args...)
780 return &Row{rows: rows, err: err}
781 }
782
783
784
785 func (db *DB) Begin() (*Tx, error) {
786 var tx *Tx
787 var err error
788 for i := 0; i < 10; i++ {
789 tx, err = db.begin()
790 if err != driver.ErrBadConn {
791 break
792 }
793 }
794 return tx, err
795 }
796
797 func (db *DB) begin() (tx *Tx, err error) {
798 dc, err := db.conn()
799 if err != nil {
800 return nil, err
801 }
802 dc.Lock()
803 txi, err := dc.ci.Begin()
804 dc.Unlock()
805 if err != nil {
806 db.putConn(dc, err)
807 return nil, err
808 }
809 return &Tx{
810 db: db,
811 dc: dc,
812 txi: txi,
813 }, nil
814 }
815
816
817 func (db *DB) Driver() driver.Driver {
818 return db.driver
819 }
820
821
822
823
824
825
826
827 type Tx struct {
828 db *DB
829
830
831
832 dc *driverConn
833 txi driver.Tx
834
835
836
837
838 done bool
839 }
840
841 var ErrTxDone = errors.New("sql: Transaction has already been committed or rolled back")
842
843 func (tx *Tx) close() {
844 if tx.done {
845 panic("double close")
846 }
847 tx.done = true
848 tx.db.putConn(tx.dc, nil)
849 tx.dc = nil
850 tx.txi = nil
851 }
852
853 func (tx *Tx) grabConn() (*driverConn, error) {
854 if tx.done {
855 return nil, ErrTxDone
856 }
857 return tx.dc, nil
858 }
859
860
861 func (tx *Tx) Commit() error {
862 if tx.done {
863 return ErrTxDone
864 }
865 defer tx.close()
866 tx.dc.Lock()
867 defer tx.dc.Unlock()
868 return tx.txi.Commit()
869 }
870
871
872 func (tx *Tx) Rollback() error {
873 if tx.done {
874 return ErrTxDone
875 }
876 defer tx.close()
877 tx.dc.Lock()
878 defer tx.dc.Unlock()
879 return tx.txi.Rollback()
880 }
881
882
883
884
885
886
887
888 func (tx *Tx) Prepare(query string) (*Stmt, error) {
889
890
891
892
893
894
895
896
897
898
899
900
901
902 dc, err := tx.grabConn()
903 if err != nil {
904 return nil, err
905 }
906
907 dc.Lock()
908 si, err := dc.ci.Prepare(query)
909 dc.Unlock()
910 if err != nil {
911 return nil, err
912 }
913
914 stmt := &Stmt{
915 db: tx.db,
916 tx: tx,
917 txsi: &driverStmt{
918 Locker: dc,
919 si: si,
920 },
921 query: query,
922 }
923 return stmt, nil
924 }
925
926
927
928
929
930
931
932
933
934
935 func (tx *Tx) Stmt(stmt *Stmt) *Stmt {
936
937
938
939
940
941 if tx.db != stmt.db {
942 return &Stmt{stickyErr: errors.New("sql: Tx.Stmt: statement from different database used")}
943 }
944 dc, err := tx.grabConn()
945 if err != nil {
946 return &Stmt{stickyErr: err}
947 }
948 dc.Lock()
949 si, err := dc.ci.Prepare(stmt.query)
950 dc.Unlock()
951 return &Stmt{
952 db: tx.db,
953 tx: tx,
954 txsi: &driverStmt{
955 Locker: dc,
956 si: si,
957 },
958 query: stmt.query,
959 stickyErr: err,
960 }
961 }
962
963
964
965 func (tx *Tx) Exec(query string, args ...interface{}) (Result, error) {
966 dc, err := tx.grabConn()
967 if err != nil {
968 return nil, err
969 }
970
971 if execer, ok := dc.ci.(driver.Execer); ok {
972 dargs, err := driverArgs(nil, args)
973 if err != nil {
974 return nil, err
975 }
976 dc.Lock()
977 resi, err := execer.Exec(query, dargs)
978 dc.Unlock()
979 if err == nil {
980 return driverResult{dc, resi}, nil
981 }
982 if err != driver.ErrSkip {
983 return nil, err
984 }
985 }
986
987 dc.Lock()
988 si, err := dc.ci.Prepare(query)
989 dc.Unlock()
990 if err != nil {
991 return nil, err
992 }
993 defer withLock(dc, func() { si.Close() })
994
995 return resultFromStatement(driverStmt{dc, si}, args...)
996 }
997
998
999 func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error) {
1000 dc, err := tx.grabConn()
1001 if err != nil {
1002 return nil, err
1003 }
1004 releaseConn := func(error) {}
1005 return tx.db.queryConn(dc, releaseConn, query, args)
1006 }
1007
1008
1009
1010
1011 func (tx *Tx) QueryRow(query string, args ...interface{}) *Row {
1012 rows, err := tx.Query(query, args...)
1013 return &Row{rows: rows, err: err}
1014 }
1015
1016
1017 type connStmt struct {
1018 dc *driverConn
1019 si driver.Stmt
1020 }
1021
1022
1023 type Stmt struct {
1024
1025 db *DB
1026 query string
1027 stickyErr error
1028
1029 closemu sync.RWMutex
1030
1031
1032 tx *Tx
1033 txsi *driverStmt
1034
1035 mu sync.Mutex
1036 closed bool
1037
1038
1039
1040
1041
1042 css []connStmt
1043 }
1044
1045
1046
1047 func (s *Stmt) Exec(args ...interface{}) (Result, error) {
1048 s.closemu.RLock()
1049 defer s.closemu.RUnlock()
1050 dc, releaseConn, si, err := s.connStmt()
1051 if err != nil {
1052 return nil, err
1053 }
1054 defer releaseConn(nil)
1055
1056 return resultFromStatement(driverStmt{dc, si}, args...)
1057 }
1058
1059 func resultFromStatement(ds driverStmt, args ...interface{}) (Result, error) {
1060 ds.Lock()
1061 want := ds.si.NumInput()
1062 ds.Unlock()
1063
1064
1065
1066
1067 if want != -1 && len(args) != want {
1068 return nil, fmt.Errorf("sql: expected %d arguments, got %d", want, len(args))
1069 }
1070
1071 dargs, err := driverArgs(&ds, args)
1072 if err != nil {
1073 return nil, err
1074 }
1075
1076 ds.Lock()
1077 resi, err := ds.si.Exec(dargs)
1078 ds.Unlock()
1079 if err != nil {
1080 return nil, err
1081 }
1082 return driverResult{ds.Locker, resi}, nil
1083 }
1084
1085
1086
1087
1088 func (s *Stmt) connStmt() (ci *driverConn, releaseConn func(error), si driver.Stmt, err error) {
1089 if err = s.stickyErr; err != nil {
1090 return
1091 }
1092 s.mu.Lock()
1093 if s.closed {
1094 s.mu.Unlock()
1095 err = errors.New("sql: statement is closed")
1096 return
1097 }
1098
1099
1100
1101 if s.tx != nil {
1102 s.mu.Unlock()
1103 ci, err = s.tx.grabConn()
1104 if err != nil {
1105 return
1106 }
1107 releaseConn = func(error) {}
1108 return ci, releaseConn, s.txsi.si, nil
1109 }
1110
1111 var cs connStmt
1112 match := false
1113 for i := 0; i < len(s.css); i++ {
1114 v := s.css[i]
1115 _, err := s.db.connIfFree(v.dc)
1116 if err == nil {
1117 match = true
1118 cs = v
1119 break
1120 }
1121 if err == errConnClosed {
1122
1123 s.css[i] = s.css[len(s.css)-1]
1124 s.css = s.css[:len(s.css)-1]
1125 i--
1126 }
1127
1128 }
1129 s.mu.Unlock()
1130
1131
1132
1133 if !match {
1134 for i := 0; ; i++ {
1135 dc, err := s.db.conn()
1136 if err != nil {
1137 return nil, nil, nil, err
1138 }
1139 dc.Lock()
1140 si, err := dc.prepareLocked(s.query)
1141 dc.Unlock()
1142 if err == driver.ErrBadConn && i < 10 {
1143 continue
1144 }
1145 if err != nil {
1146 return nil, nil, nil, err
1147 }
1148 s.mu.Lock()
1149 cs = connStmt{dc, si}
1150 s.css = append(s.css, cs)
1151 s.mu.Unlock()
1152 break
1153 }
1154 }
1155
1156 conn := cs.dc
1157 releaseConn = func(err error) { s.db.putConn(conn, err) }
1158 return conn, releaseConn, cs.si, nil
1159 }
1160
1161
1162
1163 func (s *Stmt) Query(args ...interface{}) (*Rows, error) {
1164 s.closemu.RLock()
1165 defer s.closemu.RUnlock()
1166
1167 dc, releaseConn, si, err := s.connStmt()
1168 if err != nil {
1169 return nil, err
1170 }
1171
1172 ds := driverStmt{dc, si}
1173 rowsi, err := rowsiFromStatement(ds, args...)
1174 if err != nil {
1175 releaseConn(err)
1176 return nil, err
1177 }
1178
1179
1180
1181 rows := &Rows{
1182 dc: dc,
1183 rowsi: rowsi,
1184
1185 }
1186 s.db.addDep(s, rows)
1187 rows.releaseConn = func(err error) {
1188 releaseConn(err)
1189 s.db.removeDep(s, rows)
1190 }
1191 return rows, nil
1192 }
1193
1194 func rowsiFromStatement(ds driverStmt, args ...interface{}) (driver.Rows, error) {
1195 ds.Lock()
1196 want := ds.si.NumInput()
1197 ds.Unlock()
1198
1199
1200
1201
1202 if want != -1 && len(args) != want {
1203 return nil, fmt.Errorf("sql: statement expects %d inputs; got %d", want, len(args))
1204 }
1205
1206 dargs, err := driverArgs(&ds, args)
1207 if err != nil {
1208 return nil, err
1209 }
1210
1211 ds.Lock()
1212 rowsi, err := ds.si.Query(dargs)
1213 ds.Unlock()
1214 if err != nil {
1215 return nil, err
1216 }
1217 return rowsi, nil
1218 }
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231 func (s *Stmt) QueryRow(args ...interface{}) *Row {
1232 rows, err := s.Query(args...)
1233 if err != nil {
1234 return &Row{err: err}
1235 }
1236 return &Row{rows: rows}
1237 }
1238
1239
1240 func (s *Stmt) Close() error {
1241 s.closemu.Lock()
1242 defer s.closemu.Unlock()
1243
1244 if s.stickyErr != nil {
1245 return s.stickyErr
1246 }
1247 s.mu.Lock()
1248 defer s.mu.Unlock()
1249 if s.closed {
1250 return nil
1251 }
1252 s.closed = true
1253
1254 if s.tx != nil {
1255 s.txsi.Close()
1256 return nil
1257 }
1258
1259 return s.db.removeDep(s, s)
1260 }
1261
1262 func (s *Stmt) finalClose() error {
1263 for _, v := range s.css {
1264 s.db.noteUnusedDriverStatement(v.dc, v.si)
1265 v.dc.removeOpenStmt(v.si)
1266 s.db.removeDep(v.dc, s)
1267 }
1268 s.css = nil
1269 return nil
1270 }
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285 type Rows struct {
1286 dc *driverConn
1287 releaseConn func(error)
1288 rowsi driver.Rows
1289
1290 closed bool
1291 lastcols []driver.Value
1292 lasterr error
1293 closeStmt driver.Stmt
1294 }
1295
1296
1297
1298
1299
1300 func (rs *Rows) Next() bool {
1301 if rs.closed {
1302 return false
1303 }
1304 if rs.lasterr != nil {
1305 return false
1306 }
1307 if rs.lastcols == nil {
1308 rs.lastcols = make([]driver.Value, len(rs.rowsi.Columns()))
1309 }
1310 rs.lasterr = rs.rowsi.Next(rs.lastcols)
1311 if rs.lasterr == io.EOF {
1312 rs.Close()
1313 }
1314 return rs.lasterr == nil
1315 }
1316
1317
1318 func (rs *Rows) Err() error {
1319 if rs.lasterr == io.EOF {
1320 return nil
1321 }
1322 return rs.lasterr
1323 }
1324
1325
1326
1327
1328 func (rs *Rows) Columns() ([]string, error) {
1329 if rs.closed {
1330 return nil, errors.New("sql: Rows are closed")
1331 }
1332 if rs.rowsi == nil {
1333 return nil, errors.New("sql: no Rows available")
1334 }
1335 return rs.rowsi.Columns(), nil
1336 }
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350 func (rs *Rows) Scan(dest ...interface{}) error {
1351 if rs.closed {
1352 return errors.New("sql: Rows closed")
1353 }
1354 if rs.lasterr != nil {
1355 return rs.lasterr
1356 }
1357 if rs.lastcols == nil {
1358 return errors.New("sql: Scan called without calling Next")
1359 }
1360 if len(dest) != len(rs.lastcols) {
1361 return fmt.Errorf("sql: expected %d destination arguments in Scan, not %d", len(rs.lastcols), len(dest))
1362 }
1363 for i, sv := range rs.lastcols {
1364 err := convertAssign(dest[i], sv)
1365 if err != nil {
1366 return fmt.Errorf("sql: Scan error on column index %d: %v", i, err)
1367 }
1368 }
1369 return nil
1370 }
1371
1372
1373
1374
1375 func (rs *Rows) Close() error {
1376 if rs.closed {
1377 return nil
1378 }
1379 rs.closed = true
1380 err := rs.rowsi.Close()
1381 if rs.closeStmt != nil {
1382 rs.closeStmt.Close()
1383 }
1384 rs.releaseConn(err)
1385 return err
1386 }
1387
1388
1389 type Row struct {
1390
1391 err error
1392 rows *Rows
1393 }
1394
1395
1396
1397
1398
1399 func (r *Row) Scan(dest ...interface{}) error {
1400 if r.err != nil {
1401 return r.err
1402 }
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417 for _, dp := range dest {
1418 if _, ok := dp.(*RawBytes); ok {
1419 return errors.New("sql: RawBytes isn't allowed on Row.Scan")
1420 }
1421 }
1422
1423 defer r.rows.Close()
1424 if !r.rows.Next() {
1425 return ErrNoRows
1426 }
1427 err := r.rows.Scan(dest...)
1428 if err != nil {
1429 return err
1430 }
1431
1432 return nil
1433 }
1434
1435
1436 type Result interface {
1437 LastInsertId() (int64, error)
1438 RowsAffected() (int64, error)
1439 }
1440
1441 type driverResult struct {
1442 sync.Locker
1443 resi driver.Result
1444 }
1445
1446 func (dr driverResult) LastInsertId() (int64, error) {
1447 dr.Lock()
1448 defer dr.Unlock()
1449 return dr.resi.LastInsertId()
1450 }
1451
1452 func (dr driverResult) RowsAffected() (int64, error) {
1453 dr.Lock()
1454 defer dr.Unlock()
1455 return dr.resi.RowsAffected()
1456 }
1457
1458 func stack() string {
1459 var buf [2 << 10]byte
1460 return string(buf[:runtime.Stack(buf[:], false)])
1461 }
1462
1463
1464 func withLock(lk sync.Locker, fn func()) {
1465 lk.Lock()
1466 fn()
1467 lk.Unlock()
1468 }
View as plain text