📄 lob.c
字号:
/*
+----------------------------------------------------------------------+
| |
| OCILIB - C Driver for Oracle |
| |
| (C Wrapper for Oracle OCI) |
| |
+----------------------------------------------------------------------+
| Website : http://ocilib.net |
+----------------------------------------------------------------------+
| Copyright (c) 2007-2009 Vincent ROGIER |
+----------------------------------------------------------------------+
| This library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Library General Public |
| License as published by the Free Software Foundation; either |
| version 2 of the License, or (at your option) any later version. |
| |
| This library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Library General Public License for more details. |
| |
| You should have received a copy of the GNU Library General Public |
| License along with this library; if not, write to the Free |
| Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
+----------------------------------------------------------------------+
| Author: Vincent ROGIER <vince.rogier@gmail.com> |
+----------------------------------------------------------------------+
*/
/* ------------------------------------------------------------------------ *
* $Id: lob.c, v 3.2.0 2009/04/20 00:00 Vince $
* ------------------------------------------------------------------------ */
#include "ocilib_internal.h"
/* ************************************************************************ *
* PRIVATE FUNCTIONS
* ************************************************************************ */
/* ------------------------------------------------------------------------ *
* OCI_LobInit
* ------------------------------------------------------------------------ */
OCI_Lob * OCI_LobInit(OCI_Connection *con, OCI_Lob **plob,
OCILobLocator *handle, ub4 type)
{
ub2 csid = OCI_DEFAULT;
ub1 csfrm = OCI_DEFAULT;
OCI_Lob * lob = NULL;
boolean res = TRUE;
ub1 lobtype = 0;
OCI_CHECK(plob == NULL, NULL);
if (*plob == NULL)
*plob = (OCI_Lob *) OCI_MemAlloc(OCI_IPC_LOB, sizeof(*lob), 1, TRUE);
if (*plob != NULL)
{
lob = *plob;
lob->type = type;
lob->con = con;
lob->handle = handle;
lob->offset = 1;
if (lob->handle == NULL)
{
ub4 empty = 0;
/* allocate handle for non fetched lob (temporary lob) */
lob->hstate = OCI_OBJECT_ALLOCATED;
if (lob->type == OCI_NCLOB)
{
csfrm = SQLCS_NCHAR;
lobtype = OCI_TEMP_CLOB;
}
else if (lob->type == OCI_CLOB)
{
csfrm = SQLCS_IMPLICIT;
lobtype = OCI_TEMP_CLOB;
}
else
lobtype = OCI_TEMP_BLOB;
res = (OCI_SUCCESS == OCI_DescriptorAlloc((dvoid *) OCILib.env,
(dvoid **) (void *) &lob->handle,
(ub4) OCI_DTYPE_LOB,
(size_t) 0, (dvoid **) NULL));
OCI_CALL2
(
res, lob->con,
OCIAttrSet((dvoid *) lob->handle, (ub4) OCI_DTYPE_LOB,
(dvoid *) &empty, (ub4) sizeof(empty),
(ub4) OCI_ATTR_LOBEMPTY, lob->con->err)
)
OCI_CALL2
(
res, lob->con,
OCILobCreateTemporary(lob->con->cxt, lob->con->err,
lob->handle, csid, csfrm, lobtype,
FALSE, OCI_DURATION_SESSION)
)
}
else
lob->hstate = OCI_OBJECT_FETCHED_CLEAN;
}
else
res = FALSE;
/* check for failure */
if (res == FALSE)
{
OCI_LobFree(lob);
lob = NULL;
}
return lob;
}
/* ************************************************************************ *
* PUBLIC FUNCTIONS
* ************************************************************************ */
/* ------------------------------------------------------------------------ *
* OCI_LobCreate
* ------------------------------------------------------------------------ */
OCI_Lob * OCI_API OCI_LobCreate(OCI_Connection *con, unsigned int type)
{
OCI_Lob *lob = NULL;
OCI_CHECK_INITIALIZED(NULL);
OCI_CHECK_PTR(OCI_IPC_CONNECTION, con, NULL);
lob = OCI_LobInit(con, &lob, NULL, type);
OCI_RESULT(lob != NULL);
return lob;
}
/* ------------------------------------------------------------------------ *
* OCI_LobFree
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobFree(OCI_Lob *lob)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
OCI_CHECK_OBJECT_FETCHED(lob, FALSE);
if (OCI_LobIsTemporary(lob) == TRUE)
{
OCI_CALL2
(
res, lob->con,
OCILobFreeTemporary(lob->con->cxt, lob->con->err, lob->handle)
)
}
if (lob->hstate == OCI_OBJECT_ALLOCATED)
{
OCI_DescriptorFree((dvoid *) lob->handle, (ub4) OCI_DTYPE_LOB);
}
OCI_FREE(lob);
OCI_RESULT(res);
return res;
}
/* ------------------------------------------------------------------------ *
* OCI_LobGetType
* ------------------------------------------------------------------------ */
unsigned int OCI_API OCI_LobGetType(OCI_Lob *lob)
{
OCI_CHECK_PTR(OCI_IPC_LOB, lob,OCI_UNKNOWN);
OCI_RESULT(TRUE);
return lob->type;
}
/* ------------------------------------------------------------------------ *
* OCI_LobSeek
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobSeek(OCI_Lob *lob, big_uint offset, unsigned int mode)
{
boolean res = TRUE;
big_uint size = 0;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
size = OCI_LobGetLength(lob);
if ((mode == OCI_SEEK_CUR && (offset + lob->offset-1) > size))
res = FALSE;
else if (mode == OCI_SEEK_SET)
lob->offset = offset + 1;
else if (mode == OCI_SEEK_END)
lob->offset = size-offset + 1;
else if (mode == OCI_SEEK_CUR)
lob->offset += offset;
else
res = FALSE;
OCI_RESULT(res);
return res;
}
/* ------------------------------------------------------------------------ *
* OCI_LobGetOffset
* ------------------------------------------------------------------------ */
big_uint OCI_API OCI_LobGetOffset(OCI_Lob *lob)
{
OCI_CHECK_PTR(OCI_IPC_LOB, lob, 0);
OCI_RESULT(TRUE);
return lob->offset - 1;
}
/* ------------------------------------------------------------------------ *
* OCI_LobRead
* ------------------------------------------------------------------------ */
unsigned int OCI_API OCI_LobRead(OCI_Lob *lob, void *buffer, unsigned int len)
{
boolean res = TRUE;
ub4 size_in = 0;
ub4 size_out = 0;
ub2 csid = 0;
ub1 csfrm = 0;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, 0);
OCI_CHECK_MIN(lob->con, NULL, len, 1, 0);
size_out = size_in = len;
if (lob->type != OCI_BLOB)
{
#ifndef OCI_CHARSET_ANSI
csid = OCI_UTF16ID;
#endif
size_in *= sizeof(odtext);
}
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,
OCILobRead2(lob->con->cxt, lob->con->err,
lob->handle, &size_byte,
&size_char, (ub8) lob->offset,
buffer,(ub8) size_in,
(ub1) OCI_ONE_PIECE, (void *) NULL,
NULL, csid, csfrm)
)
if (lob->type == OCI_BLOB)
size_out = (ub4) size_byte;
else
size_out = (ub4) size_char;
}
else
#endif
{
ub4 offset = (ub4) lob->offset;
OCI_CALL2
(
res, lob->con,
OCILobRead(lob->con->cxt, lob->con->err,
lob->handle, &size_out, offset,
buffer, size_in, (void *) NULL,
NULL, csid, csfrm)
)
}
if (res == TRUE)
{
if (lob->type != OCI_BLOB)
OCI_ConvertString(buffer, (int) size_out, sizeof(odtext), sizeof(dtext));
lob->offset += (big_uint) size_out;
}
OCI_RESULT(res);
return size_out;
}
/* ------------------------------------------------------------------------ *
* OCI_LobWrite
* ------------------------------------------------------------------------ */
unsigned int OCI_API OCI_LobWrite(OCI_Lob *lob, void *buffer, unsigned int len)
{
boolean res = TRUE;
ub4 size_in = 0;
ub4 size_out = 0;
ub2 csid = 0;
ub1 csfrm = 0;
void *obuf = NULL;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, 0);
OCI_CHECK_MIN(lob->con, NULL, len, 1, 0);
size_out = size_in = len;
if (lob->type != OCI_BLOB)
{
#ifndef OCI_CHARSET_ANSI
csid = OCI_UTF16ID;
#endif
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,
OCILobWrite2(lob->con->cxt, lob->con->err,
lob->handle, &size_byte,
&size_char, (ub8) lob->offset,
obuf, (ub8) size_in,
(ub1) OCI_ONE_PIECE, (void *) NULL,
NULL , csid, csfrm)
)
if (lob->type == OCI_BLOB)
size_out = (ub4) size_byte;
else
size_out = (ub4) size_char;
}
else
#endif
{
ub4 offset = (ub4) lob->offset;
OCI_CALL2
(
res, lob->con,
OCILobWrite(lob->con->cxt, lob->con->err,
lob->handle, &size_out,
offset, obuf, size_in,
(ub1) OCI_ONE_PIECE, (void *) 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_LobTruncate
* ------------------------------------------------------------------------ */
boolean OCI_API OCI_LobTruncate(OCI_Lob *lob, big_uint size)
{
boolean res = TRUE;
OCI_CHECK_PTR(OCI_IPC_LOB, lob, FALSE);
#ifdef OCI_LOB2_API_ENABLED
if (OCILib.use_lob_ub8)
{
OCI_CALL2
(
res, lob->con,
OCILobTrim2(lob->con->cxt, lob->con->err, lob->handle, (ub8) size)
)
}
else
#endif
{
ub4 size32 = (ub4) size;
OCI_CALL2
(
res, lob->con,
OCILobTrim(lob->con->cxt, lob->con->err, lob->handle, size32)
)
}
OCI_RESULT(res);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -