// SetFileName sets the directory alias and file name for the BFILE lob. func (lv *ExternalLobVar) SetFileName(dirAlias, name string) error { var err error // create a string for retrieving the value if err = lv.Verify(); err != nil { return errgo.Mask(err) } nameB := []byte(name) dirAliasB := []byte(dirAlias) if CTrace { ctrace("OCILobSetFilename(conn=%p, lob=%x, dirAlias=%s, dirAliasLen=%d, name=%s, nameLen=%d)", lv.lobVar.connection.handle, lv.getHandleBytes(), dirAliasB, len(dirAlias), nameB, len(nameB)) } lob := lv.getHandle() if err = lv.lobVar.environment.CheckStatus( C.OCILobFileSetName(lv.lobVar.environment.handle, lv.lobVar.environment.errorHandle, &lob, (*C.OraText)(&dirAliasB[0]), C.ub2(len(dirAliasB)), (*C.OraText)(&nameB[0]), C.ub2(len(nameB))), "LobFileSetName"); err != nil { return errgo.Mask(err) } return nil }
func (bnd *bndBfile) bind(value Bfile, position int, stmt *Stmt) error { // DirectoryAlias must be specified to avoid error "ORA-24801: illegal parameter value in OCI lob function" // Raising a driver error clarifies the user error if value.DirectoryAlias == "" { return errNew("DirectoryAlias must be specified when binding a non-null Bfile") } // Filename must be specified to avoid error "ORA-24801: illegal parameter value in OCI lob function" // Raising a driver error clarifies the user error if value.Filename == "" { return errNew("Filename must be specified when binding a non-null Bfile") } bnd.stmt = stmt // Allocate lob locator handle r := C.OCIDescriptorAlloc( unsafe.Pointer(bnd.stmt.ses.srv.env.ocienv), //CONST dvoid *parenth, (*unsafe.Pointer)(unsafe.Pointer(&bnd.ociLobLocator)), //dvoid **descpp, C.OCI_DTYPE_FILE, //ub4 type, 0, //size_t xtramem_sz, nil) //dvoid **usrmempp); if r == C.OCI_ERROR { return bnd.stmt.ses.srv.env.ociError() } else if r == C.OCI_INVALID_HANDLE { return errNew("unable to allocate oci lob handle during bind") } bnd.cDirectoryAlias = C.CString(value.DirectoryAlias) bnd.cFilename = C.CString(value.Filename) r = C.OCILobFileSetName( bnd.stmt.ses.srv.env.ocienv, //OCIEnv *envhp, bnd.stmt.ses.srv.env.ocierr, //OCIError *errhp, &bnd.ociLobLocator, //OCILobLocator **filepp, (*C.OraText)(unsafe.Pointer(bnd.cDirectoryAlias)), //const OraText *dir_alias, C.ub2(len(value.DirectoryAlias)), //ub2 d_length, (*C.OraText)(unsafe.Pointer(bnd.cFilename)), //const OraText *filename, C.ub2(len(value.Filename))) //ub2 f_length ); if r == C.OCI_ERROR { return bnd.stmt.ses.srv.env.ociError() } r = C.OCIBINDBYPOS( bnd.stmt.ocistmt, //OCIStmt *stmtp, (**C.OCIBind)(&bnd.ocibnd), //OCIBind **bindpp, bnd.stmt.ses.srv.env.ocierr, //OCIError *errhp, C.ub4(position), //ub4 position, unsafe.Pointer(&bnd.ociLobLocator), //void *valuep, C.LENGTH_TYPE(unsafe.Sizeof(bnd.ociLobLocator)), //sb8 value_sz, C.SQLT_FILE, //ub2 dty, nil, //void *indp, nil, //ub2 *alenp, nil, //ub2 *rcodep, 0, //ub4 maxarr_len, nil, //ub4 *curelep, C.OCI_DEFAULT) //ub4 mode ); if r == C.OCI_ERROR { return bnd.stmt.ses.srv.env.ociError() } return nil }
// SetFileName sets the directory alias and file name for the BFILE lob. func (lv *ExternalLobVar) SetFileName(dirAlias, name string) error { var err error // create a string for retrieving the value if err = lv.Verify(); err != nil { return err } nameB := []byte(name) dirAliasB := []byte(dirAlias) if err = lv.lobVar.environment.CheckStatus( C.OCILobFileSetName(lv.lobVar.environment.handle, lv.lobVar.environment.errorHandle, (**C.OCILobLocator)(unsafe.Pointer(&lv.lobVar.dataBytes[lv.pos*lv.lobVar.size])), (*C.OraText)(&dirAliasB[0]), C.ub2(len(dirAliasB)), (*C.OraText)(&nameB[0]), C.ub2(len(nameB))), "LobFileSetName"); err != nil { return err } return nil }