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

📄 statement.c

📁 oci的源码,可以在任何平台上编译,相当方便实用
💻 C
📖 第 1 页 / 共 5 页
字号:
                    break;
                }
                case OCI_ARG_TEXT:
                {
                    const dtext *src;
                    dtext *dst;

                    src = OCI_GetString(rs, i);
                    dst = va_arg(args, dtext *);

                    if (dst != NULL)
                        dst[0] = 0;

                    if (dst != NULL && src != NULL)
                        dtscat(dst, src);

                    break;
                }
                case OCI_ARG_RAW:
                {
                    OCI_GetRaw(rs, i, va_arg(args, dtext *), col->bufsize);
                    break;
                }
                case OCI_ARG_LOB:
                {
                    OCI_Lob *src, *dst;

                    src = OCI_GetLob(rs, i);
                    dst = (OCI_Lob *) va_arg(args, OCI_Lob *);

                    if (src != NULL && dst != NULL)
                        res = OCI_LobAssign(dst, src);

                    break;
                }
                case OCI_ARG_FILE:
                {
                    OCI_File *src, *dst;

                    src = OCI_GetFile(rs, i);
                    dst = (OCI_File *) va_arg(args, OCI_File *);

                    if (src != NULL && dst != NULL)
                        res = OCI_FileAssign(dst, src);

                    break;
                }
                case OCI_ARG_TIMESTAMP:
                {
                    OCI_Timestamp *src, *dst;

                    src = OCI_GetTimestamp(rs, i);
                    dst = (OCI_Timestamp *) va_arg(args, OCI_Timestamp *);

                    if (src != NULL && dst != NULL)
                        res = OCI_TimestampAssign(dst, src);

                    break;
                }
                case OCI_ARG_INTERVAL:
                {
                    OCI_Interval *src, *dst;

                    src = OCI_GetInterval(rs, i);
                    dst = (OCI_Interval *) va_arg(args, OCI_Interval *);

                    if (src != NULL && dst != NULL)
                        res =OCI_IntervalAssign(dst, src);

                    break;
                }
                default:
                {
                    OCI_ExceptionMappingArgument(stmt->con, stmt, type);

                    res = FALSE;

                    break;
                }
            }
        }
    }

    return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_StatementInit
 * ------------------------------------------------------------------------ */

OCI_Statement * OCI_StatementInit(OCI_Connection *con, OCI_Statement **pstmt,
                                  OCIStmt *handle, OCI_Define *def)
{
    OCI_Statement * stmt = NULL;
    boolean res = TRUE;

    OCI_CHECK(pstmt == NULL, NULL);

    if (*pstmt == NULL)
        *pstmt = (OCI_Statement *) OCI_MemAlloc(OCI_IPC_STATEMENT, sizeof(*stmt),
                                              1, TRUE);

    if (*pstmt != NULL)
    {
        stmt = *pstmt;

        stmt->con           = con;
        stmt->stmt          = handle;

        stmt->exec_mode     = OCI_DEFAULT;
        stmt->long_size     = OCI_SIZE_LONG;
        stmt->bind_reuse    = FALSE;
        stmt->bind_mode     = OCI_BIND_BY_NAME;
        stmt->long_mode     = OCI_LONG_EXPLICIT;

        /* reset statement */

        OCI_StatementReset(stmt);

        if (def == NULL)
        {
            /* allocate handle for non fetched lob (temporary lob) */

            stmt->hstate = OCI_OBJECT_ALLOCATED;

            /* allocate handle */

            res = (OCI_SUCCESS == OCI_HandleAlloc((dvoid *) OCILib.env,
                                                  (dvoid **) (void *) &stmt->stmt,
                                                  (ub4) OCI_HTYPE_STMT,
                                                  (size_t) 0, (dvoid **) NULL));
        }
        else
        {
            stmt->hstate = OCI_OBJECT_FETCHED_CLEAN;
            stmt->status = OCI_STMT_EXECUTED;
            stmt->type   = OCI_CST_SELECT;

            /* not really perfect, but better than nothing */

            if (def->col.name != NULL)
                stmt->sql = mtsdup(def->col.name);
        }

        /* set statement default attributes */

        OCI_SetPrefetchSize(stmt, OCI_PREFETCH_SIZE);
        OCI_SetFetchSize(stmt, OCI_FETCH_SIZE);
    }

    /* check for failure */

    if (res == FALSE)
    {
        OCI_StatementFree(stmt);
        stmt = NULL;
    }

    return stmt;
}

/* ------------------------------------------------------------------------ *
 * OCI_StatementReset
 * ------------------------------------------------------------------------ */

