865 lines
42 KiB
C
865 lines
42 KiB
C
/*
|
|
* Copyright (c) 2018 Savens Liu
|
|
*
|
|
* The original has been patented, Open source is not equal to open rights.
|
|
* Anyone can clone, download, learn and discuss for free. Without the permission
|
|
* of the copyright owner or author, it shall not be merged, published, licensed or sold.
|
|
* The copyright owner or author has the right to pursue his responsibility.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __TVM_DEFIND_HHHH___
|
|
#define __TVM_DEFIND_HHHH___
|
|
#include "tstr.h"
|
|
|
|
typedef pthread_rwlock_t RWLock;
|
|
typedef pthread_rwlockattr_t RWAttr;
|
|
typedef struct timespec Timesp;
|
|
typedef unsigned int TABLE;
|
|
typedef long long llSEQ;
|
|
typedef long (*TCREATE)(TABLE t);
|
|
typedef long CREATE;
|
|
|
|
//#pragma pack(4)
|
|
|
|
#define TVM_VKERNEL "1.2.0.0"
|
|
#define TVM_VERSION "1.2.4.0"
|
|
/*************************************************************************************************
|
|
custom macro
|
|
*************************************************************************************************/
|
|
#define FIELD_INCR 512
|
|
#define FIRST_ROW 256
|
|
#define ORDER_DESC 128
|
|
#define ORDER_ASC 64
|
|
#define ORDER_BY 64
|
|
#define GROUP_BY 32
|
|
#define MATCH_MAX 16
|
|
#define MATCH_MIN 8
|
|
|
|
#define FIELD_DOUB 4
|
|
#define FIELD_LONG 2
|
|
#define FIELD_CHAR 1
|
|
|
|
#define QUE_NOWAIT 1
|
|
#define QUE_NORMAL 0
|
|
|
|
// execution plan
|
|
#define EXE_PLAN_ALL 0
|
|
#define EXE_PLAN_IDX 1
|
|
#define EXE_PLAN_GRP 2
|
|
|
|
#define CHK_SELECT 0
|
|
#define IDX_SELECT 1
|
|
#define RCD_SELECT 2
|
|
#define NIL_IGNORE 8
|
|
|
|
#define OPERATE_NULL 0
|
|
#define OPERATE_INSERT 1
|
|
#define OPERATE_DELETE 2
|
|
#define OPERATE_UPDATE 4
|
|
#define OPERATE_SELECT 8
|
|
|
|
#define PROTOCAL_JAVA 512
|
|
#define OPERAYS_INSERT 1025
|
|
#define OPERAYS_DELETE 1026
|
|
#define OPERAYS_UPDATE 1027
|
|
#define OPERATS_REPLACE 1028
|
|
#define OPERAYS_QUEPUSH 1029
|
|
|
|
#define OPERATE_REPLACE 13
|
|
#define OPERATE_TRCATE 14
|
|
#define OPERATE_COUNT 15
|
|
#define OPERATE_GROUP 16
|
|
#define OPERATE_QUERY 17
|
|
#define OPERATE_EXTREM 18
|
|
#define OPERATE_TBDROP 19
|
|
#define OPERATE_RENAME 20
|
|
#define OPERATE_SELSEQ 21
|
|
#define OPERATE_SETSEQ 22
|
|
#define OPERATE_RBDIDX 23
|
|
#define OPERATE_RETLOK 24
|
|
#define OPERATE_DMKEEP 25
|
|
#define OPERATE_DOMPUL 26
|
|
#define OPERATE_DOMPSH 27
|
|
#define OPERATE_DMRECN 28
|
|
#define OPERATE_REFRESH 29
|
|
#define OPERATE_DOMLOFF 30
|
|
#define OPERATE_DOMROFF 31
|
|
#define OPERATE_PULTBL 32
|
|
#define OPERATE_BEGWORK 33
|
|
#define OPERATE_ROLWORK 34
|
|
#define OPERATE_CMTWORK 35
|
|
#define OPERATE_ENDWORK 36
|
|
#define OPERATE_CLICK 45
|
|
#define OPERATE_QUEPUSH 46
|
|
#define OPERATE_QUEPOP 47
|
|
#define OPERATE_QUEPOPS 48
|
|
#define OPERATE_EXEEXIT 99
|
|
|
|
#define OPERATE_DEFAULT (OPERATE_SELECT | OPERATE_UPDATE | OPERATE_DELETE | OPERATE_INSERT)
|
|
/*************************************************************************************************
|
|
Internal definition
|
|
*************************************************************************************************/
|
|
#define SYS_TVM_INDEX 0x01
|
|
#define SYS_TVM_FIELD 0x02 // field table
|
|
#define SYS_TVM_DOMAIN 0x03 // domain table
|
|
#define SYS_TVM_SEQUE 0x04
|
|
#define TVM_MAX_TABLE 0xFF // maximum number of creation of the system
|
|
|
|
#define MAX_STRIG_LEN 256
|
|
|
|
#ifndef MAX_INDEX_LEN
|
|
#define MAX_INDEX_LEN 64
|
|
#endif
|
|
|
|
#define MAX_FIELD_LEN 32 // maxinum length of Field name
|
|
#define ALLOC_CMD_LEN 1024 // maxinum length of command
|
|
|
|
#ifndef MAX_FILED_NUM
|
|
#define MAX_FILED_NUM 64 // maximum number of fields in a table
|
|
#endif
|
|
|
|
#define MAX_REMOTE_IP 20
|
|
#define MAX_TIMESTAMP 20
|
|
#define MAX_FILED_IDX 8
|
|
|
|
// resource flag
|
|
#define RES_LOCAL_SID 1
|
|
#define RES_REMOT_SID 2
|
|
#define RESOURCE_ROFF 5
|
|
#define RESOURCE_AUTH 4
|
|
#define RESOURCE_EXCP 3
|
|
#define RESOURCE_ABLE 2
|
|
#define RESOURCE_STOP 1
|
|
#define RESOURCE_INIT 0
|
|
|
|
#define IPC_MSG 0x01
|
|
#define IPC_SEM 0x02
|
|
#define IPC_SHM 0x03
|
|
|
|
#define SEM_INIT 1
|
|
#define SEM_O_V 1 // Semaphore V operation
|
|
#define SEM_O_P -1 // Semaphore P operation
|
|
#define SEM_RD 0
|
|
#define SEM_WD 1
|
|
|
|
#define UNQIUE 1
|
|
#define NORMAL 16
|
|
#define HASHID 32
|
|
|
|
#define TYPE_SYSTEM 0x01
|
|
#define TYPE_INCORE 0x02
|
|
#define TYPE_CLIENT 0x03 // custom
|
|
#define TYPE_KEYVAL 0x04
|
|
#define TYPE_MQUEUE 0x05
|
|
#define TVM_NODE_INFO "localhost"
|
|
#define TVM_RUNCFG_TAG "\x01\x33\xC8\x48"
|
|
|
|
#define TVM_BOOT_CLUSTER 2
|
|
#define TVM_BOOT_LOCAL 1
|
|
#define TVM_BOOT_SIMPLE 0
|
|
|
|
|
|
#define HAVE_INDEX(t) (((TblDef *)pGetTblDef(t))->m_lIType != 0)
|
|
#define HAVE_UNIQ_IDX(t) (((TblDef *)pGetTblDef(t))->m_lIType & UNQIUE)
|
|
#define HAVE_NORL_IDX(t) (((TblDef *)pGetTblDef(t))->m_lIType & NORMAL)
|
|
#define HAVE_HASH_IDX(t) (((TblDef *)pGetTblDef(t))->m_lIType & HASHID)
|
|
|
|
#define IS_RED(x) (x->m_eColor == COLOR_RED)
|
|
#define FPOS(t, f) ((size_t)&((t *)0)->f)
|
|
#define FLEN(t, f) (sizeof(((t *)0)->f))
|
|
#define NODE_NULL g_lNilOfs
|
|
#define ReField(t, f) (FPOS(t, f) << 16 | FLEN(t, f))
|
|
#define REFrom(t) (t >> 16)
|
|
#define REFLen(t) (t & 0xffff)
|
|
|
|
#define WORK_ERROR_LOG "work.err"
|
|
#define STVM_SQL_LINE ".stvmrc"
|
|
#define COLOR_BLK 0
|
|
#define COLOR_RED 1
|
|
#define SELF_POS_UNUSE 0
|
|
#define DATA_TRUCK_NULL 0x00
|
|
#define DATA_TRUCK_NRML 0x01
|
|
#define DATA_TRUCK_LOCK 0x02
|
|
#define TABLE_LOCK_READ 1
|
|
#define TABLE_LOCK_WRITE 2
|
|
#define IS_TRUCK_NULL(p) ((p)->m_chTag == DATA_TRUCK_NULL)
|
|
#define IS_TRUCK_NRML(p) ((p)->m_chTag == DATA_TRUCK_NRML)
|
|
#define IS_TRUCK_LOCK(p) ((p)->m_chTag == DATA_TRUCK_LOCK)
|
|
#define SET_DATA_TRUCK(p, type) ((p)->m_chTag = type)
|
|
#define TFree(p) if(p) { free(p); p = NULL; }
|
|
#define TFgrp(p) do{vDeleteRowgrp(p);p = NULL;}while(0);
|
|
#define TFlst(p) do{vDestroyList(p);p = NULL;}while(0);
|
|
#define TClose(f) if(f) { fclose(f); f = NULL; }
|
|
|
|
#define Futex(a,o,v,t) syscall(SYS_futex, a, o, v, t, NULL, 0)
|
|
#define Tremohold(p,r) if(p->m_bHold) r->m_lState = RESOURCE_ABLE;
|
|
|
|
/*************************************************************************************************
|
|
errno
|
|
*************************************************************************************************/
|
|
#define TVM_DONE_SUCC 0 // completed successfully
|
|
#define SVR_EXCEPTION 1 // sever exception
|
|
#define IDX_FIELD_NIL 2 // index field values is null
|
|
#define CONDIT_IS_NIL 3 // condition is null
|
|
#define DATA_SPC_FULL 4 // no space for create data
|
|
#define GENER_KEY_ERR 5 // generate shm key failure
|
|
#define SHM_ERR_INVAL 6 // Invalid parameter or shm has disappeared
|
|
#define SHM_ERR_EXIST 7 // shared memory already exists
|
|
#define SHM_ERR_EIDRM 8 // shared memory has been deleted
|
|
#define SHM_ERR_ACCES 9 // Permission denied
|
|
#define SHM_ERR_NOMEM 10 // Insufficient(shm) core memory
|
|
#define VER_NOT_MATCH 11 // data truck version mismatch
|
|
#define BLCK_SIZE_ERR 12 // size is error to creat data block
|
|
#define IDX_DEF_SPILL 13 // unique Index definition overflow
|
|
#define IDX_LEN_SPILL 14 // unique Index length overflow
|
|
#define GRP_DEF_SPILL 15 // normal Index definition overflow
|
|
#define GRP_LEN_SPILL 16 // normal Index length overflow
|
|
#define IDX_TYP_NODEF 17 // index type not define
|
|
#define FLD_DEF_SPILL 18 // field define overflow
|
|
#define IDX_DATA_MISM 19 // index data mismatch
|
|
#define FTYPE_NOT_DEF 20 // field type not define
|
|
#define SHMT_NOT_INIT 21 // memory has not been initialized
|
|
#define UNIQ_IDX_REPT 22 // unique index repeat
|
|
#define IDX_SPC_SPILL 23 // no space for create index
|
|
#define NO_DATA_FOUND 24 // no data be found
|
|
#define MORE_ROWS_SEL 25 // more then one records be selected
|
|
#define MALLC_MEM_ERR 26 // malloc memory error
|
|
#define CURS_IS_INVAL 27 // cursor invalid
|
|
#define TABLE_NOT_DEF 28 // table not define
|
|
#define FIL_NOT_EXIST 29 // file not exist
|
|
#define SEM_CDIT_NULL 30 // semget condition is null
|
|
#define SEM_ERR_INVAL 31 // Invalid parameter or sem has disappeared
|
|
#define SEM_ERR_EXIST 32 // semaphore already exists
|
|
#define SEM_ERR_EIDRM 33 // semaphore has been deleted
|
|
#define SEM_ERR_ACCES 34 // Permission denied(sem)
|
|
#define SEM_ERR_NOMEM 35 // Insufficient(sem) core memory
|
|
#define SEM_ERR_LIMIT 36 // Semaphore value out of limit
|
|
#define SQL_SYNTX_ERR 37 // SQL syntax is error
|
|
#define SQL_NOT_SUPPT 38 // SQL operation not be supported
|
|
#define SQL_TABLE_NIL 39 // SQL no table name be inputted
|
|
#define SQL_FIELD_NIL 40 // SQL field is not selected
|
|
#define SQL_WHERE_NIL 41 // SQL conditional syntax error
|
|
#define SQL_ERR_FIELD 42 // SQL field syntax error
|
|
#define SQL_ERR_WHERE 43 // SQL where syntax error
|
|
#define TBL_NOT_FOUND 44 // table not found
|
|
#define SQL_FAV_MATCH 45 // SQL fields does not match the value
|
|
#define LOCK_DORD_ERR 46 // set the read lock failure
|
|
#define LOCK_UNRD_ERR 47 // unlock read lock failure
|
|
#define LOCK_DOWR_ERR 48 // set the write lock failure
|
|
#define LOCK_UNWR_ERR 49 // unlock write lock failure
|
|
#define SOCK_CONN_ERR 50 // socket connect failure
|
|
#define SOCK_CONN_TMO 51 // socket connect timeout
|
|
#define SOCK_ERR_CRTE 52 // create socket failure
|
|
#define SOCK_READ_ERR 53 // socket recv failure
|
|
#define SOCK_SEND_ERR 54 // socket send failure
|
|
#define SOCK_BIND_ERR 55 // socket bind failure
|
|
#define SOCK_LSEN_ERR 56 // socket listen failure
|
|
#define SOCK_SEND_TMO 57 // socket send timeout
|
|
#define SOCK_READ_TMO 58 // socket read timeout
|
|
#define SOCK_IO_RESET 59 // socket reset
|
|
#define SOCK_COM_EXCP 60 // Socket communication anomaly
|
|
#define EPOLL_ADD_ERR 61 // epoll add fd error
|
|
#define EPOLL_CRT_ERR 62 // create epoll fd failure
|
|
#define EPOLL_DEL_ERR 63 // delete epoll fd failure
|
|
#define SOCK_ACPT_ERR 64 // socket accept failure
|
|
#define RMT_NOT_SUPPT 65 // SQL remote does not support
|
|
#define FILE_NOTFOUND 66 // file not found
|
|
#define BOOT_PARM_ERR 67 // boot parameters error
|
|
#define BOOT_RELA_ERR 68 // parameters table related error
|
|
#define BOOT_VER_ICMP 69 // Incompatible version
|
|
#define DOM_NOT_REGST 70 // domain not register
|
|
#define DMWORK_NOTSUP 71 // domain work does not support
|
|
#define SEQ_NOT_FOUND 72 // sequence does not exist
|
|
#define FILE_NOT_RSET 73 // file is not set
|
|
#define RECD_TOO_LONG 74 // record data too long
|
|
#define RESOU_DISABLE 75 // Resource unavailable
|
|
#define MSG_ERR_EXIST 76 // message queue already exists
|
|
#define MSG_ERR_ACCES 77 // Permission denied .msg
|
|
#define MSG_ERR_NOMEM 78 // Insufficient(msg) core memory
|
|
#define MSG_ERR_INVAL 79 // Invalid parameter or msg has disappeared
|
|
#define MSG_ERR_FAULT 80 // msg Invalid address
|
|
#define MSG_ERR_EIDRM 81 // message queue has been deleted
|
|
#define MSG_ERR_E2BIG 82 // message text length is greater than msgsz
|
|
#define MSG_ERR_EINTR 83 // Interrupted by signal
|
|
#define MSG_ERR_SNDEG 84 // msgsnd queue overrun
|
|
#define INI_ERR_CHLDP 85 // initial child process failed
|
|
#define FLD_NOT_EXIST 86 // field not exist
|
|
#define TBL_ARD_EXIST 87 // table already exist
|
|
#define WORK_NOT_OPEN 88 // The transaction has not been opened yet
|
|
#define WORK_NOT_REGT 89 // The transaction has not been register
|
|
#define DOM_NOT_INITL 90 // domain not initail
|
|
#define FIELD_NOT_DEF 91 // table field not define
|
|
#define FIELD_NOT_SET 92 // field not set
|
|
#define UPDFD_NOT_SET 93 // update field not set
|
|
#define EXTRE_SET_ERR 94 // extreme set decorate error
|
|
#define GROUP_SET_ERR 95 // group set decorate error
|
|
#define CMM_TABLE_MIS 96 // the table of field is missing
|
|
#define MQUE_WAIT_TMO 97 // queue waiting for timeout
|
|
#define MQUE_WAIT_ERR 98 // queue waiting for failure
|
|
#define MQUE_CRTE_BIG 99 // created queue is too big
|
|
#define NOT_SUPPT_OPT 100 // queue does not support this operation
|
|
|
|
/*************************************************************************************************
|
|
创建表宏函数
|
|
*************************************************************************************************/
|
|
#define DEFINE(t, p, s) TABLE tbl = t; long type = 0; \
|
|
((TblDef *)pGetTblDef(t))->m_table = t; \
|
|
((TblDef *)pGetTblDef(t))->m_lReSize = sizeof(s); \
|
|
strncpy(((TblDef *)pGetTblDef(t))->m_szPart, p, MAX_FIELD_LEN); \
|
|
strncpy(((TblDef *)pGetTblDef(t))->m_szTable, #t, MAX_FIELD_LEN); \
|
|
((TblDef *)pGetTblDef(t))->m_lTruck = sizeof(s) + sizeof(SHTruck);
|
|
|
|
#define CREATE_IDX(t) type = t;
|
|
#define IDX_FIELD(t, f, a) if(RC_SUCC != lAddIdxField(tbl, type, FPOS(t, f), FLEN(t, f), a, #f)) \
|
|
return RC_FAIL;
|
|
#define FIELD(t, f, a) if(RC_SUCC != lSetTableIdx(tbl, FPOS(t, f), FLEN(t, f), #f, a, CHK_SELECT)) \
|
|
return RC_FAIL;
|
|
#define FIELU(t, f, a) if(RC_SUCC != lSetTableIdx(tbl, FPOS(t, f), FLEN(t, f), #f, a, IDX_SELECT)) \
|
|
return RC_FAIL;
|
|
#define FIELR(t, f, a) if(RC_SUCC != lSetTableIdx(tbl, FPOS(t, f), FLEN(t, f), #f, a, RCD_SELECT)) \
|
|
return RC_FAIL;
|
|
#define FINISH return RC_SUCC;
|
|
|
|
#define QUEUE DEFINE
|
|
/*************************************************************************************************
|
|
Field assignment
|
|
*************************************************************************************************/
|
|
#define conditbind(p,v,t) do{ \
|
|
p->stCond.uFldcmp = 0; \
|
|
p->stUpdt.uFldcmp = 0; \
|
|
p->lFind = 0; \
|
|
p->tblName = t; \
|
|
p->lSize = sizeof(v); \
|
|
p->pstVoid = (void *)&(v); \
|
|
}while(0);
|
|
|
|
#define conditinit(p,s,t) do{ \
|
|
p->stCond.uFldcmp = 0; \
|
|
p->stUpdt.uFldcmp = 0; \
|
|
p->lFind = 0; \
|
|
p->tblName = t; \
|
|
p->lSize = sizeof(s); \
|
|
memset(&(s), 0, p->lSize); \
|
|
p->pstVoid = (void *)&(s); \
|
|
}while(0);
|
|
|
|
#define conditnull(p,l,t) do{ \
|
|
p->stCond.uFldcmp = 0; \
|
|
p->stUpdt.uFldcmp = 0; \
|
|
p->lFind = 0; \
|
|
p->lSize = l; \
|
|
p->tblName = t; \
|
|
p->pstVoid = NULL; \
|
|
}while(0);
|
|
|
|
#define queueinit(p,v,t) do{ \
|
|
p->lSize = sizeof(v); \
|
|
p->tblName = t; \
|
|
memset(&(v), 0, p->lSize); \
|
|
p->pstVoid = (void *)&v; \
|
|
}while(0);
|
|
|
|
#define queuebind(p,v,t) do{ \
|
|
p->lSize = l; \
|
|
p->tblName = t; \
|
|
p->pstVoid = (void *)v; \
|
|
}while(0);
|
|
|
|
#define queuenull(p,l,t) do{ \
|
|
p->lSize = l; \
|
|
p->tblName = t; \
|
|
}while(0);
|
|
|
|
#define stringsetv(p,s,f,...) vSetCodField(&p->stCond, sizeof((s).f), (char *)(s).f - (char *)&(s)); \
|
|
snprintf((s).f, sizeof((s).f), __VA_ARGS__);
|
|
|
|
#define stringset(p,s,f,v) vSetCodField(&p->stCond, sizeof((s).f), (char *)(s).f - (char *)&(s)); \
|
|
strncpy((s).f, v, sizeof((s).f));
|
|
|
|
#define stringcpy(p,s,f,v) vSetCodField(&p->stCond, sizeof((s).f), (char *)(s).f - (char *)&(s)); \
|
|
memcpy(&(s) + ((void *)(s).f - (void *)&(s)), (void *)v, sizeof((s).f));
|
|
|
|
#define numberset(p,s,f,v) vSetCodField(&p->stCond, sizeof((s).f), (char *)&(s).f - (char *)&(s)); \
|
|
(s).f = v;
|
|
|
|
#define decorate(p,d,f,v) vSetDecorate(&p->stUpdt, FLEN(d, f), FPOS(d, f), v); \
|
|
p->lFind = p->lFind | (v);
|
|
|
|
#define stringreset(s,f,v) strncpy((s).f, v, sizeof((s).f));
|
|
#define stringresetv(s,f,...) snprintf((s).f, sizeof((s).f), __VA_ARGS__);
|
|
#define stringrecpy(s,f,v) memcpy((s).f, v, sizeof((s).f));
|
|
#define numberreset(s,f,v) (s).f = v;
|
|
#define conditset(p,s,f) vSetCodField(&p->stCond, sizeof((s).f), (char *)&(s).f - (char *)&(s));
|
|
|
|
#define conditfld conditset
|
|
#define conditnum numberset
|
|
#define conditstr stringset
|
|
#define conditcpy stringcpy
|
|
#define conditstv stringsetv
|
|
#define conditrenum numberreset
|
|
#define conditrestr stringreset
|
|
#define conditrecpy stringrecpy
|
|
#define conditrestv stringresetv
|
|
|
|
// UPDATE Field assignment
|
|
#define updateinit(p, s) memset(&(s), 0, sizeof(s));
|
|
//#define updateinit(p, s) p->stUpdt.uFldcmp = 0; memset(&(s), 0, sizeof(s));
|
|
|
|
#define stringupd(p,s,f,v) vSetCodField(&p->stUpdt, sizeof((s).f), (char *)(s).f - (char *)&(s)); \
|
|
strncpy((s).f, v, sizeof((s).f));
|
|
|
|
#define stringupy(p,s,f,v) vSetCodField(&p->stUpdt, sizeof((s).f), (char *)(s).f - (char *)&(s)); \
|
|
memcpy(&(s) + ((void *)(s).f - (void *)&(s)), (void *)v, sizeof((s).f));
|
|
|
|
#define numberupd(p,s,f,v) vSetCodField(&p->stUpdt, sizeof((s).f), (char *)&(s).f - (char *)&(s)); \
|
|
(s).f = v;
|
|
|
|
#define updatestrv(p,s,f,...) vSetCodField(&p->stUpdt, sizeof((s).f), (char *)(s).f - (char *)&(s)); \
|
|
snprintf((s).f, sizeof((s).f), __VA_ARGS__);
|
|
|
|
#define updateset(p,s,f) vSetCodField(&p->stUpdt, sizeof((s).f), (char *)&(s).f - (char *)&(s));
|
|
#define updatefld updateset
|
|
#define updatenum numberupd
|
|
#define updatestr stringupd
|
|
#define updatecpy stringupy
|
|
#define updatestv updatestrv
|
|
#define updaterenum(s,f,v) (s).f = v;
|
|
#define updaterestr(s,f,v) strncpy((s).f, v, sizeof((s).f));
|
|
#define updaterecpy(s,f,v) memcpy((s).f, v, sizeof((s).f));
|
|
#define updaterestv(s,f,...) snprintf((s).f, sizeof((s).f), __VA_ARGS__);
|
|
|
|
#define aliasreset(p,t) lResetDefine(p, t);
|
|
#define aliasvalue(p,t,s,a,v) lSetTructByAlias(p, t, s, a, v);
|
|
#define aliasset(p,t,s,f,v) lSetAlias(p, t, FLEN(s, f), FPOS(s, f), v);
|
|
/*************************************************************************************************
|
|
Table structure & index definition area
|
|
*************************************************************************************************/
|
|
typedef struct __SH_DATA_TRUCK
|
|
{
|
|
ulong m_lTimes;
|
|
char m_chTag;
|
|
char m_pvData[0];
|
|
}SHTruck, *PSHTruck;
|
|
|
|
typedef struct __SH_RBTREE
|
|
{
|
|
size_t m_lSePos;
|
|
char m_szIdx[MAX_INDEX_LEN];
|
|
long m_lIdx;
|
|
size_t m_lData;
|
|
long m_eColor;
|
|
size_t m_lParent;
|
|
size_t m_lLeft;
|
|
size_t m_lRight;
|
|
}SHTree;
|
|
|
|
typedef struct __SH_LIST
|
|
{
|
|
size_t m_lPos;
|
|
size_t m_lNode;
|
|
size_t m_lData;
|
|
size_t m_lNext;
|
|
size_t m_lLast;
|
|
}SHList;
|
|
|
|
typedef struct __TBL_COM_KEY
|
|
{
|
|
long m_lFrom;
|
|
long m_lLen;
|
|
long m_lAttr;
|
|
long m_lIsPk;
|
|
char m_szField[MAX_FIELD_LEN];
|
|
char m_szAlias[MAX_FIELD_LEN];
|
|
}TblKey;
|
|
|
|
typedef struct __TBL_HEAD_DEF
|
|
{
|
|
RWLock m_rwlock; // rwlock
|
|
long m_lGroup; // index group
|
|
size_t m_lMaxRow; // maximum support
|
|
size_t m_lValid; // number of valid
|
|
long m_lIdxLen; // unique index length
|
|
size_t m_lNodeNil; // NIL
|
|
size_t m_lTreePos; // unique tree position
|
|
size_t m_lTreeRoot; // unique tree root
|
|
long m_lGrpLen; // index length
|
|
size_t m_lGroupPos; // index position
|
|
size_t m_lGroupRoot; // index root
|
|
size_t m_lListPos; // list position
|
|
size_t m_lListOfs; // list offset
|
|
size_t m_lData; // data offset
|
|
uint m_lIType; // index type
|
|
uint m_lIdxUp; // unique index field
|
|
TblKey m_stIdxUp[MAX_FILED_IDX]; // unique index
|
|
uint m_lGrpUp; // index field
|
|
TblKey m_stGrpUp[MAX_FILED_IDX]; // index
|
|
size_t m_lTable; // table size
|
|
long m_lReSize; // row size
|
|
size_t m_lTruck; // truck size
|
|
llSEQ m_lExSeQ; // extern sequence
|
|
long m_lExtern; // extern table space(standby)
|
|
long m_lIdxNum; // Number of fields
|
|
TblKey m_stKey[MAX_FILED_NUM]; // fields
|
|
TABLE m_table; // table
|
|
char m_szTable[MAX_FIELD_LEN]; // table name
|
|
char m_szPart[MAX_FIELD_LEN]; //
|
|
SHTree m_stNil;
|
|
}TblDef;
|
|
|
|
static long g_lNilOfs = FPOS(TblDef, m_stNil);
|
|
|
|
typedef struct __SQL_FIELD
|
|
{
|
|
TblKey m_stKey;
|
|
struct __SQL_FIELD *pstNext;
|
|
}SQLFld;
|
|
|
|
/*************************************************************************************************
|
|
TVM engine starts the required table (Warn: do not modify)
|
|
*************************************************************************************************/
|
|
typedef struct __SYS_TVM_INDEX
|
|
{
|
|
TABLE m_table; // table
|
|
uint m_lType; // table type
|
|
char m_szTable[MAX_FIELD_LEN]; // table name
|
|
char m_szPart[MAX_FIELD_LEN]; // partition name
|
|
char m_szOwner[MAX_FIELD_LEN]; // owner
|
|
key_t m_yKey;
|
|
long m_shmID; // Memory Key
|
|
long m_semID; // semaphore key
|
|
long m_lPid; // pid
|
|
long m_lValid; // valid
|
|
long m_lMaxRows; // Table maximum support record number.
|
|
long m_lRowSize; // truck size
|
|
long m_lLocal; // Local/remote
|
|
uint m_lState; // available
|
|
long m_lPers; // permissions
|
|
char m_szTime[MAX_TIMESTAMP]; // create time
|
|
}TIndex;
|
|
|
|
typedef struct __SYS_TVM_FIELD
|
|
{
|
|
TABLE m_table; // table
|
|
long m_lSeq; // filed seq
|
|
char m_szOwner[MAX_FIELD_LEN]; // owner
|
|
char m_szTable[MAX_FIELD_LEN]; // table name
|
|
char m_szField[MAX_FIELD_LEN]; // field name
|
|
long m_lAttr; // attr
|
|
long m_lFrom; // field from
|
|
long m_lLen; // field length
|
|
long m_lIsPk;
|
|
}TField;
|
|
|
|
typedef struct __SYS_TVM_DOMAIN
|
|
{
|
|
BSock m_skSock;
|
|
TABLE m_table;
|
|
TABLE m_mtable;
|
|
long m_lLock;
|
|
long m_lGroup;
|
|
long m_lKeepLive;
|
|
long m_lLastTime;
|
|
long m_lTimeOut;
|
|
long m_lTryMax;
|
|
long m_lTryTimes;
|
|
long m_lRowSize;
|
|
long m_lStatus; // remote domain state
|
|
long m_lPers; // perms
|
|
long m_lPort;
|
|
long m_lRelia;
|
|
char m_szIp[MAX_REMOTE_IP];
|
|
char m_szTable[MAX_FIELD_LEN];
|
|
char m_szPart[MAX_FIELD_LEN];
|
|
char m_szOwner[MAX_FIELD_LEN];
|
|
}TDomain;
|
|
|
|
typedef struct __SYS_TVM_SEQUE
|
|
{
|
|
char m_szSQName[MAX_INDEX_LEN]; // Name of sequence
|
|
uint m_uIncrement;
|
|
}TSeque;
|
|
|
|
/*************************************************************************************************
|
|
Operating handle
|
|
*************************************************************************************************/
|
|
typedef struct __TBL_FILED_KEY
|
|
{
|
|
Uenum uDecorate;
|
|
uint uFldpos;
|
|
uint uFldlen;
|
|
}FdKey;
|
|
|
|
typedef struct __TBL_CONDIT_FLD
|
|
{
|
|
uint uFldcmp;
|
|
FdKey stFdKey[MAX_FILED_NUM];
|
|
}FdCond;
|
|
|
|
typedef struct __TVM_WORK
|
|
{
|
|
TABLE m_table;
|
|
long m_lRowSize;
|
|
long m_lOperate;
|
|
FdCond m_stCond;
|
|
FdCond m_stUpdt;
|
|
void *m_pvData;
|
|
void *m_pvNew;
|
|
}TWork;
|
|
|
|
typedef struct __TVM_RUNTIME
|
|
{
|
|
void *pstVoid;
|
|
uint m_lState;
|
|
uint m_lLocal;
|
|
uint m_lType;
|
|
long m_shmID; // Memory Key
|
|
long m_semID; // semaphore key
|
|
long m_lRowSize; // Record block size
|
|
bool m_bAttch; // Does it initialize
|
|
void *m_pvAddr;
|
|
long m_lCurLine; // cursor line
|
|
long m_lCurType; // cursor type
|
|
void *m_pvCurAddr; // cursor address
|
|
}RunTime;
|
|
|
|
typedef struct __TVM_OPERATE
|
|
{
|
|
size_t lSize; // struck size
|
|
Uenum lFind; // find type
|
|
Uenum bSearch; // find table type
|
|
TABLE tblName; // table
|
|
void *pstVoid; // condition
|
|
FdCond stCond;
|
|
FdCond stUpdt;
|
|
|
|
bool m_bWork; // work
|
|
bool m_bPrew; // work on or off
|
|
bool m_bHold; // memory hold
|
|
bool m_bCreat;
|
|
CMList *m_pstWork; // work list
|
|
uint m_lTimes;
|
|
BSock m_skSock;
|
|
Uenum m_lEType;
|
|
key_t m_yKey;
|
|
key_t m_ySey;
|
|
key_t m_yMey;
|
|
Uenum m_lErrno;
|
|
size_t m_lEffect; // effect record line
|
|
bool m_bCache;
|
|
char m_szMsg[256]; // Custom message
|
|
char m_szNode[MAX_FIELD_LEN];
|
|
RunTime stRunTime[TVM_MAX_TABLE]; // table handle
|
|
}SATvm;
|
|
|
|
typedef struct __TVM_BOOT_PARAM
|
|
{
|
|
long m_lMaxTable;
|
|
long m_lMaxField;
|
|
long m_lMaxDomain;
|
|
long m_lMaxSeque;
|
|
long m_lBootExec;
|
|
long m_lBootPort;
|
|
long m_lBootType;
|
|
char m_szNode[MAX_FIELD_LEN];
|
|
char m_szLog[MAX_STRIG_LEN];
|
|
}TBoot;
|
|
|
|
/*************************************************************************************************
|
|
STVM user define
|
|
*************************************************************************************************/
|
|
typedef struct __STVM_CUSTOMIZE
|
|
{
|
|
Benum m_eDebug;
|
|
Benum m_eShow;
|
|
long m_lRows;
|
|
bool m_bInit;
|
|
long m_lKey;
|
|
char *m_pszKey;
|
|
long m_lWord;
|
|
char *m_pszWord;
|
|
}TCustom;
|
|
|
|
/*************************************************************************************************
|
|
macro
|
|
*************************************************************************************************/
|
|
#define lCreateQueue(p,t,r,s,n) lCircleQueue(p, t, r, s, #t, n)
|
|
|
|
/*************************************************************************************************
|
|
内部函数
|
|
*************************************************************************************************/
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
extern char* sGetLog();
|
|
extern char* sGetNode();
|
|
extern void* pGetBoot();
|
|
extern long lDefaultBoot();
|
|
extern TBoot* pBootInitial();
|
|
extern size_t lGetTblRow(TABLE t);
|
|
extern long lGetPermit(TABLE t);
|
|
extern long lGetRowSize(TABLE t);
|
|
extern TblDef* pGetTblDef(TABLE t);
|
|
extern TblKey* pGetTblIdx(TABLE t);
|
|
extern uint lGetIdxNum(TABLE t);
|
|
extern uint lGetGrpNum(TABLE t);
|
|
extern size_t lGetTblData(TABLE t);
|
|
extern size_t lGetListOfs(TABLE t);
|
|
extern size_t lGetRowTruck(TABLE t);
|
|
extern size_t lGetIdxPos(TABLE t);
|
|
extern size_t lGetGrpPos(TABLE t);
|
|
extern long lGetFldNum(TABLE t);
|
|
extern size_t lGetIdxRoot(TABLE t);
|
|
extern long lGetTblGroup(TABLE t);
|
|
extern size_t lGetTblValid(TABLE t);
|
|
extern TblKey* pGetTblGrp(TABLE t);
|
|
extern TblKey* pGetTblKey(TABLE t);
|
|
extern RWLock* pGetRWLock(char* pvAddr);
|
|
extern void vRedeError(long err, char *s);
|
|
extern char* sGetTableName(TABLE t);
|
|
extern void* pGetAddr(SATvm *pstSavm, TABLE t);
|
|
extern RunTime* pGetRunTime(SATvm *pstSavm, TABLE t);
|
|
extern void* pGetNode(void *pvData, size_t lOfs);
|
|
extern long lResetDefine(SATvm *pstSavm, TABLE t);
|
|
extern void* pInitMemTable(SATvm *pstSavm, TABLE t);
|
|
extern void* pInitHitTest(SATvm *pstSavm, TABLE t);
|
|
extern long lTableMaxRow(SATvm *pstSavm, TABLE t);
|
|
extern key_t yGetIPCPath(SATvm *pstSavm, Benum em);
|
|
extern long lGetBootConfig(SATvm *pstSavm, TBoot *pstBoot);
|
|
extern long lAddIdxField(TABLE, long, long, long, long, const char *);
|
|
extern long lSetTableIdx(TABLE, long, long, char*, long, long);
|
|
extern long lUpdIndexPart(SATvm *pstSavm, TABLE t, char *pszPart);
|
|
extern TblKey* pFindField(TblKey *pstIdx, long lNum, char *pszField);
|
|
extern long lGetTblField(TABLE t, size_t *plOut, TField **ppstField);
|
|
extern void vSetCodField(FdCond *pstCond, uint ulen, uint uPos);
|
|
extern bool bSetCondAttr(FdCond *pstCond, TABLE t, Uenum eCheck);
|
|
extern long lSetAlias(SATvm *pstSavm, TABLE t, uint ulen, uint uPos, char *alias);
|
|
extern void vSetDecorate(FdCond *pstCond, uint ulen, uint uPos, Uenum em);
|
|
extern long lGetDomainIndex(SATvm *pstSavm, long *plOut, TIndex **ppstIndex);
|
|
extern long lGetDomainTable(SATvm *pstSavm, long *plOut, TDomain **ppstDomain);
|
|
extern long lGetLocalIndex(SATvm *pstSavm, long *plOut, TIndex **ppstIndex);
|
|
extern long lGetTblIndex(SATvm *pstSavm, char *pszTable, char *pszPart, TIndex *pstIndex);
|
|
|
|
/*************************************************************************************************
|
|
config make&unmake
|
|
*************************************************************************************************/
|
|
extern long lUnmakeConfig(char *pszFile);
|
|
extern long lMakeConfig(char *pszFile);
|
|
|
|
/*************************************************************************************************
|
|
stvm handle
|
|
*************************************************************************************************/
|
|
extern void* pGetSATvm();
|
|
|
|
// pthread use
|
|
extern void* pCloneSATvm();
|
|
extern void vCloneFree(SATvm *pstSavm);
|
|
extern void vCloneQueue(SATvm *pstSovm, TABLE t);
|
|
|
|
/*************************************************************************************************
|
|
IPC Message and semaphore
|
|
*************************************************************************************************/
|
|
extern long lGetQueueNum(SATvm *pstSavm, long lQid);
|
|
extern long lQueueMaxByte(SATvm *pstSavm, long lQid);
|
|
extern long lQueueRcvTime(SATvm *pstSavm, long lQid);
|
|
extern long lCreateQuemsg(SATvm *pstSavm, bool bCreate);
|
|
extern long lOperateSems(SATvm *pstSavm, long semID, long lSems, Benum evp);
|
|
extern long lEventWrite(SATvm *pstSavm, long lQid, void *psvData, long lSize);
|
|
extern long lCreateSems(SATvm *pstSavm, RunTime *pstRun, long lSems, long lValue);
|
|
extern long lEventRead(SATvm *pstSavm, long lQid, void *pstVoid, long lSize, long lMType);
|
|
extern long lReadNoWait(SATvm *pstSavm, long lQid, void *psvVoid, long lSize, long lMType);
|
|
|
|
/*************************************************************************************************
|
|
api
|
|
*************************************************************************************************/
|
|
extern long lShutdownTvm();
|
|
extern long lStartupTvm(TBoot *pstBoot);
|
|
|
|
extern char* sGetUpdTime();
|
|
extern long lGetTErrno();
|
|
extern void vSetTvmMsg(SATvm *pstSavm, char *fmt, ...);
|
|
extern char* sGetTvmMsg(SATvm *pstSavm);
|
|
extern void vSetTErrno(long err);
|
|
extern char* sGetTError(long err);
|
|
extern size_t lGetEffect();
|
|
extern bool bIsTvmBoot();
|
|
extern void* pInitSATvm(TABLE t);
|
|
extern long lInitSvCache(SATvm *pstSavm);
|
|
extern void vInitSATvm(SATvm *pstSavm);
|
|
extern bool bTableIsExist(TABLE t);
|
|
extern long lAttchTable(SATvm *pstSovm, TABLE t);
|
|
extern bool bPartIsExist(char *pszTable, char *pszPart);
|
|
extern long lInitSATvm(SATvm *pstSavm, TABLE t);
|
|
extern void* pPartSatvm(SATvm *pstSavm, char *pszTable, char *pszPart);
|
|
|
|
extern long lResetLock(SATvm *pstSavm, TABLE t);
|
|
extern long lRebuildIndex(SATvm *pstSavm, TABLE t);
|
|
extern void vHoldConnect(SATvm *pstSavm);
|
|
extern void vHoldRelease(SATvm *pstSavm);
|
|
extern void vTblDisconnect(SATvm *pstSamo, TABLE t);
|
|
extern void vForceDisconnect(SATvm *pstSamo, TABLE t);
|
|
extern void vBeginWork(SATvm *pstSavm);
|
|
extern void vEndWork(SATvm *pstSavm);
|
|
extern long lCommitWork(SATvm *pstSavm);
|
|
extern long lRollbackWork(SATvm *pstSavm);
|
|
extern long lDropTable(SATvm *pstSavm, TABLE t);
|
|
extern long lImportFile(TABLE t, char *pszFile, char *pszFlag);
|
|
extern long lExportFile(TABLE t, char *pszFile, char *pszFlag);
|
|
extern long lImportTable(TABLE t, size_t lCount, void *psvOut);
|
|
extern long lExportTable(TABLE t, size_t *plOut, void **ppsvOut);
|
|
extern long lDumpTable(SATvm *pstSavm, TABLE t);
|
|
extern void vSetTructByAlias(SATvm *pstSavm, TABLE t, void *pvData, const char *key, char *v);
|
|
|
|
extern long lRenameTable(SATvm *pstSavm, TABLE to, TABLE tn);
|
|
extern long lCreateSeque(SATvm *pstSavm, char *pszSQName, uint uIncre);
|
|
extern long lSelectSeque(SATvm *pstSavm, char *pszSQName, ulong *pulNumber);
|
|
extern long lSetSequence(SATvm *pstSavm, char *pszSQName, ulong uStart);
|
|
extern long lCustomTable(SATvm *pstSavm, TABLE t, size_t lRow, TblDef *pstDef);
|
|
extern long lCreateTable(SATvm *pstSavm, TABLE t, size_t lRow, TCREATE pfCreateFunc);
|
|
extern long lTableQueue(SATvm *pstSavm, TABLE t, size_t lRow, TCREATE pfCreateFunc);
|
|
extern long lCircleQueue(SATvm *pstSavm, TABLE t, size_t lRow, size_t lSize, char *p, char *n);
|
|
extern long lInsertTrans(SATvm *pstSavm, size_t *plOffset, llSEQ *pllSeq);
|
|
|
|
|
|
extern long lDelete(SATvm *pstSavm);
|
|
extern long lInsert(SATvm *pstSavm);
|
|
extern long lTruncate(SATvm *pstSavm, TABLE t);
|
|
extern long lSelect(SATvm *pstSavm, void *psvOut);
|
|
extern long lUpdate(SATvm *pstSavm, void *psvUpd);
|
|
extern long lReplace(SATvm *pstSavm, void *pvReplace);
|
|
extern long lCount(SATvm *pstSavm, size_t *plCount);
|
|
extern long lClick(SATvm *pstSavm, ulong *puHits);
|
|
extern long lExtreme(SATvm *pstSavm, void *psvOut);
|
|
extern long lGroup(SATvm *pstSavm, size_t *plOut, void **ppsvOut);
|
|
extern long lQuery(SATvm *pstSavm, size_t *plOut, void **ppsvOut);
|
|
|
|
// queue interface
|
|
extern long lPopup(SATvm *pstSavm, size_t lExpect, time_t lTime, size_t *plOut, void **ppsvOut);
|
|
extern long lPop(SATvm *pstSavm, void *pvOut, Uenum eWait);
|
|
extern long lPushs(SATvm *pstSavm, size_t *plOut, void **ppsvOut);
|
|
extern long lPush(SATvm *pstSavm);
|
|
|
|
extern long lTableDeclare(SATvm *pstSavm);
|
|
extern long lTableFetch(SATvm *pstSavm, void *psvOut);
|
|
extern long lNextFetch(SATvm *pstSavm, void **ppvOAddr);
|
|
extern void vTableClose(SATvm *pstSavm);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/*************************************************************************************************
|
|
code end
|
|
*************************************************************************************************/
|
|
#endif // __TVM_DEFIND_HHHH___
|