⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lob.c

📁 oci的源码,可以在任何平台上编译,相当方便实用
💻 C
📖 第 1 页 / 共 2 页
字号:

    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 + -