boolean OCI_StatementReset(OCI_Statement *stmt)
{
    boolean res = TRUE;

    OCI_CHECK_PTR(OCI_IPC_STATEMENT, stmt, FALSE);

    /* free resultsets */

    res = OCI_ReleaseResultsets(stmt);

    /* free in/out binds */

    res = OCI_BindFreeAll(stmt);

    /* free bind map */

    if (stmt->map != NULL)
    {
        OCI_HashFree(stmt->map);
    }

    /* free sql statement */

    OCI_FREE(stmt->sql);

    stmt->rsts        = NULL;
    stmt->sql         = NULL;
    stmt->map         = NULL;

    stmt->status      = OCI_STMT_CLOSED;
    stmt->type        = OCI_UNKNOWN;
    stmt->bind_array  = FALSE;

    stmt->nb_iters     = 1;
    stmt->dynidx       = 0;
    stmt->err_pos      = 0;

    return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_StatementClose
 * ------------------------------------------------------------------------ */

boolean OCI_StatementClose(OCI_Statement *stmt)
{
    boolean res    = TRUE;
    OCI_Error *err = NULL;

    OCI_CHECK_PTR(OCI_IPC_STATEMENT, stmt, FALSE);

    /* clear statement reference from current error object */

    err = OCI_ErrorGet(FALSE);

    if (err != NULL && err->stmt == stmt)
        err->stmt = NULL;

    /* reset data */

    res = OCI_StatementReset(stmt);

    if (stmt->stmt != NULL && stmt->hstate == OCI_OBJECT_ALLOCATED)
    {
        OCI_HandleFree((dvoid *) stmt->stmt, (ub4) OCI_HTYPE_STMT);
    }

    return res;
}

/* ************************************************************************ *
 *                            PUBLIC FUNCTIONS
 * ************************************************************************ */

/* ------------------------------------------------------------------------ *
 * OCI_StatementCreate
 * ------------------------------------------------------------------------ */

OCI_Statement * OCI_API OCI_StatementCreate(OCI_Connection *con)
{
    OCI_Statement *stmt = NULL;
    OCI_Item *item      = NULL;

    OCI_CHECK_PTR(OCI_IPC_CONNECTION, con, NULL);

    /* create statement object */

    item = OCI_ListAppend(con->stmts, sizeof(*stmt));

    if (item != NULL)
    {
        stmt = OCI_StatementInit(con, (OCI_Statement **) &item->data, NULL, FALSE);
    }

    OCI_RESULT(stmt != NULL);

    return stmt;
}

/* ------------------------------------------------------------------------ *
 * OCI_StatementFree
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_StatementFree(OCI_Statement *stmt)
{
    boolean res = FALSE;

    OCI_CHECK_PTR(OCI_IPC_STATEMENT, stmt, FALSE);

    OCI_CHECK_OBJECT_FETCHED(stmt, FALSE);

    res = OCI_StatementClose(stmt);

    OCI_ListRemove(stmt->con->stmts, stmt);

    OCI_FREE(stmt);

    OCI_RESULT(res);

    return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_ReleaseResultsets
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_ReleaseResultsets(OCI_Statement *stmt)
{
    boolean res   = TRUE;
    ub4 i, nb_err = 0;

    OCI_CHECK_PTR(OCI_IPC_STATEMENT, stmt, FALSE);

    if (stmt->rsts != NULL)
    {
        for (i = 0; i  < stmt->nb_rs; i++)
        {
            if (stmt->rsts[i] != NULL)
            {
                if (FALSE == OCI_ResultsetFree(stmt->rsts[i]))
                    nb_err++;
            }
        }

        OCI_FREE(stmt->rsts);
    }

    res = (nb_err == 0);

    OCI_RESULT(res);

    return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_Prepare
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_Prepare(OCI_Statement *stmt, const mtext *sql)
{
    boolean res = TRUE;
    void *ostr  = NULL;
    int  osize  = -1;

    OCI_CHECK_PTR(OCI_IPC_STATEMENT, stmt, FALSE);
    OCI_CHECK_PTR(OCI_IPC_STRING, sql, FALSE);

    /* reset statement */

    res = OCI_StatementReset(stmt);

    if (res == TRUE)
    {
        /* store SQL */

        stmt->sql = mtsdup(sql);

        ostr = OCI_GetInputMetaString(stmt->sql, &osize);

        /* prepare SQL */

        OCI_CALL1
        (
            res, stmt->con, stmt,

            OCIStmtPrepare(stmt->stmt,stmt->con->err, (OraText *) ostr,
                           (ub4) osize, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)
        )

        OCI_ReleaseMetaString(ostr);

        /* get statement type */

        OCI_CALL1
        (
            res, stmt->con, stmt,

            OCIAttrGet((dvoid *) stmt->stmt, (ub4) OCI_HTYPE_STMT,
                       (dvoid *) &stmt->type, (ub4 *) NULL,
                       (ub4) OCI_ATTR_STMT_TYPE, stmt->con->err)
        )
    }

    /* update statement status */

    if (res == TRUE)
        stmt->status = OCI_STMT_PREPARED;

    OCI_RESULT(res);

   return res;
}

/* ------------------------------------------------------------------------ *
 * OCI_Execute
 * ------------------------------------------------------------------------ */

boolean OCI_API OCI_Execute(OCI_Statement *stmt)
{
    boolean res   = TRUE;
    sword status  = OCI_SUCCESS;
    ub4 iters     = 0;
    ub4 mode      = OCI_DEFAULT;

    OCI_CHECK_PTR(OCI_IPC_STATEMENT, stmt, FALSE);
    OCI_CHECK_STMT_STATUS(stmt, OCI_STMT_CLOSED, FALSE);

    /* set up iters and mode values for execution */

    if (stmt->type == OCI_CST_SELECT)
        mode  = stmt->exec_mode;
    else
        iters = stmt->nb_iters;

    /* check bind objects for updating their null indicator status */

    res = OCI_BindCheck(stmt);

    /* free previous resulsets in case of re-execution of the same SQL order */

   if (res == TRUE)
       res = OCI_ReleaseResultsets(stmt);

    /* Oracle execute call */

    status = OCIStmtExecute(stmt->con->cxt, stmt->stmt, stmt->con->err, iters,
                            (ub4) 0, (OCISnapshot *) NULL, (OCISnapshot *) NULL,
                            mode);

    /* reset input binds indicators status even if execution failed */

    OCI_BindReset(stmt);

    /* check result */

    res = ((status == OCI_SUCCESS) || (status == OCI_NEED_DATA));

    /* update status on success */

    if (res == TRUE)
    {
        stmt->status = OCI_STMT_EXECUTED;

        /* commit if necessary */

        if (stmt->con->autocom == TRUE)
            OCI_Commit(stmt->con);
    }
    else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -