/* * 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 Tdefstr(d,s,l) if(0 == *d) strncpy(d, s, l); #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 SERV_NOT_CONN 101 // not connect server /************************************************************************************************* 创建表宏函数 *************************************************************************************************/ #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; typedef struct __THREAD_RUN { BSock m_epfd; pthread_t m_tPid; bool m_bRun; }TThread; /************************************************************************************************* 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 size_t lGetTableSize(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___