本文整理汇总了Golang中C.sqlite3_bind_parameter_count函数的典型用法代码示例。如果您正苦于以下问题:Golang sqlite3_bind_parameter_count函数的具体用法?Golang sqlite3_bind_parameter_count怎么用?Golang sqlite3_bind_parameter_count使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了sqlite3_bind_parameter_count函数的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: Exec
func (s *Stmt) Exec(args ...interface{}) error {
s.args = fmt.Sprintf(" %v", []interface{}(args))
rv := C.sqlite3_reset(s.stmt)
if rv != 0 {
return s.c.error(rv)
}
n := int(C.sqlite3_bind_parameter_count(s.stmt))
if n != len(args) {
return errors.New(fmt.Sprintf("incorrect argument count for Stmt.Exec: have %d want %d", len(args), n))
}
for i, v := range args {
var str string
switch v := v.(type) {
case []byte:
var p *byte
if len(v) > 0 {
p = &v[0]
}
if rv := C.my_bind_blob(s.stmt, C.int(i+1), unsafe.Pointer(p), C.int(len(v))); rv != 0 {
return s.c.error(rv)
}
continue
case nil:
if rv := C.sqlite3_bind_null(s.stmt, C.int(i+1)); rv != 0 {
return s.c.error(rv)
}
continue
case int:
if rv := C.sqlite3_bind_int(s.stmt, C.int(i+1), C.int(v)); rv != 0 {
return s.c.error(rv)
}
continue
case bool:
intVal := 0
if v {
intVal = 1
}
if rv := C.sqlite3_bind_int(s.stmt, C.int(i+1), C.int(intVal)); rv != 0 {
return s.c.error(rv)
}
continue
default:
str = fmt.Sprint(v)
}
cstr := C.CString(str)
rv := C.my_bind_text(s.stmt, C.int(i+1), cstr, C.int(len(str)))
C.free(unsafe.Pointer(cstr))
if rv != 0 {
return s.c.error(rv)
}
}
return nil
}
示例2: Prepare
// Prepare query string. Return a new statement.
func (c *SQLiteConn) Prepare(query string) (driver.Stmt, error) {
pquery := C.CString(query)
defer C.free(unsafe.Pointer(pquery))
var s *C.sqlite3_stmt
var tail *C.char
rv := C.sqlite3_prepare_v2(c.db, pquery, -1, &s, &tail)
if rv != C.SQLITE_OK {
return nil, c.lastError()
}
var t string
if tail != nil && *tail != '\000' {
t = strings.TrimSpace(C.GoString(tail))
}
nv := int(C.sqlite3_bind_parameter_count(s))
var nn []string
for i := 0; i < nv; i++ {
pn := C.GoString(C.sqlite3_bind_parameter_name(s, C.int(i+1)))
if len(pn) > 1 && pn[0] == '$' && 48 <= pn[1] && pn[1] <= 57 {
nn = append(nn, C.GoString(C.sqlite3_bind_parameter_name(s, C.int(i+1))))
}
}
ss := &SQLiteStmt{c: c, s: s, nv: nv, nn: nn, t: t}
runtime.SetFinalizer(ss, (*SQLiteStmt).Close)
return ss, nil
}
示例3: Exec
func (s *Stmt) Exec(args ...interface{}) error {
s.args = fmt.Sprintf(" %v", []interface{}(args))
rv := C.sqlite3_reset(s.stmt)
if rv != 0 {
return s.c.error(rv)
}
n := int(C.sqlite3_bind_parameter_count(s.stmt))
if n != len(args) {
return errors.New(fmt.Sprintf("incorrect argument count for Stmt.Exec: have %d want %d", len(args), n))
}
for i, v := range args {
var str string
var rv C.int
if v == nil {
rv = C.sqlite3_bind_null(s.stmt, C.int(i+1))
} else {
switch v := v.(type) {
case []byte:
var p *byte
if len(v) > 0 {
p = &v[0]
}
if rv := C.my_bind_blob(s.stmt, C.int(i+1), unsafe.Pointer(p), C.int(len(v))); rv != 0 {
return s.c.error(rv)
}
continue
case bool:
if v {
str = "1"
} else {
str = "0"
}
case time.Time:
str = v.In(time.UTC).Format(ISO8601)
case NullTime:
if v.Valid {
str = v.Time.Format(ISO8601)
} else {
if rv := C.sqlite3_bind_null(s.stmt, C.int(i+1)); rv != 0 {
return s.c.error(rv)
}
continue
}
default:
str = fmt.Sprint(v)
}
cstr := C.CString(str)
rv = C.my_bind_text(s.stmt, C.int(i+1), cstr, C.int(len(str)))
C.free(unsafe.Pointer(cstr))
}
if rv != 0 {
return s.c.error(rv)
}
}
return nil
}
示例4: newStmt
// newStmt creates a new prepared statement.
func newStmt(c *Conn, sql string) (*Stmt, error) {
zSql := sql + "\x00"
var stmt *C.sqlite3_stmt
var tail *C.char
rc := C.sqlite3_prepare_v2(c.db, cStr(zSql), -1, &stmt, &tail)
if rc != OK {
return nil, libErr(rc, c.db)
}
// stmt will be nil if sql contained only comments or whitespace. s.Tail may
// be useful to the caller, so s is still returned without an error.
s := &Stmt{conn: c, stmt: stmt}
if stmt != nil {
if s.nVars = int(C.sqlite3_bind_parameter_count(stmt)); s.nVars == 0 {
s.varNames = unnamedVars
}
s.nCols = int(C.sqlite3_column_count(stmt))
runtime.SetFinalizer(s, (*Stmt).Close)
}
if tail != nil {
if n := cStrOffset(zSql, tail); n < len(sql) {
sql, s.Tail = sql[:n], sql[n:]
}
}
s.text = sql
return s, nil
}
示例5: Exec
func (s *Stmt) Exec(args ...interface{}) os.Error {
var rv C.int
var str string
var cstr *C.char
if rv = C.sqlite3_reset(s.stmt); rv != 0 {
return s.c.error(rv)
}
if n := int(C.sqlite3_bind_parameter_count(s.stmt)); n != len(args) {
return os.NewError(fmt.Sprintf("incorrect argument count: have %d, want %d", len(args), n))
}
for i, v := range args {
switch v := v.(type) {
case []byte:
var p *byte
if len(v) > 0 {
p = &v[0]
}
if rv = C.my_bind_blob(s.stmt, C.int(i+1), unsafe.Pointer(p), C.int(len(v))); rv != 0 {
return s.c.error(rv)
}
continue
case bool:
if v {
str = "1"
} else {
str = "0"
}
default:
str = fmt.Sprint(v)
}
cstr = C.CString(str)
rv = C.my_bind_text(s.stmt, C.int(i+1), cstr, C.int(len(str)))
C.free(unsafe.Pointer(cstr))
if rv != 0 {
return s.c.error(rv)
}
}
return nil
}
示例6: ExecRange
// Passing multiple sql commands in a single command string requires some extra
// work to make it go. Sqlite normally executes only one expression and returns
// the remainder in the @tail parameter of sqlite3_prepare(). This sqlite binding
// does not take that into account. We need to loop and process @tail until it
// is empty. This also means taking care of any parameters we pass to Stmt.Exec.
// We need to ensure that we offset the supplied argument list after every
// execution.
func (c *Conn) ExecRange(cmd string, argv ...interface{}) (err os.Error) {
var tail *C.char
var rv C.int
var errno Errno
cmdlen := len(cmd) + 1
s := new(Stmt)
s.c = c
cmdstr := C.CString(strings.TrimSpace(cmd))
defer C.free(unsafe.Pointer(cmdstr))
for {
if rv = C.sqlite3_prepare_v2(c.db, cmdstr, C.int(cmdlen), &s.stmt, &tail); rv != 0 {
return c.error(rv)
}
if rv = C.sqlite3_bind_parameter_count(s.stmt); int(rv) > len(argv) {
return os.NewError(fmt.Sprintf("incorrect argument count: have %d, want %d", len(argv), rv))
}
if err = s.Exec(argv[0:rv]...); err != nil {
s.Finalize()
return
}
argv = argv[rv:]
if errno = Errno(C.sqlite3_step(s.stmt)); errno != Done {
s.Finalize()
return errno
}
s.Finalize()
if C.GoString(tail) == "" {
break
}
cmdstr = tail
cmdlen = len(C.GoString(cmdstr)) + 1
}
return
}
示例7: sqlBindParameterCount
func (self *sqlStatement) sqlBindParameterCount() int {
return int(C.sqlite3_bind_parameter_count(self.handle))
}
示例8: NumInput
// Return a number of parameters.
func (s *SQLiteStmt) NumInput() int {
return int(C.sqlite3_bind_parameter_count(s.s))
}
示例9: BindParameterCount
// BindParameterCount returns the number of SQL parameters.
// FIXME If parameters of the ?NNN form are used, there may be gaps in the list.
// (See http://sqlite.org/c3ref/bind_parameter_count.html)
func (s *Stmt) BindParameterCount() int {
if s.bindParameterCount == -1 {
s.bindParameterCount = int(C.sqlite3_bind_parameter_count(s.stmt))
}
return s.bindParameterCount
}
示例10: Parameters
func (s *Statement) Parameters() int {
return int(C.sqlite3_bind_parameter_count(s.cptr))
}
示例11: start
func (s *stmt) start(args []driver.Value) error {
if err := s.reset(); err != nil {
return err
}
n := int(C.sqlite3_bind_parameter_count(s.stmt))
if n != len(args) {
return fmt.Errorf("incorrect argument count for command: have %d want %d", len(args), n)
}
for i, v := range args {
var str string
switch v := v.(type) {
case nil:
if rv := C.sqlite3_bind_null(s.stmt, C.int(i+1)); rv != 0 {
return s.c.error(rv)
}
continue
case float64:
if rv := C.sqlite3_bind_double(s.stmt, C.int(i+1), C.double(v)); rv != 0 {
return s.c.error(rv)
}
continue
case int64:
if rv := C.sqlite3_bind_int64(s.stmt, C.int(i+1), C.sqlite3_int64(v)); rv != 0 {
return s.c.error(rv)
}
continue
case []byte:
var p *byte
if len(v) > 0 {
p = &v[0]
}
if rv := C.my_bind_blob(s.stmt, C.int(i+1), unsafe.Pointer(p), C.int(len(v))); rv != 0 {
return s.c.error(rv)
}
continue
case bool:
var vi int64
if v {
vi = 1
}
if rv := C.sqlite3_bind_int64(s.stmt, C.int(i+1), C.sqlite3_int64(vi)); rv != 0 {
return s.c.error(rv)
}
continue
case time.Time:
str = v.UTC().Format(timefmt[0])
case string:
str = v
default:
str = fmt.Sprint(v)
}
cstr := C.CString(str)
rv := C.my_bind_text(s.stmt, C.int(i+1), cstr, C.int(len(str)))
C.free(unsafe.Pointer(cstr))
if rv != 0 {
return s.c.error(rv)
}
}
return nil
}
示例12: NumInput
func (s *stmt) NumInput() int {
if s.closed {
panic("database/sql/driver: misuse of sqlite driver: NumInput after Close")
}
return int(C.sqlite3_bind_parameter_count(s.stmt))
}
示例13: NumInput
func (stmt Stmt) NumInput() int {
return int(C.sqlite3_bind_parameter_count(stmt.stmt))
}