blob: d2c936f34a7402174d03e54938bc2468e449dc31 [file] [log] [blame]
/********************************************************************
//
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
********************************************************************/
#ifndef SQLCMD_H
#define SQLCMD_H
/* -*-C++-*-
*****************************************************************************
*
* File: SqlCmd.h
* RCS: $Id: SqlCmd.h,v 1.13 1998/09/07 21:49:58 Exp $
* Description:
*
*
* Created: 4/15/95
* Modified: $ $Date: 1998/09/07 21:49:58 $ (GMT)
* Language: C++
* Status: $State: Exp $
*
*
*
*
*****************************************************************************
*/
#include "NAType.h" // for DEFAULT_CHARACTER_LENGTH
#include "SqlciNode.h"
#include "SqlciEnv.h"
#include "ComDistribution.h"
// Revision 1.6.8.1 1998/04/17 16:27:46
// reaching nchar milestone
//
extern void HandleCLIErrorInit();
extern void HandleCLIError(Lng32 &err, SqlciEnv *sqlci_env,
NABoolean displayErr = TRUE,
NABoolean * isEOD = NULL,
Int32 prepcode = 0, NABoolean getWarningsWithEOF = FALSE);
extern void HandleCLIError(SQLSTMT_ID *stmt, Lng32 &err, SqlciEnv *sqlci_env,
NABoolean displayErr = TRUE,
NABoolean * isEOD = NULL,
Int32 prepcode = 0);
void handleLocalError(ComDiagsArea *diags, SqlciEnv *sqlci_env);
Int64 getRowsAffected(SQLSTMT_ID *stmt);
Int32 getDiagsCondCount(SQLSTMT_ID *stmt);
// for unnamed parameters
#define MAX_NUM_UNNAMED_PARAMS 128
#define MAX_LEN_UNNAMED_PARAM 300
class Execute;
class SqlCmd : public SqlciNode {
public:
enum sql_cmd_type {
DML_TYPE, PREPARE_TYPE, EXECUTE_TYPE, CURSOR_TYPE,
GOAWAY_TYPE, DESCRIBE_TYPE, QUERYCACHE_TYPE,
USAGE_TYPE, QUIESCE_TYPE, STORE_EXPLAIN_TYPE
};
private:
sql_cmd_type cmd_type;
char *sql_stmt;
Int32 sql_stmt_oct_length;
public:
SqlCmd(const sql_cmd_type cmd_type_, const char * argument_);
~SqlCmd();
char * get_sql_stmt() {return sql_stmt;}
inline Int32 get_sql_stmt_oct_length() {return sql_stmt_oct_length;};
static short do_prepare(SqlciEnv *, PrepStmt *,
char * sqlStmt,
NABoolean resetLastExecStmt = TRUE,
Lng32 rsIndex = 0,
Int32 *prepcode = NULL,
Lng32 *statisticsType = NULL);
static short updateRepos(SqlciEnv * sqlci_env, SQLSTMT_ID * stmt, char * queryId);
static short do_execute(SqlciEnv *, PrepStmt *,
Int32 numUnnamedParams = 0,
char ** unnamedParamArray = NULL,
CharInfo::CharSet* unnamedParamCharSetArray = NULL,
Int32 prepcode = 0);
//////////////////////////////////////////////////////////
// made the change to add static in front of the function
// declaration! Reason - Beacause we will be accessing that
// method from outside the files from where it was decalred. In
// that case you have to make it static to get to it otherwise
// it wont link.
////////////////////////////////////////////////////////////
static short doExec(SqlciEnv *, SQLSTMT_ID *, PrepStmt *,
Int32 numUnnamedParams = 0,
char ** unnamedParamArray = NULL,
CharInfo::CharSet* unnamedParamCharSetArray = NULL,
NABoolean handleError = TRUE);
static short doDescribeInput(SqlciEnv *, SQLSTMT_ID *, PrepStmt *,
Lng32 num_input_entries,
Int32 numUnnamedParams = 0,
char ** unnamedParamArray = NULL,
CharInfo::CharSet* unnamedParamCharSetArray = NULL);
static short doFetch(SqlciEnv *, SQLSTMT_ID * stmt,
PrepStmt * prep_stmt,
NABoolean firstFetch = FALSE,
NABoolean handleError = TRUE,
Int32 prepcode = 0);
static short doClearExecFetchClose(SqlciEnv *, SQLSTMT_ID *, PrepStmt *,
Int32 numUnnamedParams = 0,
char ** unnamedParamArray = NULL,
CharInfo::CharSet* unnamedParamCharSetArray = NULL,
NABoolean handleError = TRUE);
static short getHeadingInfo(SqlciEnv * sqlci_env,
PrepStmt * prep_stmt,
char * headingRow,
char * underline);
static short displayHeading(SqlciEnv * sqlci_env,
PrepStmt * prep_stmt);
static Lng32 displayRow(SqlciEnv * sqlci_env,
PrepStmt * prep_stmt);
static void addOutputInfoToPrepStmt(SqlciEnv *sqlci_env,
PrepStmt *prep_stmt);
static short deallocate(SqlciEnv * sqlci_env, PrepStmt * prep_stmt);
static short executeQuery(const char *query, SqlciEnv *sqlci_env);
static short setEnviron(SqlciEnv *sqlci_env, Lng32 propagate);
static short showShape(SqlciEnv *sqlci_env, const char *query);
static char * replacePattern(SqlciEnv * sqlci_env, char * inStr);
static void clearCLIDiagnostics();
static short cleanupAfterError(Lng32 retcode,
SqlciEnv * sqlci_env,
SQLSTMT_ID * stmt,
SQLDESC_ID *sql_src,
SQLDESC_ID *output_desc,
SQLDESC_ID *input_desc,
NABoolean resetLastExecStmt);
};
class DML : public SqlCmd {
private:
char * this_stmt_name;
dml_type type;
// $$$$ SPJ RS THROWAWAY
Lng32 rsIndex_;
public:
DML(const char * argument_, dml_type type_, const char * stmt_name_ = NULL);
~DML();
short process(SqlciEnv * sqlci_env);
// $$$$ SPJ RS THROWAWAY
void setResultSetIndex(Lng32 i) { rsIndex_ = i; }
Lng32 getResultSetIndex() const { return rsIndex_; }
};
class Prepare : public SqlCmd {
char * this_stmt_name;
dml_type type;
public:
Prepare(char * stmt_name_, char * argument_, dml_type type_);
~Prepare();
short process(SqlciEnv * sqlci_env);
};
class DescribeStmt : public SqlCmd {
char * stmtName_;
public:
DescribeStmt(char * stmtName, char *argument);
~DescribeStmt();
short process(SqlciEnv * sqlciEnv);
short displayEntries(SqlciEnv *sqlci_env,
SQLDESC_ID *desc, Lng32 numEntries,
Logfile *log);
};
class Execute : public SqlCmd {
private:
char * using_params[MAX_NUM_UNNAMED_PARAMS];
CharInfo::CharSet using_param_charsets[MAX_NUM_UNNAMED_PARAMS];
short num_params;
char * this_stmt_name;
public:
Execute(char * stmt_name_, char * argument_, short flag = 0, SqlciEnv * sqlci_env = NULL);
~Execute();
short process(SqlciEnv * sqlci_env);
static Lng32 storeParams(char * argument_, short &num_params,
char * using_params[], CharInfo::CharSet[] = NULL,
SqlciEnv * sqlci_env = NULL);
short getNumParams() const { return num_params; }
char ** getUnnamedParamArray() { return using_params; }
CharInfo::CharSet* getUnnamedParamCharSetArray() { return using_param_charsets; }
char* getUnnamedParamValue(short num) { return using_params[num]; }
CharInfo::CharSet getUnnamedParamCharSet(short num) { return using_param_charsets[num]; }
};
class Cursor : public SqlCmd {
public:
enum CursorOperation{DECLARE, OPEN, FETCH, CLOSE, DEALLOC};
Cursor(char * cursorName, CursorOperation operation,
Int16 internalPrepare, char * argument,
NABoolean internalCursor = FALSE);
~Cursor();
short process(SqlciEnv * sqlci_env);
// QSTUFF
inline void setHoldable(NABoolean t) { isHoldable_ = t; }
inline NABoolean isHoldable() { return isHoldable_; }
// QSTUFF
short declareC(SqlciEnv * sqlci_env,
char * donemsg, Lng32 &retcode);
short declareCursorStmt(SqlciEnv *sqlci_env, Lng32 &retcode);
short declareCursorStmtForRS(SqlciEnv *sqlci_env, Lng32 &retcode);
short open(SqlciEnv * sqlci_env, char * donemsg, Lng32 &retcode);
short fetch(SqlciEnv * sqlci_env, NABoolean doDisplayRow,
char * donemsg, Lng32 &retcode);
short close(SqlciEnv * sqlci_env, char * donemsg, Lng32 &retcode);
short dealloc(SqlciEnv * sqlci_env, char * donemsg, Lng32 &retcode);
void cleanupCursorStmt(SqlciEnv *sqlci_env, CursorStmt *c);
void setResultSetIndex(Lng32 i) { resultSetIndex_ = i; }
Lng32 getResultSetIndex() const { return resultSetIndex_; }
private:
char * cursorName_;
CursorOperation operation_;
Int16 internalPrepare_; // if -1, then argument is a SQL statement that
// has to be prepared. Otherwise, argument is the
// name of a prepared statement.
// QSTUFF
// indicates holdable cursor
NABoolean isHoldable_;
// QSTUFF
NABoolean internalCursor_;
Lng32 resultSetIndex_;
};
// This class is used by the query cache virtual interface to execute
// the commands "display_qc" and "display_qc_entries" which will show
// some important fields of the SQL/MX query cache.
class QueryCacheSt : public SqlCmd {
public:
QueryCacheSt(short option);
virtual ~QueryCacheSt() {};
short process(SqlciEnv * sqlci_env);
private:
short option_;
};
class StoreExplain : public SqlCmd {
public:
StoreExplain(char *argument)
: SqlCmd(STORE_EXPLAIN_TYPE, argument)
{}
~StoreExplain()
{}
short process(SqlciEnv * sqlciEnv);
};
class Quiesce : public SqlCmd
{
public:
Quiesce();
virtual ~Quiesce();
short process(SqlciEnv *sqlci_env);
};
#endif