📄 lob.c
字号:
return res;
}
/* ------------------------------------------------------------------------ *
* OCI_LobErase
* ------------------------------------------------------------------------ */
big_uint OCI_API OCI_LobErase(OCI_Lob *lob, big_uint offset, big_uint size)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, 0);
OCI_CHECK_MIN(lob->con, NULL, size, 1, 0);
#ifdef OCI_LOB2_API_ENABLED
if (OCILib.use_lob_ub8)
{
OCI_CALL2
(
res, lob->con,
OCILobErase2(lob->con->cxt, lob->con->err, lob->handle,
(ub8 *) &size, (ub8) (offset + 1))
)
}
else
#endif
{
ub4 size32 = (ub4) size;
ub4 offset32 = (ub4) offset;
OCI_CALL2
(
res, lob->con,
OCILobErase(lob->con->cxt, lob->con->err, lob->handle,
&size32, offset32 + 1)
)
size = (big_uint) size32;
}
OCI_RESULT(res);
return size;
}
/* ------------------------------------------------------------------------ *
* OCI_LobGetLength
* ------------------------------------------------------------------------ */
big_uint OCI_API OCI_LobGetLength(OCI_Lob *lob)
{
boolean res = TRUE;
big_uint size = 0;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, 0);
#ifdef OCI_LOB2_API_ENABLED
if (OCILib.use_lob_ub8)
{
OCI_CALL2
(
res, lob->con,
OCILobGetLength2(lob->con->cxt, lob->con->err, lob->handle,
(ub8 *) &size)
)
}
else
#endif
{
ub4 size32 = (ub4) size;
OCI_CALL2
(
res, lob->con,
OCILobGetLength(lob->con->cxt, lob->con->err, lob->handle, &size32)
)
size = (big_uint) size32;
}
OCI_RESULT(res);
return size;
}
/* ------------------------------------------------------------------------ *
* OCI_LobCopy
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobCopy(OCI_Lob *lob, OCI_Lob *lob_src, big_uint offset_dst,
big_uint offset_src, big_uint count)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
OCI_CHECK_PTR(OCI_IPC_LOB, lob_src, FALSE);
#ifdef OCI_LOB2_API_ENABLED
if (OCILib.use_lob_ub8)
{
OCI_CALL2
(
res, lob->con,
OCILobCopy2(lob->con->cxt, lob->con->err, lob->handle,
lob_src->handle, (ub8) count,
(ub8) (offset_dst + 1),
(ub8) (offset_src + 1))
)
}
else
#endif
{
ub4 count32 = (ub4) count;
ub4 offset_src32 = (ub4) offset_src;
ub4 offset_dst32 = (ub4) offset_dst;
OCI_CALL2
(
res, lob->con,
OCILobCopy(lob->con->cxt, lob->con->err, lob->handle,
lob_src->handle, count32, offset_dst32 + 1,
offset_src32 + 1)
)
}
OCI_RESULT(res);
return res;
}
/* ------------------------------------------------------------------------ *
* OCI_LobCopyFromFile
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobCopyFromFile(OCI_Lob *lob, OCI_File *file,
big_uint offset_dst,
big_uint offset_src,
big_uint count)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
OCI_CHECK_PTR(OCI_IPC_FILE, file, FALSE);
#ifdef OCI_LOB2_API_ENABLED
if (OCILib.use_lob_ub8)
{
OCI_CALL2
(
res, lob->con,
OCILobLoadFromFile2(lob->con->cxt, lob->con->err,
lob->handle, file->handle,
(ub8) count,
(ub8) (offset_dst + 1),
(ub8) (offset_src + 1))
)
}
else
#endif
{
ub4 count32 = (ub4) count;
ub4 offset_src32 = (ub4) offset_src;
ub4 offset_dst32 = (ub4) offset_dst;
OCI_CALL2
(
res, lob->con,
OCILobLoadFromFile(lob->con->cxt, lob->con->err,
lob->handle, file->handle, count32,
offset_dst32 + 1, offset_src32 + 1)
)
}
OCI_RESULT(res);
return res;
}
/* ------------------------------------------------------------------------ *
* OCI_LobAppend
* ------------------------------------------------------------------------ */
unsigned int OCI_API OCI_LobAppend(OCI_Lob *lob, void *buffer, unsigned int len)
{
ub4 size_in = 0;
ub4 size_out = 0;
ub2 csid = 0;
ub1 csfrm = 0;
void *obuf = NULL;
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, 0);
OCI_CHECK_MIN(lob->con, NULL, len, 1, 0);
#ifndef OCI_CHARSET_ANSI
csid = OCI_UTF16ID;
#endif
/* OCILobWriteAppend() seems to cause problems on Oracle client 8.1 and 9.0
It's an Oracle known bug #886191
So we use OCI_LobSeek() + OCI_LobWrite() instead */
if (OCILib.ver_runtime < OCI_10)
{
return OCI_LobSeek(lob, OCI_LobGetLength(lob), OCI_SEEK_SET) &&
OCI_LobWrite(lob, buffer, len);
}
size_out = size_in = len;
if (lob->type != OCI_BLOB)
{
size_in *= sizeof(dtext);
obuf = OCI_GetInputDataString(buffer, (int *) &size_in);
}
else
obuf = buffer;
if (lob->type == OCI_NCLOB)
csfrm = SQLCS_NCHAR;
else
csfrm = SQLCS_IMPLICIT;
#ifdef OCI_LOB2_API_ENABLED
if (OCILib.use_lob_ub8)
{
ub8 size_char = (ub8) len;
ub8 size_byte = (ub8) size_in;
OCI_CALL2
(
res, lob->con,
OCILobWriteAppend2(lob->con->cxt, lob->con->err,
lob->handle, &size_byte,
&size_char, obuf, (ub8) size_in,
(ub1) OCI_ONE_PIECE,
(dvoid *) NULL,
NULL, csid, csfrm)
)
if (lob->type == OCI_BLOB)
size_out = (ub4) size_byte;
else
size_out = (ub4) size_char;
}
else
#endif
{
OCI_CALL2
(
res, lob->con,
OCILobWriteAppend(lob->con->cxt, lob->con->err,
lob->handle, &size_out,
obuf, size_in,
(ub1) OCI_ONE_PIECE,
(dvoid *) NULL,
NULL, csid, csfrm)
)
}
if (lob->type != OCI_BLOB)
OCI_ReleaseDataString(obuf);
if (res == TRUE)
lob->offset += (big_uint) size_out;
OCI_RESULT(res);
return size_out;
}
/* ------------------------------------------------------------------------ *
* OCI_LobAppendLob
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobAppendLob(OCI_Lob *lob, OCI_Lob *lob_src)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
OCI_CHECK_PTR(OCI_IPC_LOB, lob_src, FALSE);
/*
this might cause an ORA-24805 on Oracle 8.1.x only !
I couldn抰 find a bug ID on Metalink, but Oracle 9i had many fixes for
lobs !
*/
OCI_CALL2
(
res, lob->con,
OCILobAppend(lob->con->cxt, lob->con->err, lob->handle, lob_src->handle)
)
if (res == TRUE)
lob->offset = OCI_LobGetLength(lob);
OCI_RESULT(res);
return res;
}
/* ------------------------------------------------------------------------ *
* OCI_LobIsTemporary
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobIsTemporary(OCI_Lob *lob)
{
boolean value = FALSE;
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
OCI_CALL2
(
res, lob->con,
OCILobIsTemporary(OCILib.env, lob->con->err, lob->handle, &value)
)
OCI_RESULT(res);
return value;
}
/* ------------------------------------------------------------------------ *
* OCI_LobOpen
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobOpen(OCI_Lob *lob, unsigned int mode)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
OCI_CALL2
(
res, lob->con,
OCILobOpen(lob->con->cxt, lob->con->err, lob->handle, (ub1) mode)
)
OCI_RESULT(res);
return res;
}
/* ------------------------------------------------------------------------ *
* OCI_LobClose
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobClose(OCI_Lob *lob)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
OCI_CALL2
(
res, lob->con,
OCILobClose(lob->con->cxt, lob->con->err, lob->handle)
)
OCI_RESULT(res);
return res;
}
/* ------------------------------------------------------------------------ *
* OCI_LobIsEqual
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobIsEqual(OCI_Lob *lob, OCI_Lob *lob2)
{
boolean value = FALSE;
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob,FALSE);
OCI_CHECK_PTR(OCI_IPC_LOB, lob2, FALSE);
OCI_CALL2
(
res, lob->con,
OCILobIsEqual(OCILib.env, lob->handle, lob2->handle, &value)
)
OCI_RESULT(res);
return value;
}
/* ------------------------------------------------------------------------ *
* OCI_LobAssign
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobAssign(OCI_Lob *lob, OCI_Lob *lob_src)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
OCI_CHECK_PTR(OCI_IPC_LOB, lob_src, FALSE);
if (lob->hstate == OCI_OBJECT_ALLOCATED)
{
OCI_CALL2
(
res, lob->con,
OCILobLocatorAssign(lob->con->cxt, lob->con->err,
lob_src->handle, &lob->handle)
)
}
else
{
OCI_CALL2
(
res, lob->con,
OCILobAssign(OCILib.env, lob->con->err,
lob_src->handle, &lob->handle)
)
}
OCI_RESULT(res);
return res;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -