[TD-73] add tsim program
This commit is contained in:
parent
12ccad9df5
commit
16710ace8f
|
@ -18,8 +18,6 @@ tests/test/
|
|||
tests/taoshebei/
|
||||
tests/taoscsv/
|
||||
tests/taosdalipu/
|
||||
tests/sim/
|
||||
tests/script/
|
||||
tests/pytest/
|
||||
tests/jenkins/
|
||||
tests/hdfs/
|
||||
|
@ -33,4 +31,6 @@ taoshebei/
|
|||
taosdalipu/
|
||||
Target/
|
||||
*.failed
|
||||
*.sql
|
||||
*.sql
|
||||
sim/
|
||||
|
||||
|
|
|
@ -252,7 +252,7 @@ static int32_t mgmtGetUserMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pCon
|
|||
|
||||
pShow->bytes[cols] = 8;
|
||||
pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
strcpy(pSchema[cols].name, "created_time");
|
||||
strcpy(pSchema[cols].name, "create time");
|
||||
pSchema[cols].bytes = htons(pShow->bytes[cols]);
|
||||
cols++;
|
||||
|
||||
|
|
|
@ -10,3 +10,4 @@ SET(CMAKE_C_STANDARD 11)
|
|||
SET(CMAKE_VERBOSE_MAKEFILE ON)
|
||||
|
||||
ADD_SUBDIRECTORY(examples/c)
|
||||
ADD_SUBDIRECTORY(tsim)
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
#################################
|
||||
run general/user/testSuite.sim
|
||||
##################################
|
|
@ -0,0 +1,71 @@
|
|||
system sh/stop_dnodes.sh
|
||||
system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1
|
||||
system sh/exec.sh -n dnode1 -s start
|
||||
sql connect
|
||||
|
||||
print =============== show users
|
||||
sql show users
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print $data00 $data01 $data02
|
||||
print $data10 $data11 $data22
|
||||
print $data20 $data11 $data22
|
||||
|
||||
print =============== create user1
|
||||
sql create user user1 PASS 'user1'
|
||||
sql show users
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print $data00 $data01 $data02
|
||||
print $data10 $data11 $data22
|
||||
print $data20 $data11 $data22
|
||||
print $data30 $data31 $data32
|
||||
|
||||
print =============== create user2
|
||||
sql create user user2 PASS 'user2'
|
||||
sql show users
|
||||
if $rows != 5 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print $data00 $data01 $data02
|
||||
print $data10 $data11 $data22
|
||||
print $data20 $data11 $data22
|
||||
print $data30 $data31 $data32
|
||||
print $data40 $data41 $data42
|
||||
|
||||
print =============== drop user1
|
||||
sql drop user user1
|
||||
sql show users
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print $data00 $data01 $data02
|
||||
print $data10 $data11 $data22
|
||||
print $data20 $data11 $data22
|
||||
print $data30 $data31 $data32
|
||||
|
||||
print =============== restart taosd
|
||||
system sh/exec.sh -n dnode1 -s stop
|
||||
sleep 1000
|
||||
system sh/exec.sh -n dnode1 -s start
|
||||
|
||||
print =============== show users
|
||||
sql show users
|
||||
if $rows != 4 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print $data00 $data01 $data02
|
||||
print $data10 $data11 $data22
|
||||
print $data20 $data11 $data22
|
||||
print $data30 $data31 $data32
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
#################################
|
||||
run general/user/basic.sim
|
||||
##################################
|
|
@ -0,0 +1,49 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ $# != 6 ]; then
|
||||
echo "argument list need input : "
|
||||
echo " -n nodeName"
|
||||
echo " -c configName"
|
||||
echo " -v configValue"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NODE_NAME=
|
||||
CONFIG_NAME=
|
||||
CONFIG_VALUE=
|
||||
while getopts "n:v:c:" arg
|
||||
do
|
||||
case $arg in
|
||||
n)
|
||||
NODE_NAME=$OPTARG
|
||||
;;
|
||||
c)
|
||||
CONFIG_NAME=$OPTARG
|
||||
;;
|
||||
v)
|
||||
CONFIG_VALUE=$OPTARG
|
||||
;;
|
||||
?)
|
||||
echo "unkonw argument"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
SCRIPT_DIR=`dirname $0`
|
||||
cd $SCRIPT_DIR/../
|
||||
SCRIPT_DIR=`pwd`
|
||||
|
||||
cd ../../
|
||||
TAOS_DIR=`pwd`
|
||||
|
||||
BUILD_DIR=$TAOS_DIR/debug/build
|
||||
SIM_DIR=$TAOS_DIR/sim
|
||||
|
||||
NODE_DIR=$SIM_DIR/$NODE_NAME
|
||||
TAOS_CFG=$NODE_DIR/cfg/taos.cfg
|
||||
TAOS_FLAG=$SIM_DIR/tsim/flag
|
||||
if [ -f "$TAOS_FLAG" ] ; then
|
||||
TAOS_CFG=/etc/taos/taos.cfg
|
||||
fi
|
||||
|
||||
echo "$CONFIG_NAME $CONFIG_VALUE" >> $TAOS_CFG
|
|
@ -0,0 +1,117 @@
|
|||
#!/bin/sh
|
||||
|
||||
echo "Executing clear.sh"
|
||||
|
||||
if [ $# != 6 ]; then
|
||||
echo "argument list need input : "
|
||||
echo " -n nodeName"
|
||||
echo " -i nodeIp"
|
||||
echo " -m masterIp"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NODE_NAME=
|
||||
NODE_IP=
|
||||
MSATER_IP=
|
||||
while getopts "n:i:m:" arg
|
||||
do
|
||||
case $arg in
|
||||
n)
|
||||
NODE_NAME=$OPTARG
|
||||
;;
|
||||
i)
|
||||
NODE_IP=$OPTARG
|
||||
;;
|
||||
m)
|
||||
MASTER_IP=$OPTARG
|
||||
;;
|
||||
?)
|
||||
echo "unkonw argument"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
SCRIPT_DIR=`dirname $0`
|
||||
cd $SCRIPT_DIR/../
|
||||
SCRIPT_DIR=`pwd`
|
||||
echo "SCRIPT_DIR: $SCRIPT_DIR"
|
||||
|
||||
cd ../../
|
||||
TAOS_DIR=`pwd`
|
||||
|
||||
BUILD_DIR=$TAOS_DIR/debug/build
|
||||
SIM_DIR=$TAOS_DIR/sim
|
||||
|
||||
NODE_DIR=$SIM_DIR/$NODE_NAME
|
||||
EXE_DIR=$BUILD_DIR/bin
|
||||
CFG_DIR=$NODE_DIR/cfg
|
||||
LOG_DIR=$NODE_DIR/log
|
||||
DATA_DIR=$NODE_DIR/data
|
||||
|
||||
#echo ============ deploy $NODE_NAME
|
||||
#echo === masterIp : $MASTER_IP
|
||||
#echo === nodeIp : $NODE_IP
|
||||
#echo === nodePath : $EXE_DIR
|
||||
#echo === cfgPath : $CFG_DIR
|
||||
#echo === logPath : $LOG_DIR
|
||||
#echo === dataPath : $DATA_DIR
|
||||
|
||||
# rm -rf $NODE_DIR
|
||||
|
||||
mkdir -p $SIM_DIR
|
||||
mkdir -p $NODE_DIR
|
||||
mkdir -p $LOG_DIR
|
||||
rm -rf $DATA_DIR
|
||||
mkdir -p $DATA_DIR
|
||||
|
||||
#cp -rf $TAOS_DIR/cfg $NODE_DIR/
|
||||
rm -rf $CFG_DIR
|
||||
mkdir -p $CFG_DIR
|
||||
|
||||
#allow normal user to read/write log
|
||||
chmod -R 777 $NODE_DIR
|
||||
|
||||
TAOS_CFG=$NODE_DIR/cfg/taos.cfg
|
||||
touch -f $TAOS_CFG
|
||||
|
||||
TAOS_FLAG=$SIM_DIR/tsim/flag
|
||||
if [ -f "$TAOS_FLAG" ] ; then
|
||||
TAOS_CFG=/etc/taos/taos.cfg
|
||||
DATA_DIR=/var/lib/taos
|
||||
LOG_DIR=/var/log/taos
|
||||
sudo rm -f /etc/taos/*.cfg
|
||||
sudo cp -rf $TAOS_DIR/cfg/*.cfg /etc/taos
|
||||
sudo rm -rf $DATA_DIR
|
||||
sudo rm -rf $LOG_DIR
|
||||
fi
|
||||
|
||||
echo " " >> $TAOS_CFG
|
||||
echo "masterIp $MASTER_IP" >> $TAOS_CFG
|
||||
echo "dataDir $DATA_DIR" >> $TAOS_CFG
|
||||
echo "logDir $LOG_DIR" >> $TAOS_CFG
|
||||
echo "publicIp $NODE_IP" >> $TAOS_CFG
|
||||
echo "internalIp $NODE_IP" >> $TAOS_CFG
|
||||
echo "privateIp $NODE_IP" >> $TAOS_CFG
|
||||
echo "dDebugFlag 135" >> $TAOS_CFG
|
||||
echo "mDebugFlag 135" >> $TAOS_CFG
|
||||
echo "sdbDebugFlag 135" >> $TAOS_CFG
|
||||
echo "rpcDebugFlag 131" >> $TAOS_CFG
|
||||
echo "tmrDebugFlag 131" >> $TAOS_CFG
|
||||
echo "cDebugFlag 135" >> $TAOS_CFG
|
||||
echo "httpDebugFlag 131" >> $TAOS_CFG
|
||||
echo "monitorDebugFlag 131" >> $TAOS_CFG
|
||||
echo "udebugFlag 131" >> $TAOS_CFG
|
||||
echo "jnidebugFlag 131" >> $TAOS_CFG
|
||||
echo "monitor 0" >> $TAOS_CFG
|
||||
echo "numOfThreadsPerCore 2.0" >> $TAOS_CFG
|
||||
echo "defaultPass taosdata" >> $TAOS_CFG
|
||||
echo "numOfLogLines 100000000" >> $TAOS_CFG
|
||||
echo "mgmtEqualVnodeNum 0" >> $TAOS_CFG
|
||||
echo "clog 0" >> $TAOS_CFG
|
||||
echo "statusInterval 1" >> $TAOS_CFG
|
||||
echo "numOfTotalVnodes 4" >> $TAOS_CFG
|
||||
echo "asyncLog 0" >> $TAOS_CFG
|
||||
echo "numOfMPeers 1" >> $TAOS_CFG
|
||||
echo "locale en_US.UTF-8" >> $TAOS_CFG
|
||||
|
||||
|
|
@ -0,0 +1,116 @@
|
|||
#!/bin/sh
|
||||
|
||||
echo "Executing deploy.sh"
|
||||
|
||||
if [ $# != 6 ]; then
|
||||
echo "argument list need input : "
|
||||
echo " -n nodeName"
|
||||
echo " -i nodeIp"
|
||||
echo " -m masterIp"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NODE_NAME=
|
||||
NODE_IP=
|
||||
MSATER_IP=
|
||||
while getopts "n:i:m:" arg
|
||||
do
|
||||
case $arg in
|
||||
n)
|
||||
NODE_NAME=$OPTARG
|
||||
;;
|
||||
i)
|
||||
NODE_IP=$OPTARG
|
||||
;;
|
||||
m)
|
||||
MASTER_IP=$OPTARG
|
||||
;;
|
||||
?)
|
||||
echo "unkonw argument"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
SCRIPT_DIR=`dirname $0`
|
||||
cd $SCRIPT_DIR/../
|
||||
SCRIPT_DIR=`pwd`
|
||||
echo "SCRIPT_DIR: $SCRIPT_DIR"
|
||||
|
||||
cd ../../
|
||||
TAOS_DIR=`pwd`
|
||||
|
||||
BUILD_DIR=$TAOS_DIR/debug/build
|
||||
SIM_DIR=$TAOS_DIR/sim
|
||||
|
||||
NODE_DIR=$SIM_DIR/$NODE_NAME
|
||||
EXE_DIR=$BUILD_DIR/bin
|
||||
CFG_DIR=$NODE_DIR/cfg
|
||||
LOG_DIR=$NODE_DIR/log
|
||||
DATA_DIR=$NODE_DIR/data
|
||||
|
||||
#echo ============ deploy $NODE_NAME
|
||||
#echo === masterIp : $MASTER_IP
|
||||
#echo === nodeIp : $NODE_IP
|
||||
#echo === nodePath : $EXE_DIR
|
||||
#echo === cfgPath : $CFG_DIR
|
||||
#echo === logPath : $LOG_DIR
|
||||
#echo === dataPath : $DATA_DIR
|
||||
|
||||
rm -rf $NODE_DIR
|
||||
|
||||
mkdir -p $SIM_DIR
|
||||
mkdir -p $NODE_DIR
|
||||
mkdir -p $LOG_DIR
|
||||
mkdir -p $DATA_DIR
|
||||
|
||||
#cp -rf $TAOS_DIR/cfg $NODE_DIR/
|
||||
mkdir -p $CFG_DIR
|
||||
|
||||
#allow normal user to read/write log
|
||||
chmod -R 777 $NODE_DIR
|
||||
|
||||
TAOS_CFG=$NODE_DIR/cfg/taos.cfg
|
||||
touch -f $TAOS_CFG
|
||||
|
||||
TAOS_FLAG=$SIM_DIR/tsim/flag
|
||||
if [ -f "$TAOS_FLAG" ] ; then
|
||||
TAOS_CFG=/etc/taos/taos.cfg
|
||||
DATA_DIR=/var/lib/taos
|
||||
LOG_DIR=/var/log/taos
|
||||
sudo rm -f /etc/taos/*.cfg
|
||||
sudo cp -rf $TAOS_DIR/cfg/*.cfg /etc/taos
|
||||
sudo rm -rf $DATA_DIR
|
||||
sudo rm -rf $LOG_DIR
|
||||
fi
|
||||
|
||||
echo " " >> $TAOS_CFG
|
||||
echo "masterIp $MASTER_IP" >> $TAOS_CFG
|
||||
echo "dataDir $DATA_DIR" >> $TAOS_CFG
|
||||
echo "logDir $LOG_DIR" >> $TAOS_CFG
|
||||
echo "publicIp $NODE_IP" >> $TAOS_CFG
|
||||
echo "internalIp $NODE_IP" >> $TAOS_CFG
|
||||
echo "privateIp $NODE_IP" >> $TAOS_CFG
|
||||
echo "dDebugFlag 135" >> $TAOS_CFG
|
||||
echo "mDebugFlag 135" >> $TAOS_CFG
|
||||
echo "sdbDebugFlag 135" >> $TAOS_CFG
|
||||
echo "rpcDebugFlag 135" >> $TAOS_CFG
|
||||
echo "tmrDebugFlag 131" >> $TAOS_CFG
|
||||
echo "cDebugFlag 135" >> $TAOS_CFG
|
||||
echo "httpDebugFlag 131" >> $TAOS_CFG
|
||||
echo "monitorDebugFlag 131" >> $TAOS_CFG
|
||||
echo "udebugFlag 131" >> $TAOS_CFG
|
||||
echo "jnidebugFlag 131" >> $TAOS_CFG
|
||||
echo "monitor 0" >> $TAOS_CFG
|
||||
echo "numOfThreadsPerCore 2.0" >> $TAOS_CFG
|
||||
echo "defaultPass taosdata" >> $TAOS_CFG
|
||||
echo "numOfLogLines 100000000" >> $TAOS_CFG
|
||||
echo "mgmtEqualVnodeNum 0" >> $TAOS_CFG
|
||||
echo "clog 0" >> $TAOS_CFG
|
||||
echo "statusInterval 1" >> $TAOS_CFG
|
||||
echo "numOfTotalVnodes 4" >> $TAOS_CFG
|
||||
echo "asyncLog 0" >> $TAOS_CFG
|
||||
echo "numOfMPeers 1" >> $TAOS_CFG
|
||||
echo "locale en_US.UTF-8" >> $TAOS_CFG
|
||||
echo "anyIp 0" >> $TAOS_CFG
|
||||
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
#!/bin/sh
|
||||
|
||||
# if [ $# != 4 || $# != 5 ]; then
|
||||
# echo "argument list need input : "
|
||||
# echo " -n nodeName"
|
||||
# echo " -s start/stop"
|
||||
# echo " -c clear"
|
||||
# exit 1
|
||||
# fi
|
||||
|
||||
NODE_NAME=
|
||||
EXEC_OPTON=
|
||||
CLEAR_OPTION="false"
|
||||
while getopts "n:s:u:x:ct" arg
|
||||
do
|
||||
case $arg in
|
||||
n)
|
||||
NODE_NAME=$OPTARG
|
||||
;;
|
||||
s)
|
||||
EXEC_OPTON=$OPTARG
|
||||
;;
|
||||
c)
|
||||
CLEAR_OPTION="clear"
|
||||
;;
|
||||
t)
|
||||
SHELL_OPTION="true"
|
||||
;;
|
||||
u)
|
||||
USERS=$OPTARG
|
||||
;;
|
||||
x)
|
||||
SIGNAL=$OPTARG
|
||||
;;
|
||||
?)
|
||||
echo "unkown argument"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
SCRIPT_DIR=`dirname $0`
|
||||
cd $SCRIPT_DIR/../
|
||||
SCRIPT_DIR=`pwd`
|
||||
|
||||
cd ../../
|
||||
TAOS_DIR=`pwd`
|
||||
|
||||
BUILD_DIR=$TAOS_DIR/debug/build
|
||||
SIM_DIR=$TAOS_DIR/sim
|
||||
NODE_DIR=$SIM_DIR/$NODE_NAME
|
||||
EXE_DIR=$BUILD_DIR/bin
|
||||
CFG_DIR=$NODE_DIR/cfg
|
||||
LOG_DIR=$NODE_DIR/log
|
||||
DATA_DIR=$NODE_DIR/data
|
||||
MGMT_DIR=$NODE_DIR/data/mgmt
|
||||
TSDB_DIR=$NODE_DIR/data/tsdb
|
||||
|
||||
TAOS_CFG=$NODE_DIR/cfg/taos.cfg
|
||||
|
||||
echo ------------ $EXEC_OPTON $NODE_NAME
|
||||
|
||||
TAOS_FLAG=$SIM_DIR/tsim/flag
|
||||
if [ -f "$TAOS_FLAG" ]; then
|
||||
EXE_DIR=/usr/local/bin/taos
|
||||
fi
|
||||
|
||||
if [ "$CLEAR_OPTION" = "clear" ]; then
|
||||
echo rm -rf $MGMT_DIR $TSDB_DIR
|
||||
rm -rf $TSDB_DIR
|
||||
rm -rf $MGMT_DIR
|
||||
fi
|
||||
|
||||
if [ "$SHELL_OPTION" = "true" ]; then
|
||||
if [ "$EXEC_OPTON" = "start" ]; then
|
||||
echo "ExcuteCmd:" $EXE_DIR/taos -c $CFG_DIR -u $USERS -p
|
||||
$EXE_DIR/taos -c $CFG_DIR -u $USERS -p
|
||||
else
|
||||
#relative path
|
||||
RCFG_DIR=sim/$NODE_NAME/cfg
|
||||
PID=`ps -ef|grep -v taosd | grep taos | grep $RCFG_DIR | grep -v grep | awk '{print $2}'`
|
||||
if [ -n "$PID" ]; then
|
||||
sudo kill -9 $PID
|
||||
fi
|
||||
fi
|
||||
return
|
||||
fi
|
||||
|
||||
if [ "$EXEC_OPTON" = "start" ]; then
|
||||
echo "ExcuteCmd:" $EXE_DIR/taosd -c $CFG_DIR
|
||||
nohup $EXE_DIR/taosd -c $CFG_DIR > /dev/null 2>&1 &
|
||||
#TT=`date +%s`
|
||||
#mkdir ${LOG_DIR}/${TT}
|
||||
#echo valgrind --log-file=${LOG_DIR}/${TT}/valgrind.log --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes $EXE_DIR/taosd -c $CFG_DIR
|
||||
#nohup valgrind --log-file=${LOG_DIR}/${TT}/valgrind.log --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes $EXE_DIR/taosd -c $CFG_DIR > /dev/null 2>&1 &
|
||||
|
||||
else
|
||||
#relative path
|
||||
RCFG_DIR=sim/$NODE_NAME/cfg
|
||||
PID=`ps -ef|grep taosd | grep $RCFG_DIR | grep -v grep | awk '{print $2}'`
|
||||
if [ -n "$PID" ]; then
|
||||
if [ "$SIGNAL" = "SIGINT" ]; then
|
||||
echo killed by signal
|
||||
sudo kill -sigint $PID
|
||||
else
|
||||
sudo kill -9 $PID
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
#!/bin/sh
|
||||
|
||||
#already create real card, such as 192.168.0.1-5
|
||||
#exit 0
|
||||
|
||||
if [ $# != 4 ]; then
|
||||
echo "argument list need input : "
|
||||
echo " -i if use [192.168.0.70 ] then input [70]"
|
||||
echo " -s up/down"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#just create ip like 192.168.0.*
|
||||
|
||||
IP_ADDRESS=
|
||||
EXEC_OPTON=
|
||||
while getopts "i:s:" arg
|
||||
do
|
||||
case $arg in
|
||||
i)
|
||||
IP_ADDRESS=$OPTARG
|
||||
;;
|
||||
s)
|
||||
EXEC_OPTON=$OPTARG
|
||||
;;
|
||||
?)
|
||||
echo "unkonw argument"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo ============ $EXEC_OPTON $IP_ADDRESS ===========
|
||||
sudo ifconfig lo:$IP_ADDRESS 192.168.0.$IP_ADDRESS $EXEC_OPTON
|
|
@ -0,0 +1,13 @@
|
|||
#!/bin/sh
|
||||
|
||||
PID=`ps -ef|grep /usr/bin/taosd | grep -v grep | awk '{print $2}'`
|
||||
if [ -n "$PID" ]; then
|
||||
echo sudo systemctl stop taosd
|
||||
sudo systemctl stop taosd
|
||||
fi
|
||||
|
||||
PID=`ps -ef|grep taosd | grep -v grep | awk '{print $2}'`
|
||||
if [ -n "$PID" ]; then
|
||||
echo sudo kill -9 $PID
|
||||
sudo kill -9 $PID
|
||||
fi
|
|
@ -0,0 +1,108 @@
|
|||
#!/bin/bash
|
||||
|
||||
##################################################
|
||||
#
|
||||
# Do simulation test
|
||||
#
|
||||
##################################################
|
||||
|
||||
set +e
|
||||
|
||||
FILE_NAME=
|
||||
RELEASE=0
|
||||
ASYNC=0
|
||||
while getopts "f:a" arg
|
||||
do
|
||||
case $arg in
|
||||
f)
|
||||
FILE_NAME=$OPTARG
|
||||
;;
|
||||
a)
|
||||
ASYNC=1
|
||||
;;
|
||||
?)
|
||||
echo "unknow argument"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
cd .
|
||||
sh/ip.sh -i 1 -s up > /dev/null 2>&1 &
|
||||
sh/ip.sh -i 2 -s up > /dev/null 2>&1 &
|
||||
sh/ip.sh -i 3 -s up > /dev/null 2>&1 &
|
||||
|
||||
# Get responsible directories
|
||||
CODE_DIR=`dirname $0`
|
||||
CODE_DIR=`pwd`
|
||||
cd ../../
|
||||
TOP_DIR=`pwd`
|
||||
BUILD_DIR=$TOP_DIR/debug/build
|
||||
SIM_DIR=$TOP_DIR/sim
|
||||
|
||||
if [ $ASYNC -eq 0 ]; then
|
||||
PROGRAM=$BUILD_DIR/bin/tsim
|
||||
else
|
||||
PROGRAM="$BUILD_DIR/bin/tsim -a"
|
||||
fi
|
||||
|
||||
PRG_DIR=$SIM_DIR/tsim
|
||||
CFG_DIR=$PRG_DIR/cfg
|
||||
LOG_DIR=$PRG_DIR/log
|
||||
DATA_DIR=$PRG_DIR/data
|
||||
|
||||
chmod -R 777 $PRG_DIR
|
||||
echo "------------------------------------------------------------------------"
|
||||
echo "Start TDengine Testing Case ..."
|
||||
echo "BUILD_DIR: $BUILD_DIR"
|
||||
echo "SIM_DIR : $SIM_DIR"
|
||||
echo "CODE_DIR : $CODE_DIR"
|
||||
echo "CFG_DIR : $CFG_DIR"
|
||||
|
||||
rm -rf $LOG_DIR
|
||||
rm -rf $CFG_DIR
|
||||
mkdir -p $PRG_DIR
|
||||
mkdir -p $LOG_DIR
|
||||
mkdir -p $CFG_DIR
|
||||
|
||||
TAOS_CFG=$PRG_DIR/cfg/taos.cfg
|
||||
touch -f $TAOS_CFG
|
||||
TAOS_FLAG=$PRG_DIR/flag
|
||||
|
||||
echo " " >> $TAOS_CFG
|
||||
echo "scriptDir ${CODE_DIR}/../script">> $TAOS_CFG
|
||||
echo "masterIp 192.168.0.1" >> $TAOS_CFG
|
||||
echo "secondIp 192.168.0.2" >> $TAOS_CFG
|
||||
echo "localIp 127.0.0.1" >> $TAOS_CFG
|
||||
echo "dataDir $DATA_DIR" >> $TAOS_CFG
|
||||
echo "logDir $LOG_DIR" >> $TAOS_CFG
|
||||
echo "numOfLogLines 100000000" >> $TAOS_CFG
|
||||
echo "dDebugFlag 135" >> $TAOS_CFG
|
||||
echo "mDebugFlag 135" >> $TAOS_CFG
|
||||
echo "sdbDebugFlag 135" >> $TAOS_CFG
|
||||
echo "rpcDebugFlag 135" >> $TAOS_CFG
|
||||
echo "tmrDebugFlag 131" >> $TAOS_CFG
|
||||
echo "cDebugFlag 135" >> $TAOS_CFG
|
||||
echo "httpDebugFlag 135" >> $TAOS_CFG
|
||||
echo "monitorDebugFlag 135" >> $TAOS_CFG
|
||||
echo "udebugFlag 135" >> $TAOS_CFG
|
||||
echo "clog 0" >> $TAOS_CFG
|
||||
echo "asyncLog 0" >> $TAOS_CFG
|
||||
echo "locale en_US.UTF-8" >> $TAOS_CFG
|
||||
echo " " >> $TAOS_CFG
|
||||
|
||||
ulimit -n 600000
|
||||
ulimit -c unlimited
|
||||
|
||||
#sudo sysctl -w kernel.core_pattern=$TOP_DIR/core.%p.%e
|
||||
|
||||
if [ -n "$FILE_NAME" ]; then
|
||||
echo "ExcuteCmd:" $PROGRAM -c $CFG_DIR -f $FILE_NAME
|
||||
echo "------------------------------------------------------------------------"
|
||||
#valgrind --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes --log-file=valgrind.log $PROGRAM -c $CFG_DIR -f $FILE_NAME
|
||||
$PROGRAM -c $CFG_DIR -f $FILE_NAME
|
||||
else
|
||||
echo "ExcuteCmd:" $PROGRAM -c $CFG_DIR -f basicSuite.sim
|
||||
echo "------------------------------------------------------------------------"
|
||||
$PROGRAM -c $CFG_DIR -f basicSuite.sim
|
||||
fi
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
system sh/stop_dnodes.sh
|
||||
system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1
|
||||
system sh/exec.sh -n dnode1 -s start
|
||||
sql connect
|
|
@ -0,0 +1,15 @@
|
|||
PROJECT(TDengine)
|
||||
|
||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
||||
INCLUDE_DIRECTORIES(inc)
|
||||
|
||||
IF (TD_WINDOWS_64)
|
||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/pthread)
|
||||
ENDIF ()
|
||||
|
||||
AUX_SOURCE_DIRECTORY(src SRC)
|
||||
ADD_EXECUTABLE(tsim ${SRC})
|
||||
TARGET_LINK_LIBRARIES(tsim taos_static trpc tutil pthread )
|
|
@ -0,0 +1,267 @@
|
|||
/*
|
||||
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef cJSON__h
|
||||
#define cJSON__h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/* project version */
|
||||
#define CJSON_VERSION_MAJOR 1
|
||||
#define CJSON_VERSION_MINOR 5
|
||||
#define CJSON_VERSION_PATCH 9
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* cJSON Types: */
|
||||
#define cJSON_Invalid (0)
|
||||
#define cJSON_False (1 << 0)
|
||||
#define cJSON_True (1 << 1)
|
||||
#define cJSON_NULL (1 << 2)
|
||||
#define cJSON_Number (1 << 3)
|
||||
#define cJSON_String (1 << 4)
|
||||
#define cJSON_Array (1 << 5)
|
||||
#define cJSON_Object (1 << 6)
|
||||
#define cJSON_Raw (1 << 7) /* raw json */
|
||||
|
||||
#define cJSON_IsReference 256
|
||||
#define cJSON_StringIsConst 512
|
||||
|
||||
/* The cJSON structure: */
|
||||
typedef struct cJSON
|
||||
{
|
||||
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
|
||||
struct cJSON *next;
|
||||
struct cJSON *prev;
|
||||
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
|
||||
struct cJSON *child;
|
||||
|
||||
/* The type of the item, as above. */
|
||||
int type;
|
||||
|
||||
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
|
||||
char *valuestring;
|
||||
/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
|
||||
int64_t valueint;
|
||||
/* The item's number, if type==cJSON_Number */
|
||||
double valuedouble;
|
||||
|
||||
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
|
||||
char *string;
|
||||
|
||||
//Keep the original string of number
|
||||
char numberstring[13];
|
||||
} cJSON;
|
||||
|
||||
typedef struct cJSON_Hooks
|
||||
{
|
||||
void *(*malloc_fn)(size_t sz);
|
||||
void (*free_fn)(void *ptr);
|
||||
} cJSON_Hooks;
|
||||
|
||||
typedef int cJSON_bool;
|
||||
|
||||
#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
|
||||
#define __WINDOWS__
|
||||
#endif
|
||||
#ifdef __WINDOWS__
|
||||
|
||||
/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 2 define options:
|
||||
|
||||
CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
|
||||
CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
|
||||
CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
|
||||
|
||||
For *nix builds that support visibility attribute, you can define similar behavior by
|
||||
|
||||
setting default visibility to hidden by adding
|
||||
-fvisibility=hidden (for gcc)
|
||||
or
|
||||
-xldscope=hidden (for sun cc)
|
||||
to CFLAGS
|
||||
|
||||
then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
|
||||
|
||||
*/
|
||||
|
||||
/* export symbols by default, this is necessary for copy pasting the C and header file */
|
||||
#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
|
||||
#define CJSON_EXPORT_SYMBOLS
|
||||
#endif
|
||||
|
||||
#if defined(CJSON_HIDE_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) type __stdcall
|
||||
#elif defined(CJSON_EXPORT_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) __declspec(dllexport) type __stdcall
|
||||
#elif defined(CJSON_IMPORT_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) __declspec(dllimport) type __stdcall
|
||||
#endif
|
||||
#else /* !WIN32 */
|
||||
#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
|
||||
#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
|
||||
#else
|
||||
#define CJSON_PUBLIC(type) type
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
|
||||
* This is to prevent stack overflows. */
|
||||
#ifndef CJSON_NESTING_LIMIT
|
||||
#define CJSON_NESTING_LIMIT 1000
|
||||
#endif
|
||||
|
||||
/* returns the version of cJSON as a string */
|
||||
CJSON_PUBLIC(const char*) cJSON_Version(void);
|
||||
|
||||
/* Supply malloc, realloc and free functions to cJSON */
|
||||
CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
|
||||
|
||||
/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
|
||||
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
|
||||
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
|
||||
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
|
||||
|
||||
/* Render a cJSON entity to text for transfer/storage. */
|
||||
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
|
||||
/* Render a cJSON entity to text for transfer/storage without any formatting. */
|
||||
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
|
||||
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
|
||||
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
|
||||
/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
|
||||
/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
|
||||
/* Delete a cJSON entity and all subentities. */
|
||||
CJSON_PUBLIC(void) cJSON_Delete(cJSON *c);
|
||||
|
||||
/* Returns the number of items in an array (or object). */
|
||||
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
|
||||
/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
|
||||
/* Get item "string" from object. Case insensitive. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
|
||||
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
|
||||
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
|
||||
|
||||
/* These functions check the type of an item */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
|
||||
|
||||
/* These calls create a cJSON item of the appropriate type. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
|
||||
/* raw json */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
|
||||
|
||||
/* These utilities create an Array of count items. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count);
|
||||
|
||||
/* Append item to the specified array/object. */
|
||||
CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item);
|
||||
CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
|
||||
/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
|
||||
* WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
|
||||
* writing to `item->string` */
|
||||
CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
|
||||
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
|
||||
CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
|
||||
CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
|
||||
|
||||
/* Remove/Detatch items from Arrays/Objects. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||
|
||||
/* Update array items. */
|
||||
CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
|
||||
CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
|
||||
CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
|
||||
CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
|
||||
|
||||
/* Duplicate a cJSON item */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
|
||||
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
|
||||
need to be released. With recurse!=0, it will duplicate any children connected to the item.
|
||||
The item->next and ->prev pointers are always zero on return from Duplicate. */
|
||||
/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
|
||||
* case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
|
||||
|
||||
|
||||
CJSON_PUBLIC(void) cJSON_Minify(char *json);
|
||||
|
||||
/* Macros for creating things quickly. */
|
||||
#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
|
||||
#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
|
||||
#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
|
||||
#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
|
||||
#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
|
||||
#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
|
||||
#define cJSON_AddRawToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(s))
|
||||
|
||||
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
|
||||
#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
|
||||
/* helper for the cJSON_SetNumberValue macro */
|
||||
CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
|
||||
#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
|
||||
|
||||
/* Macro for iterating over an array or object */
|
||||
#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
|
||||
|
||||
/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
|
||||
CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
|
||||
CJSON_PUBLIC(void) cJSON_free(void *object);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,186 @@
|
|||
/*******************************************************************
|
||||
* Copyright (c) 2001 by TAOS Networks, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This file is proprietary and confidential to TAOS Networks, Inc.
|
||||
* No part of this file may be reproduced, stored, transmitted,
|
||||
* disclosed or used in any form or by any means other than as
|
||||
* expressly provided by the written permission from Jianhui Tao
|
||||
*
|
||||
* ****************************************************************/
|
||||
|
||||
#ifndef __SIM_H__
|
||||
#define __SIM_H__
|
||||
|
||||
#include <semaphore.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "taos.h"
|
||||
#include "tidpool.h"
|
||||
#include "tlog.h"
|
||||
#include "tmodule.h"
|
||||
#include "tutil.h"
|
||||
|
||||
#define MAX_MAIN_SCRIPT_NUM 10
|
||||
#define MAX_BACKGROUND_SCRIPT_NUM 10
|
||||
#define MAX_FILE_NAME_LEN 256
|
||||
#define MAX_ERROR_LEN 1024
|
||||
#define MAX_QUERY_VALUE_LEN 40
|
||||
#define MAX_QUERY_COL_NUM 10
|
||||
#define MAX_QUERY_ROW_NUM 10
|
||||
#define MAX_SYSTEM_RESULT_LEN 2048
|
||||
#define MAX_VAR_LEN 100
|
||||
#define MAX_VAR_NAME_LEN 32
|
||||
#define MAX_VAR_VAL_LEN 80
|
||||
#define MAX_OPT_NAME_LEN 32
|
||||
#define MAX_SIM_CMD_NAME_LEN 40
|
||||
|
||||
#ifdef LINUX
|
||||
#define SUCCESS_PREFIX "\033[44;32;1m"
|
||||
#define SUCCESS_POSTFIX "\033[0m"
|
||||
#define FAILED_PREFIX "\033[44;31;1m"
|
||||
#define FAILED_POSTFIX "\033[0m"
|
||||
#else
|
||||
#define SUCCESS_PREFIX ""
|
||||
#define SUCCESS_POSTFIX ""
|
||||
#define FAILED_PREFIX ""
|
||||
#define FAILED_POSTFIX ""
|
||||
#endif
|
||||
|
||||
#define simError(...) \
|
||||
if (simDebugFlag & DEBUG_ERROR) { \
|
||||
tprintf("ERROR SIM ", 255, __VA_ARGS__); \
|
||||
}
|
||||
#define simWarn(...) \
|
||||
if (simDebugFlag & DEBUG_WARN) { \
|
||||
tprintf("WARN SIM ", simDebugFlag, __VA_ARGS__); \
|
||||
}
|
||||
#define simTrace(...) \
|
||||
if (simDebugFlag & DEBUG_TRACE) { \
|
||||
tprintf("SIM ", simDebugFlag, __VA_ARGS__); \
|
||||
}
|
||||
#define simDump(x, y) \
|
||||
if (simDebugFlag & DEBUG_DUMP) { \
|
||||
taosDumpData(x, y); \
|
||||
}
|
||||
#define simPrint(...) \
|
||||
{ tprintf("SIM ", 255, __VA_ARGS__); }
|
||||
|
||||
enum { SIM_SCRIPT_TYPE_MAIN, SIM_SCRIPT_TYPE_BACKGROUND };
|
||||
|
||||
enum {
|
||||
SIM_CMD_EXP,
|
||||
SIM_CMD_IF,
|
||||
SIM_CMD_ELIF,
|
||||
SIM_CMD_ELSE,
|
||||
SIM_CMD_ENDI,
|
||||
SIM_CMD_WHILE,
|
||||
SIM_CMD_ENDW,
|
||||
SIM_CMD_SWITCH,
|
||||
SIM_CMD_CASE,
|
||||
SIM_CMD_DEFAULT,
|
||||
SIM_CMD_CONTINUE,
|
||||
SIM_CMD_BREAK,
|
||||
SIM_CMD_ENDS,
|
||||
SIM_CMD_SLEEP,
|
||||
SIM_CMD_GOTO,
|
||||
SIM_CMD_RUN,
|
||||
SIM_CMD_RUN_BACK,
|
||||
SIM_CMD_PRINT,
|
||||
SIM_CMD_SYSTEM,
|
||||
SIM_CMD_SYSTEM_CONTENT,
|
||||
SIM_CMD_SQL,
|
||||
SIM_CMD_SQL_ERROR,
|
||||
SIM_CMD_SQL_SLOW,
|
||||
SIM_CMD_TEST,
|
||||
SIM_CMD_RETURN,
|
||||
SIM_CMD_END
|
||||
};
|
||||
|
||||
enum {
|
||||
SQL_JUMP_FALSE,
|
||||
SQL_JUMP_TRUE,
|
||||
};
|
||||
|
||||
struct _script_t;
|
||||
typedef struct _cmd_t {
|
||||
short cmdno;
|
||||
short nlen;
|
||||
char name[MAX_SIM_CMD_NAME_LEN];
|
||||
bool (*parseCmd)(char *, struct _cmd_t *, int);
|
||||
bool (*executeCmd)(struct _script_t *script, char *option);
|
||||
struct _cmd_t *next;
|
||||
} SCommand;
|
||||
|
||||
typedef struct {
|
||||
short cmdno;
|
||||
short jump; // jump position
|
||||
short errorJump; // sql jump flag, while '-x' exist in sql cmd, this flag
|
||||
// will be SQL_JUMP_TRUE, otherwise is SQL_JUMP_FALSE */
|
||||
short lineNum; // correspodning line number in original file
|
||||
int optionOffset; // relative option offset
|
||||
} SCmdLine;
|
||||
|
||||
typedef struct _var_t {
|
||||
char varName[MAX_VAR_NAME_LEN];
|
||||
char varValue[MAX_VAR_VAL_LEN];
|
||||
char varNameLen;
|
||||
} SVariable;
|
||||
|
||||
typedef struct _script_t {
|
||||
int type;
|
||||
bool killed;
|
||||
|
||||
void *taos;
|
||||
char rows[12]; // number of rows data retrieved
|
||||
char data[MAX_QUERY_ROW_NUM][MAX_QUERY_COL_NUM]
|
||||
[MAX_QUERY_VALUE_LEN]; // query results
|
||||
char system_exit_code[12];
|
||||
char system_ret_content[MAX_SYSTEM_RESULT_LEN];
|
||||
|
||||
int varLen;
|
||||
int linePos; // current cmd position
|
||||
int numOfLines; // number of lines in the script
|
||||
int bgScriptLen;
|
||||
char fileName[MAX_FILE_NAME_LEN]; // script file name
|
||||
char error[MAX_ERROR_LEN];
|
||||
char *optionBuffer;
|
||||
SCmdLine *lines; // command list
|
||||
SVariable variables[MAX_VAR_LEN];
|
||||
struct _script_t *bgScripts[MAX_BACKGROUND_SCRIPT_NUM];
|
||||
char auth[128];
|
||||
} SScript;
|
||||
|
||||
extern SScript *simScriptList[MAX_MAIN_SCRIPT_NUM];
|
||||
extern SCommand simCmdList[];
|
||||
extern int simScriptPos;
|
||||
extern int simScriptSucced;
|
||||
extern int simDebugFlag;
|
||||
extern char scriptDir[];
|
||||
extern bool simAsyncQuery;
|
||||
|
||||
SScript *simParseScript(char *fileName);
|
||||
|
||||
SScript *simProcessCallOver(SScript *script);
|
||||
void *simExecuteScript(void *script);
|
||||
void simInitsimCmdList();
|
||||
bool simSystemInit();
|
||||
void simSystemCleanUp();
|
||||
char *simGetVariable(SScript *script, char *varName, int varLen);
|
||||
bool simExecuteExpCmd(SScript *script, char *option);
|
||||
bool simExecuteTestCmd(SScript *script, char *option);
|
||||
bool simExecuteGotoCmd(SScript *script, char *option);
|
||||
bool simExecuteRunCmd(SScript *script, char *option);
|
||||
bool simExecuteRunBackCmd(SScript *script, char *option);
|
||||
bool simExecuteSystemCmd(SScript *script, char *option);
|
||||
bool simExecuteSystemContentCmd(SScript *script, char *option);
|
||||
bool simExecutePrintCmd(SScript *script, char *option);
|
||||
bool simExecuteSleepCmd(SScript *script, char *option);
|
||||
bool simExecuteReturnCmd(SScript *script, char *option);
|
||||
bool simExecuteSqlCmd(SScript *script, char *option);
|
||||
bool simExecuteSqlErrorCmd(SScript *script, char *rest);
|
||||
bool simExecuteSqlSlowCmd(SScript *script, char *option);
|
||||
void simVisuallizeOption(SScript *script, char *src, char *dst);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||
*
|
||||
* This program is free software: you can use, redistribute, and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3
|
||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __SIM_PARSE_H__
|
||||
#define __SIM_PARSE_H__
|
||||
|
||||
#define MAX_NUM_CMD 64
|
||||
#define MAX_NUM_LABLES 100
|
||||
#define MAX_LABEL_LEN 40
|
||||
#define MAX_NUM_BLOCK 100
|
||||
#define MAX_NUM_JUMP 100
|
||||
#define MAX_LINE_LEN 3000
|
||||
#define MAX_CMD_LINES 2048
|
||||
#define MAX_OPTION_BUFFER 64000
|
||||
|
||||
enum {
|
||||
BLOCK_IF,
|
||||
BLOCK_WHILE,
|
||||
BLOCK_SWITCH,
|
||||
};
|
||||
|
||||
/* label stack */
|
||||
typedef struct {
|
||||
char top; /* number of labels */
|
||||
short pos[MAX_NUM_LABLES]; /* the position of the label */
|
||||
char label[MAX_NUM_LABLES][MAX_LABEL_LEN]; /* name of the label */
|
||||
} SLabel;
|
||||
|
||||
/* block definition */
|
||||
typedef struct {
|
||||
char top; /* the number of blocks stacked */
|
||||
char type[MAX_NUM_BLOCK]; /* the block type */
|
||||
short *pos[MAX_NUM_BLOCK]; /* position of the jump for if/elif/case */
|
||||
short back[MAX_NUM_BLOCK]; /* go back, endw and continue */
|
||||
char numJump[MAX_NUM_BLOCK];
|
||||
short *jump[MAX_NUM_BLOCK][MAX_NUM_JUMP]; /* break or elif */
|
||||
char sexp[MAX_NUM_BLOCK][40]; /*switch expression */
|
||||
char sexpLen[MAX_NUM_BLOCK]; /*switch expression length */
|
||||
} SBlock;
|
||||
|
||||
bool simParseExpression(char *token, int lineNum);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,911 @@
|
|||
/*******************************************************************
|
||||
* Copyright (c) 2001 by TAOS Networks, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This file is proprietary and confidential to TAOS Networks, Inc.
|
||||
* No part of this file may be reproduced, stored, transmitted,
|
||||
* disclosed or used in any form or by any means other than as
|
||||
* expressly provided by the written permission from Jianhui Tao
|
||||
*
|
||||
* ****************************************************************/
|
||||
#include "os.h"
|
||||
#include "sim.h"
|
||||
#include "taos.h"
|
||||
#include "taoserror.h"
|
||||
#include "tglobalcfg.h"
|
||||
#include "tutil.h"
|
||||
#include "cJSON.h"
|
||||
|
||||
void simLogSql(char *sql) {
|
||||
static FILE *fp = NULL;
|
||||
char filename[256];
|
||||
sprintf(filename, "%s/sim.sql", scriptDir);
|
||||
if (fp == NULL) {
|
||||
fp = fopen(filename, "w");
|
||||
if (fp == NULL) {
|
||||
fprintf(stderr, "ERROR: failed to open file: %s\n", filename);
|
||||
return;
|
||||
}
|
||||
}
|
||||
fprintf(fp, "%s;\n", sql);
|
||||
fflush(fp);
|
||||
}
|
||||
|
||||
char *simGetVariable(SScript *script, char *varName, int varLen) {
|
||||
if (strncmp(varName, "error", varLen) == 0) return script->error;
|
||||
|
||||
if (strncmp(varName, "rows", varLen) == 0) return script->rows;
|
||||
|
||||
if (strncmp(varName, "system_exit", varLen) == 0)
|
||||
return script->system_exit_code;
|
||||
|
||||
if (strncmp(varName, "system_content", varLen) == 0)
|
||||
return script->system_ret_content;
|
||||
|
||||
// variable like data2_192.168.0.1
|
||||
if (strncmp(varName, "data", 4) == 0) {
|
||||
if (varLen < 6) {
|
||||
return "null";
|
||||
}
|
||||
|
||||
if (varName[5] == '_') {
|
||||
int col = varName[4] - '0';
|
||||
if (col < 0 || col >= MAX_QUERY_COL_NUM) {
|
||||
return "null";
|
||||
}
|
||||
|
||||
char *keyName;
|
||||
int keyLen;
|
||||
paGetToken(varName + 6, &keyName, &keyLen);
|
||||
|
||||
for (int i = 0; i < MAX_QUERY_ROW_NUM; ++i) {
|
||||
if (strncmp(keyName, script->data[i][0], keyLen) == 0) {
|
||||
simTrace("script:%s, keyName:%s, keyValue:%s", script->fileName, script->data[i][0], script->data[i][col]);
|
||||
return script->data[i][col];
|
||||
}
|
||||
}
|
||||
return "null";
|
||||
} else {
|
||||
int row = varName[4] - '0';
|
||||
int col = varName[5] - '0';
|
||||
if (row < 0 || row >= MAX_QUERY_ROW_NUM) {
|
||||
return "null";
|
||||
}
|
||||
if (col < 0 || col >= MAX_QUERY_COL_NUM) {
|
||||
return "null";
|
||||
}
|
||||
|
||||
simTrace("script:%s, data[%d][%d]=%s", script->fileName, row, col, script->data[row][col]);
|
||||
return script->data[row][col];
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < script->varLen; ++i) {
|
||||
SVariable *var = &script->variables[i];
|
||||
if (var->varNameLen != varLen) {
|
||||
continue;
|
||||
}
|
||||
if (strncmp(varName, var->varName, varLen) == 0) {
|
||||
// if (strlen(var->varValue) != 0)
|
||||
// simTrace("script:%s, var:%s, value:%s", script->fileName,
|
||||
// var->varName, var->varValue);
|
||||
return var->varValue;
|
||||
}
|
||||
}
|
||||
|
||||
if (script->varLen >= MAX_VAR_LEN) {
|
||||
simError("script:%s, too many varialbes:%d", script->fileName, script->varLen);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
SVariable *var = &script->variables[script->varLen];
|
||||
script->varLen++;
|
||||
strncpy(var->varName, varName, varLen);
|
||||
var->varNameLen = varLen;
|
||||
var->varValue[0] = 0;
|
||||
return var->varValue;
|
||||
}
|
||||
|
||||
int simExecuteExpression(SScript *script, char *exp) {
|
||||
char *op1, *op2, *var1, *var2, *var3, *rest;
|
||||
int op1Len, op2Len, var1Len, var2Len, var3Len, val0, val1;
|
||||
char t0[512], t1[512], t2[512], t3[512];
|
||||
int result;
|
||||
|
||||
rest = paGetToken(exp, &var1, &var1Len);
|
||||
rest = paGetToken(rest, &op1, &op1Len);
|
||||
rest = paGetToken(rest, &var2, &var2Len);
|
||||
rest = paGetToken(rest, &op2, &op2Len);
|
||||
|
||||
if (var1[0] == '$')
|
||||
strcpy(t0, simGetVariable(script, var1 + 1, var1Len - 1));
|
||||
else {
|
||||
memcpy(t0, var1, var1Len);
|
||||
t0[var1Len] = 0;
|
||||
}
|
||||
|
||||
if (var2[0] == '$')
|
||||
strcpy(t1, simGetVariable(script, var2 + 1, var2Len - 1));
|
||||
else {
|
||||
memcpy(t1, var2, var2Len);
|
||||
t1[var2Len] = 0;
|
||||
}
|
||||
|
||||
if (op2Len != 0) {
|
||||
rest = paGetToken(rest, &var3, &var3Len);
|
||||
|
||||
if (var3[0] == '$')
|
||||
strcpy(t2, simGetVariable(script, var3 + 1, var3Len - 1));
|
||||
else {
|
||||
memcpy(t2, var3, var3Len);
|
||||
t2[var3Len] = 0;
|
||||
}
|
||||
|
||||
if (op2[0] == '+') {
|
||||
sprintf(t3, "%lld", atoll(t1) + atoll(t2));
|
||||
} else if (op2[0] == '-') {
|
||||
sprintf(t3, "%lld", atoll(t1) - atoll(t2));
|
||||
} else if (op2[0] == '*') {
|
||||
sprintf(t3, "%lld", atoll(t1) * atoll(t2));
|
||||
} else if (op2[0] == '/') {
|
||||
sprintf(t3, "%lld", atoll(t1) / atoll(t2));
|
||||
} else if (op2[0] == '.') {
|
||||
sprintf(t3, "%s%s", t1, t2);
|
||||
}
|
||||
} else {
|
||||
strcpy(t3, t1);
|
||||
}
|
||||
|
||||
result = 0;
|
||||
|
||||
if (op1Len == 1) {
|
||||
if (op1[0] == '=') {
|
||||
strcpy(simGetVariable(script, var1 + 1, var1Len - 1), t3);
|
||||
} else if (op1[0] == '<') {
|
||||
val0 = atoi(t0);
|
||||
val1 = atoi(t3);
|
||||
if (val0 >= val1) result = -1;
|
||||
} else if (op1[0] == '>') {
|
||||
val0 = atoi(t0);
|
||||
val1 = atoi(t3);
|
||||
if (val0 <= val1) result = -1;
|
||||
}
|
||||
} else {
|
||||
if (op1[0] == '=' && op1[1] == '=') {
|
||||
if (strcmp(t0, t3) != 0) result = -1;
|
||||
} else if (op1[0] == '!' && op1[1] == '=') {
|
||||
if (strcmp(t0, t3) == 0) result = -1;
|
||||
} else if (op1[0] == '<' && op1[1] == '=') {
|
||||
val0 = atoi(t0);
|
||||
val1 = atoi(t3);
|
||||
if (val0 > val1) result = -1;
|
||||
} else if (op1[0] == '>' && op1[1] == '=') {
|
||||
val0 = atoi(t0);
|
||||
val1 = atoi(t3);
|
||||
if (val0 < val1) result = -1;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool simExecuteExpCmd(SScript *script, char *option) {
|
||||
simExecuteExpression(script, option);
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteTestCmd(SScript *script, char *option) {
|
||||
int result;
|
||||
result = simExecuteExpression(script, option);
|
||||
|
||||
if (result >= 0)
|
||||
script->linePos++;
|
||||
else
|
||||
script->linePos = script->lines[script->linePos].jump;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteGotoCmd(SScript *script, char *option) {
|
||||
script->linePos = script->lines[script->linePos].jump;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteRunCmd(SScript *script, char *option) {
|
||||
char *fileName = option;
|
||||
if (fileName == NULL || strlen(fileName) == 0) {
|
||||
sprintf(script->error, "lineNum:%d. script file is null", script->lines[script->linePos].lineNum);
|
||||
return false;
|
||||
}
|
||||
|
||||
SScript *newScript = simParseScript(option);
|
||||
if (newScript == NULL) {
|
||||
sprintf(script->error, "lineNum:%d. parse file:%s error", script->lines[script->linePos].lineNum, fileName);
|
||||
return false;
|
||||
}
|
||||
|
||||
simPrint("script:%s, start to execute", newScript->fileName);
|
||||
|
||||
newScript->type = SIM_SCRIPT_TYPE_MAIN;
|
||||
simScriptPos++;
|
||||
simScriptList[simScriptPos] = newScript;
|
||||
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteRunBackCmd(SScript *script, char *option) {
|
||||
char *fileName = option;
|
||||
if (fileName == NULL || strlen(fileName) == 0) {
|
||||
sprintf(script->error, "lineNum:%d. script file is null", script->lines[script->linePos].lineNum);
|
||||
return false;
|
||||
}
|
||||
|
||||
SScript *newScript = simParseScript(option);
|
||||
if (newScript == NULL) {
|
||||
sprintf(script->error, "lineNum:%d. parse file:%s error", script->lines[script->linePos].lineNum, fileName);
|
||||
return false;
|
||||
}
|
||||
simPrint("script:%s, start to execute in background", newScript->fileName);
|
||||
|
||||
newScript->type = SIM_SCRIPT_TYPE_BACKGROUND;
|
||||
script->bgScripts[script->bgScriptLen++] = newScript;
|
||||
|
||||
pthread_t pid;
|
||||
if (pthread_create(&pid, NULL, simExecuteScript, (void *)newScript) != 0) {
|
||||
sprintf(script->error, "lineNum:%d. create background thread failed", script->lines[script->linePos].lineNum);
|
||||
return false;
|
||||
}
|
||||
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteSystemCmd(SScript *script, char *option) {
|
||||
char buf[4096] = {0};
|
||||
|
||||
sprintf(buf, "cd %s; ", scriptDir);
|
||||
simVisuallizeOption(script, option, buf + strlen(buf));
|
||||
|
||||
int code = system(buf);
|
||||
int repeatTimes = 0;
|
||||
while (code < 0) {
|
||||
simError("script:%s, failed to execute %s , code %d, errno:%d %s, repeatTimes:%d",
|
||||
script->fileName, buf, code, errno, strerror(errno), repeatTimes);
|
||||
taosMsleep(1000);
|
||||
signal(SIGCHLD, SIG_DFL);
|
||||
if (repeatTimes++ >= 10) {
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(script->system_exit_code, "%d", code);
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
void simStoreSystemContentResult(SScript *script, char *filename) {
|
||||
memset(script->system_ret_content, 0, MAX_SYSTEM_RESULT_LEN);
|
||||
|
||||
FILE *fd;
|
||||
if ((fd = fopen(filename, "r")) != NULL) {
|
||||
fread(script->system_ret_content, 1, MAX_SYSTEM_RESULT_LEN - 1, fd);
|
||||
fclose(fd);
|
||||
char rmCmd[MAX_FILE_NAME_LEN] = {0};
|
||||
sprintf(rmCmd, "rm -f %s", filename);
|
||||
system(rmCmd);
|
||||
}
|
||||
}
|
||||
|
||||
bool simExecuteSystemContentCmd(SScript *script, char *option) {
|
||||
char buf[4096] = {0};
|
||||
char filename[400] = {0};
|
||||
sprintf(filename, "%s/%s.tmp", scriptDir, script->fileName);
|
||||
|
||||
sprintf(buf, "cd %s; ", scriptDir);
|
||||
simVisuallizeOption(script, option, buf + strlen(buf));
|
||||
sprintf(buf, "%s > %s 2>/dev/null", buf, filename);
|
||||
|
||||
sprintf(script->system_exit_code, "%d", system(buf));
|
||||
simStoreSystemContentResult(script, filename);
|
||||
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecutePrintCmd(SScript *script, char *rest) {
|
||||
char buf[65536];
|
||||
|
||||
simVisuallizeOption(script, rest, buf);
|
||||
rest = buf;
|
||||
|
||||
simPrint("script:%s, %s", script->fileName, rest);
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteSleepCmd(SScript *script, char *option) {
|
||||
int delta;
|
||||
char buf[1024];
|
||||
|
||||
simVisuallizeOption(script, option, buf);
|
||||
option = buf;
|
||||
|
||||
delta = atoi(option);
|
||||
if (delta <= 0) delta = 5;
|
||||
|
||||
simPrint("script:%s, sleep %dms begin", script->fileName, delta);
|
||||
taosMsleep(delta);
|
||||
simPrint("script:%s, sleep %dms finished", script->fileName, delta);
|
||||
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteReturnCmd(SScript *script, char *option) {
|
||||
char buf[1024];
|
||||
|
||||
simVisuallizeOption(script, option, buf);
|
||||
option = buf;
|
||||
|
||||
int ret = 1;
|
||||
if (option && option[0] != 0) ret = atoi(option);
|
||||
|
||||
if (ret < 0) {
|
||||
sprintf(script->error, "lineNum:%d. error return %s", script->lines[script->linePos].lineNum, option);
|
||||
return false;
|
||||
} else {
|
||||
simPrint("script:%s, return cmd execute with:%d", script->fileName, ret);
|
||||
script->linePos = script->numOfLines;
|
||||
}
|
||||
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
void simVisuallizeOption(SScript *script, char *src, char *dst) {
|
||||
char *var, *token, *value;
|
||||
int dstLen, srcLen, tokenLen;
|
||||
|
||||
dst[0] = 0, dstLen = 0;
|
||||
|
||||
while (1) {
|
||||
var = strchr(src, '$');
|
||||
if (var == NULL) break;
|
||||
if (var && ((var - src - 1) > 0) && *(var - 1) == '\\') {
|
||||
srcLen = var - src - 1;
|
||||
memcpy(dst + dstLen, src, srcLen);
|
||||
dstLen += srcLen;
|
||||
src = var;
|
||||
break;
|
||||
}
|
||||
|
||||
srcLen = var - src;
|
||||
memcpy(dst + dstLen, src, srcLen);
|
||||
dstLen += srcLen;
|
||||
|
||||
src = paGetToken(var + 1, &token, &tokenLen);
|
||||
value = simGetVariable(script, token, tokenLen);
|
||||
|
||||
strcpy(dst + dstLen, value);
|
||||
dstLen += strlen(value);
|
||||
}
|
||||
|
||||
strcpy(dst + dstLen, src);
|
||||
}
|
||||
|
||||
void simCloseRestFulConnect(SScript *script) {
|
||||
memset(script->auth, 0, sizeof(script->auth));
|
||||
}
|
||||
|
||||
void simCloseNativeConnect(SScript *script) {
|
||||
if (script->taos == NULL) return;
|
||||
|
||||
simTrace("script:%s, taos:%p closed", script->fileName, script->taos);
|
||||
taos_close(script->taos);
|
||||
|
||||
script->taos = NULL;
|
||||
}
|
||||
|
||||
void simCloseTaosdConnect(SScript *script) {
|
||||
if (simAsyncQuery) {
|
||||
return simCloseRestFulConnect(script);
|
||||
} else {
|
||||
return simCloseNativeConnect(script);
|
||||
}
|
||||
}
|
||||
// {"status":"succ","code":0,"desc":"/KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04"}
|
||||
// {"status":"succ","head":["affected_rows"],"data":[[1]],"rows":1}
|
||||
// {"status":"succ","head":["ts","i"],"data":[["2017-12-25 21:28:41.022",1],["2017-12-25 21:28:42.022",2],["2017-12-25 21:28:43.022",3],["2017-12-25 21:28:44.022",4],["2017-12-25 21:28:45.022",5],["2017-12-25 21:28:46.022",6],["2017-12-25 21:28:47.022",7],["2017-12-25 21:28:48.022",8],["2017-12-25 21:28:49.022",9],["2017-12-25 21:28:50.022",10]],"rows":10}
|
||||
int simParseHttpCommandResult(SScript *script, char *command) {
|
||||
cJSON* root = cJSON_Parse(command);
|
||||
if (root == NULL) {
|
||||
simError("script:%s, failed to parse json, response:%s", script->fileName, command);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cJSON *status = cJSON_GetObjectItem(root, "status");
|
||||
if (status == NULL) {
|
||||
simError("script:%s, failed to parse json, status is null, response:%s", script->fileName, command);
|
||||
cJSON_Delete(root);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (status->valuestring == NULL || strlen(status->valuestring) == 0) {
|
||||
simError("script:%s, failed to parse json, status value is null, response:%s", script->fileName, command);
|
||||
cJSON_Delete(root);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (strcmp(status->valuestring, "succ") != 0) {
|
||||
cJSON *code = cJSON_GetObjectItem(root, "code");
|
||||
if (code == NULL) {
|
||||
simError("script:%s, failed to parse json, code is null, response:%s", script->fileName, command);
|
||||
cJSON_Delete(root);
|
||||
return -1;
|
||||
}
|
||||
int retcode = (int)code->valueint;
|
||||
if (retcode != 1017) {
|
||||
simError("script:%s, json:status:%s not equal to succ, response:%s", script->fileName, status->valuestring, command);
|
||||
cJSON_Delete(root);
|
||||
return retcode;
|
||||
} else {
|
||||
simTrace("script:%s, json:status:%s not equal to succ, but code is %d, response:%s", script->fileName,
|
||||
status->valuestring, retcode, command);
|
||||
cJSON_Delete(root);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
cJSON *desc = cJSON_GetObjectItem(root, "desc");
|
||||
if (desc != NULL) {
|
||||
if (desc->valuestring == NULL || strlen(desc->valuestring) == 0) {
|
||||
simError("script:%s, failed to parse json, desc value is null, response:%s", script->fileName, command);
|
||||
cJSON_Delete(root);
|
||||
return -1;
|
||||
}
|
||||
strcpy(script->auth, desc->valuestring);
|
||||
cJSON_Delete(root);
|
||||
return 0;
|
||||
}
|
||||
|
||||
cJSON *data = cJSON_GetObjectItem(root, "data");
|
||||
if (data == NULL) {
|
||||
simError("script:%s, failed to parse json, data is null, response:%s", script->fileName, command);
|
||||
cJSON_Delete(root);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rowsize = cJSON_GetArraySize(data);
|
||||
if (rowsize < 0) {
|
||||
simError("script:%s, failed to parse json:data, data size %d, response:%s", script->fileName, rowsize, command);
|
||||
cJSON_Delete(root);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rowIndex = 0;
|
||||
sprintf(script->rows, "%d", rowsize);
|
||||
for (int r = 0; r < rowsize; ++r) {
|
||||
cJSON *row = cJSON_GetArrayItem(data, r);
|
||||
if (row == NULL) continue;
|
||||
if (rowIndex++ >= 10) break;
|
||||
|
||||
int colsize = cJSON_GetArraySize(row);
|
||||
if (colsize < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
colsize = MIN(10, colsize);
|
||||
for (int c = 0; c < colsize; ++c) {
|
||||
cJSON *col = cJSON_GetArrayItem(row, c);
|
||||
if (col->valuestring != NULL) {
|
||||
strcpy(script->data[r][c], col->valuestring);
|
||||
} else {
|
||||
if (col->numberstring[0] == 0) {
|
||||
strcpy(script->data[r][c], "null");
|
||||
} else {
|
||||
strcpy(script->data[r][c], col->numberstring);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int simExecuteRestFulCommand(SScript *script, char *command) {
|
||||
char buf[5000] = {0};
|
||||
sprintf(buf, "%s 2>/dev/null", command);
|
||||
|
||||
FILE *fp = popen(buf, "r");
|
||||
if (fp == NULL) {
|
||||
simError("failed to execute %s", buf);
|
||||
return TSDB_CODE_OTHERS;
|
||||
}
|
||||
|
||||
int mallocSize = 2000;
|
||||
int alreadyReadSize = 0;
|
||||
char* content = malloc(mallocSize);
|
||||
|
||||
while (!feof(fp)) {
|
||||
int availSize = mallocSize - alreadyReadSize;
|
||||
int len = fread(content + alreadyReadSize, 1, availSize, fp);
|
||||
if (len >= availSize) {
|
||||
alreadyReadSize += len;
|
||||
mallocSize *= 2;
|
||||
content = realloc(content, mallocSize);
|
||||
}
|
||||
}
|
||||
|
||||
pclose(fp);
|
||||
|
||||
return simParseHttpCommandResult(script, content);
|
||||
}
|
||||
|
||||
bool simCreateRestFulConnect(SScript *script, char *user, char *pass) {
|
||||
char command[4096];
|
||||
sprintf(command, "curl 127.0.0.1:6020/rest/login/%s/%s", user, pass);
|
||||
|
||||
bool success = false;
|
||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||
success = simExecuteRestFulCommand(script, command) == 0;
|
||||
if (!success) {
|
||||
simTrace("script:%s, user:%s connect taosd failed:%s, attempt:%d", script->fileName, user, taos_errstr(NULL), attempt);
|
||||
taosMsleep(1000);
|
||||
} else {
|
||||
simTrace("script:%s, user:%s connect taosd successed, attempt:%d", script->fileName, user, attempt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
sprintf(script->error, "lineNum:%d. connect taosd failed:%s", script->lines[script->linePos].lineNum, taos_errstr(NULL));
|
||||
return false;
|
||||
}
|
||||
|
||||
simTrace("script:%s, connect taosd successed, auth:%p", script->fileName, script->auth);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simCreateNativeConnect(SScript *script, char *user, char *pass) {
|
||||
simCloseTaosdConnect(script);
|
||||
void *taos = NULL;
|
||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||
taos = taos_connect(NULL, user, pass, NULL, tsMnodeShellPort);
|
||||
if (taos == NULL) {
|
||||
simTrace("script:%s, user:%s connect taosd failed:%s, attempt:%d", script->fileName, user, taos_errstr(NULL), attempt);
|
||||
taosMsleep(1000);
|
||||
} else {
|
||||
simTrace("script:%s, user:%s connect taosd successed, attempt:%d", script->fileName, user, attempt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (taos == NULL) {
|
||||
sprintf(script->error, "lineNum:%d. connect taosd failed:%s", script->lines[script->linePos].lineNum, taos_errstr(NULL));
|
||||
return false;
|
||||
}
|
||||
|
||||
script->taos = taos;
|
||||
simTrace("script:%s, connect taosd successed, taos:%p", script->fileName, taos);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simCreateTaosdConnect(SScript *script, char *rest) {
|
||||
char *user = tsDefaultUser;
|
||||
char *token;
|
||||
int tokenLen;
|
||||
rest = paGetToken(rest, &token, &tokenLen);
|
||||
rest = paGetToken(rest, &token, &tokenLen);
|
||||
if (tokenLen != 0) {
|
||||
user = token;
|
||||
}
|
||||
|
||||
if (simAsyncQuery) {
|
||||
return simCreateRestFulConnect(script, user, tsDefaultPass);
|
||||
} else {
|
||||
return simCreateNativeConnect(script, user, tsDefaultPass);
|
||||
}
|
||||
}
|
||||
|
||||
bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
|
||||
char timeStr[30] = {0};
|
||||
time_t tt;
|
||||
struct tm *tp;
|
||||
SCmdLine *line = &script->lines[script->linePos];
|
||||
int ret = -1;
|
||||
|
||||
for (int attempt = 0; attempt < 3; ++attempt) {
|
||||
simLogSql(rest);
|
||||
ret = taos_query(script->taos, rest);
|
||||
if (ret == TSDB_CODE_TABLE_ALREADY_EXIST ||
|
||||
ret == TSDB_CODE_DB_ALREADY_EXIST) {
|
||||
simTrace("script:%s, taos:%p, %s success, ret:%d:%s", script->fileName, script->taos, rest, ret, tstrerror(ret));
|
||||
ret = 0;
|
||||
break;
|
||||
} else if (ret != 0) {
|
||||
simTrace("script:%s, taos:%p, %s failed, ret:%d:%s, error:%s",
|
||||
script->fileName, script->taos, rest, ret, tstrerror(ret), taos_errstr(script->taos));
|
||||
|
||||
if (line->errorJump == SQL_JUMP_TRUE) {
|
||||
script->linePos = line->jump;
|
||||
return true;
|
||||
}
|
||||
taosMsleep(1000);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
sprintf(script->error, "lineNum:%d. sql:%s failed, ret:%d:%s", line->lineNum, rest, ret, tstrerror(ret));
|
||||
return false;
|
||||
}
|
||||
|
||||
int numOfRows = 0;
|
||||
int num_fields = taos_field_count(script->taos);
|
||||
if (num_fields != 0) {
|
||||
TAOS_RES *result = taos_use_result(script->taos);
|
||||
if (result == NULL) {
|
||||
simTrace("script:%s, taos:%p, %s failed, result is null", script->fileName, script->taos, rest);
|
||||
if (line->errorJump == SQL_JUMP_TRUE) {
|
||||
script->linePos = line->jump;
|
||||
return true;
|
||||
}
|
||||
|
||||
sprintf(script->error, "lineNum:%d. result set null, sql:%s", line->lineNum, rest);
|
||||
return false;
|
||||
}
|
||||
|
||||
TAOS_ROW row;
|
||||
|
||||
while ((row = taos_fetch_row(result))) {
|
||||
if (numOfRows < MAX_QUERY_ROW_NUM) {
|
||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||
for (int i = 0; i < num_fields; i++) {
|
||||
char *value = NULL;
|
||||
if (i < MAX_QUERY_COL_NUM) {
|
||||
value = script->data[numOfRows][i];
|
||||
}
|
||||
if (value == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (row[i] == 0) {
|
||||
strcpy(value, "null");
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (fields[i].type) {
|
||||
case TSDB_DATA_TYPE_BOOL:
|
||||
sprintf(value, "%s",
|
||||
((((int)(*((char *)row[i]))) == 1) ? "1" : "0"));
|
||||
break;
|
||||
case TSDB_DATA_TYPE_TINYINT:
|
||||
sprintf(value, "%d", (int)(*((char *)row[i])));
|
||||
break;
|
||||
case TSDB_DATA_TYPE_SMALLINT:
|
||||
sprintf(value, "%d", (int)(*((short *)row[i])));
|
||||
break;
|
||||
case TSDB_DATA_TYPE_INT:
|
||||
sprintf(value, "%d", *((int *)row[i]));
|
||||
break;
|
||||
case TSDB_DATA_TYPE_BIGINT:
|
||||
#ifdef _TD_ARM_32_
|
||||
sprintf(value, "%lld", *((int64_t *)row[i]));
|
||||
#else
|
||||
sprintf(value, "%ld", *((int64_t *)row[i]));
|
||||
#endif
|
||||
break;
|
||||
case TSDB_DATA_TYPE_FLOAT:{
|
||||
#ifdef _TD_ARM_32_
|
||||
float fv = 0;
|
||||
*(int32_t*)(&fv) = *(int32_t*)row[i];
|
||||
sprintf(value, "%.5f", fv);
|
||||
#else
|
||||
sprintf(value, "%.5f", *((float *)row[i]));
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case TSDB_DATA_TYPE_DOUBLE: {
|
||||
#ifdef _TD_ARM_32_
|
||||
double dv = 0;
|
||||
*(int64_t*)(&dv) = *(int64_t*)row[i];
|
||||
sprintf(value, "%.9lf", dv);
|
||||
#else
|
||||
sprintf(value, "%.9lf", *((double *)row[i]));
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case TSDB_DATA_TYPE_BINARY:
|
||||
case TSDB_DATA_TYPE_NCHAR:
|
||||
memcpy(value, row[i], fields[i].bytes);
|
||||
value[fields[i].bytes] = 0;
|
||||
// snprintf(value, fields[i].bytes, "%s", (char *)row[i]);
|
||||
break;
|
||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||
tt = *(int64_t *)row[i] / 1000;
|
||||
tp = localtime(&tt);
|
||||
strftime(timeStr, 64, "%y-%m-%d %H:%M:%S", tp);
|
||||
sprintf(value, "%s.%03d", timeStr,
|
||||
(int)(*((int64_t *)row[i]) % 1000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} // end of switch
|
||||
} // end of for
|
||||
} // end of if
|
||||
numOfRows++;
|
||||
if (isSlow && numOfRows % 100 == 0) {
|
||||
taosMsleep(200);
|
||||
}
|
||||
if (numOfRows > 2000000000) {
|
||||
simError("script:%s, too many rows return from query", script->fileName);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
taos_free_result(result);
|
||||
} else {
|
||||
numOfRows = taos_affected_rows(script->taos);
|
||||
}
|
||||
|
||||
sprintf(script->rows, "%d", numOfRows);
|
||||
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteRestFulSqlCommand(SScript *script, char *rest) {
|
||||
SCmdLine *line = &script->lines[script->linePos];
|
||||
char command[4096];
|
||||
sprintf(command, "curl -H 'Authorization: Taosd %s' -d \"%s\" 127.0.0.1:6020/rest/sql", script->auth, rest);
|
||||
|
||||
int ret = -1;
|
||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||
ret = simExecuteRestFulCommand(script, command);
|
||||
if (ret == TSDB_CODE_TABLE_ALREADY_EXIST ||
|
||||
ret == TSDB_CODE_DB_ALREADY_EXIST) {
|
||||
simTrace("script:%s, taos:%p, %s success, ret:%d:%s", script->fileName, script->taos, rest, ret, tstrerror(ret));
|
||||
ret = 0;
|
||||
break;
|
||||
} else if (ret != 0) {
|
||||
simTrace("script:%s, taos:%p, %s failed, ret:%d",
|
||||
script->fileName, script->taos, rest, ret);
|
||||
|
||||
if (line->errorJump == SQL_JUMP_TRUE) {
|
||||
script->linePos = line->jump;
|
||||
return true;
|
||||
}
|
||||
taosMsleep(1000);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
sprintf(script->error, "lineNum:%d. sql:%s failed, ret:%d", line->lineNum, rest, ret);
|
||||
return false;
|
||||
}
|
||||
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simExecuteSqlImpCmd(SScript *script, char *rest, bool isSlow) {
|
||||
char buf[3000];
|
||||
SCmdLine *line = &script->lines[script->linePos];
|
||||
|
||||
simVisuallizeOption(script, rest, buf);
|
||||
rest = buf;
|
||||
|
||||
simTrace("script:%s, exec:%s", script->fileName, rest);
|
||||
strcpy(script->rows, "-1");
|
||||
for (int row = 0; row < MAX_QUERY_ROW_NUM; ++row) {
|
||||
for (int col = 0; col < MAX_QUERY_COL_NUM; ++col) {
|
||||
strcpy(script->data[row][col], "null");
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp(rest, "connect", 7) == 0) {
|
||||
if (!simCreateTaosdConnect(script, rest)) {
|
||||
return false;
|
||||
}
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((!simAsyncQuery && script->taos == NULL) || (simAsyncQuery && script->auth[0] == 0)) {
|
||||
if (!simCreateTaosdConnect(script, "connect root")) {
|
||||
if (line->errorJump == SQL_JUMP_TRUE) {
|
||||
script->linePos = line->jump;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp(rest, "close", 5) == 0) {
|
||||
simCloseTaosdConnect(script);
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (simAsyncQuery) {
|
||||
return simExecuteRestFulSqlCommand(script, rest);
|
||||
} else {
|
||||
return simExecuteNativeSqlCommand(script, rest, isSlow);
|
||||
}
|
||||
}
|
||||
|
||||
bool simExecuteSqlCmd(SScript *script, char *rest) {
|
||||
bool isSlow = false;
|
||||
return simExecuteSqlImpCmd(script, rest, isSlow);
|
||||
}
|
||||
|
||||
bool simExecuteSqlSlowCmd(SScript *script, char *rest) {
|
||||
bool isSlow = true;
|
||||
return simExecuteSqlImpCmd(script, rest, isSlow);
|
||||
}
|
||||
|
||||
bool simExecuteSqlErrorCmd(SScript *script, char *rest) {
|
||||
char buf[3000];
|
||||
SCmdLine *line = &script->lines[script->linePos];
|
||||
|
||||
simVisuallizeOption(script, rest, buf);
|
||||
rest = buf;
|
||||
|
||||
simTrace("script:%s, exec:%s", script->fileName, rest);
|
||||
strcpy(script->rows, "-1");
|
||||
for (int row = 0; row < MAX_QUERY_ROW_NUM; ++row) {
|
||||
for (int col = 0; col < MAX_QUERY_COL_NUM; ++col) {
|
||||
strcpy(script->data[row][col], "null");
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp(rest, "connect", 7) == 0) {
|
||||
if (!simCreateTaosdConnect(script, rest)) {
|
||||
return false;
|
||||
}
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((!simAsyncQuery && script->taos == NULL) || (simAsyncQuery && script->auth[0] == 0)) {
|
||||
if (!simCreateTaosdConnect(script, "connect root")) {
|
||||
if (line->errorJump == SQL_JUMP_TRUE) {
|
||||
script->linePos = line->jump;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp(rest, "close", 5) == 0) {
|
||||
simCloseTaosdConnect(script);
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
int ret;
|
||||
if (simAsyncQuery) {
|
||||
char command[4096];
|
||||
sprintf(command, "curl -H 'Authorization: Taosd %s' -d '%s' 127.0.0.1:6020/rest/sql", script->auth, rest);
|
||||
ret = simExecuteRestFulCommand(script, command);
|
||||
}
|
||||
else {
|
||||
ret = taos_query(script->taos, rest);
|
||||
}
|
||||
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
simTrace("script:%s, taos:%p, %s execute, expect failed, so success, ret:%d:%s",
|
||||
script->fileName, script->taos, rest, ret, tstrerror(ret));
|
||||
script->linePos++;
|
||||
return true;
|
||||
}
|
||||
sprintf(script->error, "lineNum:%d. sql:%s expect failed, but success, ret:%d:%s", line->lineNum, rest, ret, tstrerror(ret));
|
||||
|
||||
return false;
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
/*******************************************************************
|
||||
* Copyright (c) 2001 by TAOS Networks, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This file is proprietary and confidential to TAOS Networks, Inc.
|
||||
* No part of this file may be reproduced, stored, transmitted,
|
||||
* disclosed or used in any form or by any means other than as
|
||||
* expressly provided by the written permission from Jianhui Tao
|
||||
*
|
||||
* ****************************************************************/
|
||||
|
||||
#include "sim.h"
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
bool simAsyncQuery = false;
|
||||
|
||||
void simHandleSignal(int signo) {
|
||||
simSystemCleanUp();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
char scriptFile[MAX_FILE_NAME_LEN] = "sim_main_test.sim";
|
||||
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
if (strcmp(argv[i], "-c") == 0 && i < argc - 1) {
|
||||
strncpy(configDir, argv[++i], MAX_FILE_NAME_LEN);
|
||||
} else if (strcmp(argv[i], "-f") == 0 && i < argc - 1) {
|
||||
strcpy(scriptFile, argv[++i]);
|
||||
} else if (strcmp(argv[i], "-a") == 0) {
|
||||
simAsyncQuery = true;
|
||||
} else {
|
||||
printf("usage: %s [options] \n", argv[0]);
|
||||
printf(" [-c config]: config directory, default is: %s\n",
|
||||
configDir);
|
||||
printf(" [-f script]: script filename\n");
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
if (!simSystemInit()) {
|
||||
simError("failed to initialize the system");
|
||||
simSystemCleanUp();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
simPrint("simulator is running ...");
|
||||
signal(SIGINT, simHandleSignal);
|
||||
|
||||
SScript *script = simParseScript(scriptFile);
|
||||
if (script == NULL) {
|
||||
simError("parse script file:%s failed", scriptFile);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
simScriptList[++simScriptPos] = script;
|
||||
simExecuteScript(script);
|
||||
|
||||
return 0;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,93 @@
|
|||
#include "os.h"
|
||||
#include "sim.h"
|
||||
#include "taos.h"
|
||||
#include "tglobalcfg.h"
|
||||
#include "ttimer.h"
|
||||
#include "tutil.h"
|
||||
|
||||
SScript *simScriptList[MAX_MAIN_SCRIPT_NUM];
|
||||
SCommand simCmdList[SIM_CMD_END];
|
||||
int simScriptPos = -1;
|
||||
int simScriptSucced = 0;
|
||||
int simDebugFlag = 135;
|
||||
void simCloseTaosdConnect(SScript *script);
|
||||
|
||||
bool simSystemInit() {
|
||||
taos_init();
|
||||
simInitsimCmdList();
|
||||
memset(simScriptList, 0, sizeof(SScript *) * MAX_MAIN_SCRIPT_NUM);
|
||||
return true;
|
||||
}
|
||||
|
||||
void simSystemCleanUp() {}
|
||||
|
||||
void simFreeScript(SScript *script) {
|
||||
if (script->type == SIM_SCRIPT_TYPE_MAIN) {
|
||||
for (int i = 0; i < script->bgScriptLen; ++i) {
|
||||
SScript *bgScript = script->bgScripts[i];
|
||||
bgScript->killed = true;
|
||||
}
|
||||
}
|
||||
|
||||
taos_close(script->taos);
|
||||
tfree(script->lines);
|
||||
tfree(script->optionBuffer);
|
||||
tfree(script);
|
||||
}
|
||||
|
||||
SScript *simProcessCallOver(SScript *script) {
|
||||
if (script->type == SIM_SCRIPT_TYPE_MAIN) {
|
||||
if (script->killed) {
|
||||
simPrint("script:" FAILED_PREFIX "%s" FAILED_POSTFIX ", " FAILED_PREFIX
|
||||
"failed" FAILED_POSTFIX ", error:%s",
|
||||
script->fileName, script->error);
|
||||
exit(-1);
|
||||
} else {
|
||||
simPrint("script:" SUCCESS_PREFIX "%s" SUCCESS_POSTFIX ", " SUCCESS_PREFIX
|
||||
"success" SUCCESS_POSTFIX,
|
||||
script->fileName);
|
||||
simCloseTaosdConnect(script);
|
||||
simScriptSucced++;
|
||||
simScriptPos--;
|
||||
if (simScriptPos == -1) {
|
||||
simPrint("----------------------------------------------------------------------");
|
||||
simPrint("Simulation Test Done, " SUCCESS_PREFIX "%d" SUCCESS_POSTFIX " Passed:\n", simScriptSucced);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
simFreeScript(script);
|
||||
return simScriptList[simScriptPos];
|
||||
}
|
||||
} else {
|
||||
simPrint("script:%s, is stopped by main script", script->fileName);
|
||||
simFreeScript(script);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void *simExecuteScript(void *inputScript) {
|
||||
SScript *script = (SScript *)inputScript;
|
||||
|
||||
while (1) {
|
||||
if (script->type == SIM_SCRIPT_TYPE_MAIN) {
|
||||
script = simScriptList[simScriptPos];
|
||||
}
|
||||
|
||||
if (script->killed || script->linePos >= script->numOfLines) {
|
||||
script = simProcessCallOver(script);
|
||||
if (script == NULL) break;
|
||||
} else {
|
||||
SCmdLine *line = &script->lines[script->linePos];
|
||||
char *option = script->optionBuffer + line->optionOffset;
|
||||
simTrace("script:%s, line:%d with option \"%s\"", script->fileName, line->lineNum, option);
|
||||
|
||||
SCommand *cmd = &simCmdList[line->cmdno];
|
||||
int ret = (*(cmd->executeCmd))(script, option);
|
||||
if (!ret) {
|
||||
script->killed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
Loading…
Reference in New Issue