func (c *OCI8Conn) Prepare(query string) (driver.Stmt, error) { pquery := C.CString(query) defer C.free(unsafe.Pointer(pquery)) var s, bp, defp unsafe.Pointer if rv := C.WrapOCIHandleAlloc( c.env, C.OCI_HTYPE_STMT, (C.size_t)(unsafe.Sizeof(bp)*2)); rv.rv != C.OCI_SUCCESS { return nil, ociGetError(c.err) } else { s = rv.ptr bp = rv.extra defp = unsafe.Pointer(uintptr(rv.extra) + unsafe.Sizeof(unsafe.Pointer(nil))) } if rv := C.OCIStmtPrepare( (*C.OCIStmt)(s), (*C.OCIError)(c.err), (*C.OraText)(unsafe.Pointer(pquery)), C.ub4(C.strlen(pquery)), C.ub4(C.OCI_NTV_SYNTAX), C.ub4(C.OCI_DEFAULT)); rv != C.OCI_SUCCESS { return nil, ociGetError(c.err) } ss := &OCI8Stmt{c: c, s: s, bp: (**C.OCIBind)(bp), defp: (**C.OCIDefine)(defp)} runtime.SetFinalizer(ss, (*OCI8Stmt).Close) return ss, nil }
func (c *OCI8Conn) Begin() (driver.Tx, error) { if c.transactionMode != C.OCI_TRANS_READWRITE { var th unsafe.Pointer if rv := C.WrapOCIHandleAlloc( c.env, C.OCI_HTYPE_TRANS, 0); rv.rv != C.OCI_SUCCESS { return nil, errors.New("can't allocate handle") } else { th = rv.ptr } if rv := C.OCIAttrSet( c.svc, C.OCI_HTYPE_SVCCTX, th, 0, C.OCI_ATTR_TRANS, (*C.OCIError)(c.err)); rv != C.OCI_SUCCESS { return nil, ociGetError(c.err) } if rv := C.OCITransStart( (*C.OCISvcCtx)(c.svc), (*C.OCIError)(c.err), 0, c.transactionMode); // C.OCI_TRANS_SERIALIZABLE C.OCI_TRANS_READWRITE C.OCI_TRANS_READONLY rv != C.OCI_SUCCESS { return nil, ociGetError(c.err) } } c.inTransaction = true return &OCI8Tx{c}, nil }
func (d *OCI8Driver) Open(dsnString string) (connection driver.Conn, err error) { var ( conn OCI8Conn dsn *DSN ) if dsn, err = ParseDSN(dsnString); err != nil { return nil, err } if rv := C.WrapOCIEnvCreate( C.OCI_DEFAULT|C.OCI_THREADED, 0); rv.rv != C.OCI_SUCCESS && rv.rv != C.OCI_SUCCESS_WITH_INFO { // TODO: error handle not yet allocated, we can't get string error from oracle return nil, errors.New("can't OCIEnvCreate") } else { conn.env = rv.ptr } if rv := C.WrapOCIHandleAlloc( conn.env, C.OCI_HTYPE_ERROR, 0); rv.rv != C.OCI_SUCCESS { return nil, errors.New("cant allocate error handle") } else { conn.err = rv.ptr } phost := C.CString(dsn.Connect) defer C.free(unsafe.Pointer(phost)) puser := C.CString(dsn.Username) defer C.free(unsafe.Pointer(puser)) ppass := C.CString(dsn.Password) defer C.free(unsafe.Pointer(ppass)) if rv := C.WrapOCILogon( (*C.OCIEnv)(conn.env), (*C.OCIError)(conn.err), (*C.OraText)(unsafe.Pointer(puser)), C.ub4(len(dsn.Username)), (*C.OraText)(unsafe.Pointer(ppass)), C.ub4(len(dsn.Password)), (*C.OraText)(unsafe.Pointer(phost)), C.ub4(len(dsn.Connect))); rv.rv != C.OCI_SUCCESS && rv.rv != C.OCI_SUCCESS_WITH_INFO { return nil, ociGetError(rv.rv, conn.err) } else { conn.svc = rv.ptr } conn.location = dsn.Location conn.transactionMode = dsn.transactionMode conn.prefetch_rows = dsn.prefetch_rows conn.prefetch_memory = dsn.prefetch_memory conn.enableQMPlaceholders = dsn.enableQMPlaceholders return &conn, nil }
func (d *OCI8Driver) Open(dsnString string) (connection driver.Conn, err error) { var ( conn OCI8Conn dsn *DSN ) if dsn, err = ParseDSN(dsnString); err != nil { return nil, err } // set safe defaults conn.attrs = make(Values) conn.attrs.Set("prefetch_rows", 10) conn.attrs.Set("prefetch_memory", int64(0)) for k, v := range parseEnviron(os.Environ()) { conn.attrs.Set(k, v) } if rv := C.WrapOCIEnvCreate( C.OCI_DEFAULT|C.OCI_THREADED, 0); rv.rv != C.OCI_SUCCESS && rv.rv != C.OCI_SUCCESS_WITH_INFO { // TODO: error handle not yet allocated, we can't get string error from oracle return nil, errors.New("can't OCIEnvCreate") } else { conn.env = rv.ptr } if rv := C.WrapOCIHandleAlloc( conn.env, C.OCI_HTYPE_ERROR, 0); rv.rv != C.OCI_SUCCESS { return nil, errors.New("cant allocate error handle") } else { conn.err = rv.ptr } var host string if dsn.Host != "" && dsn.SID != "" { host = fmt.Sprintf("%s:%d/%s", dsn.Host, dsn.Port, dsn.SID) } else { host = dsn.SID } phost := C.CString(host) defer C.free(unsafe.Pointer(phost)) puser := C.CString(dsn.Username) defer C.free(unsafe.Pointer(puser)) ppass := C.CString(dsn.Password) defer C.free(unsafe.Pointer(ppass)) if rv := C.WrapOCILogon( (*C.OCIEnv)(conn.env), (*C.OCIError)(conn.err), (*C.OraText)(unsafe.Pointer(puser)), C.ub4(len(dsn.Username)), (*C.OraText)(unsafe.Pointer(ppass)), C.ub4(len(dsn.Password)), (*C.OraText)(unsafe.Pointer(phost)), C.ub4(len(host))); rv.rv != C.OCI_SUCCESS { return nil, ociGetError(conn.err) } else { conn.svc = rv.ptr } conn.location = dsn.Location conn.transactionMode = dsn.transactionMode c := &conn runtime.SetFinalizer(c, (*OCI8Conn).Close) return c, nil }