parse.c
来自「uClinux下用的数据库」· C语言 代码 · 共 1,425 行 · 第 1/2 页
C
1,425 行
{ (void)strncpy(new->table,table,NAME_LEN - 1); } (void)strncpy(new->name,name,NAME_LEN - 1); if (notNull) { new->flags |= NOT_NULL_FLAG; } if (type > 0) { switch(typeBaseType(type)) { case INT8_TYPE: case UINT8_TYPE: new->type = type; new->dataLength = new->length = 1; break; case INT16_TYPE: case UINT16_TYPE: new->type = type; new->dataLength = new->length = 2; break; case INT_TYPE: case UINT_TYPE: new->type = type; new->dataLength = new->length = 4; break;#ifdef HUGE_T case INT64_TYPE: case UINT64_TYPE: new->type = type; new->dataLength = new->length = sizeof(HUGE_T); break;#endif case CHAR_TYPE: new->type = CHAR_TYPE; new->dataLength = new->length = atoi(length); break; case REAL_TYPE: new->type = REAL_TYPE; new->length = sizeof(double); new->dataLength = new->length + 1; break; case TEXT_TYPE: new->type = TEXT_TYPE; new->length = atoi(length); new->dataLength = new->length + VC_HEAD_SIZE; break; case BYTE_TYPE: new->type = type; new->dataLength = new->length = typeFieldSize(type); break; default: new->type = 0; new->dataLength = new->length = 0; break; } } else { new->type = 0; new->dataLength = new->length = 0; } new->overflow = NO_POS; if (!query->fieldHead) { query->fieldHead = query->fieldTail = new; } else { query->fieldTail->next = new; query->fieldTail = new; } memFreeIdent(ident); query->fieldCount++; if (query->fieldCount > MAX_FIELDS) { netError(query->clientSock, TABLE_WIDTH_ERROR, MAX_FIELDS); msqlDebug1(MOD_ERR,"Too many fields in table (%d Max)\n", MAX_FIELDS); debugTrace(TRACE_OUT,"parseAddField()"); return(-1); } debugTrace(TRACE_OUT,"parseAddField()"); return(0);}int parseAddFunction(name, query) char *name; mQuery_t *query;{ mField_t *new; debugTrace(TRACE_IN,"ParseAddFunction()"); /* ** Create the new field definition */ new = memMallocField(); new->overflow = NO_POS; new->function = (mFinfo_t *)malloc(sizeof(mFinfo_t)); bzero(new->function, sizeof(mFinfo_t)); (void)strncpy(new->function->name,name,NAME_LEN - 1); new->function->sequence = query->functSeq++; if (!query->fieldHead) { query->fieldHead = query->fieldTail = new; } else { query->fieldTail->next = new; query->fieldTail = new; } query->fieldCount++; debugTrace(TRACE_OUT,"parseAddFunction()"); return(0);}int parseAddFunctParam(param, query) mIdent_t *param; mQuery_t *query;{ mField_t *new, *funct; char *name, *table; debugTrace(TRACE_IN,"ParseAddFunctParam()"); funct = query->fieldTail; if (*(param->seg2)) { name = param->seg2; table = param->seg1; } else { name = param->seg1; table = NULL; } new = memMallocField(); if (table) { (void)strncpy(new->table,table,NAME_LEN - 1); } (void)strncpy(new->name,name,NAME_LEN - 1); new->overflow = NO_POS; if (!funct->function->paramHead) { funct->function->paramHead = funct->function->paramTail = new; } else { funct->function->paramTail->next = new; funct->function->paramTail = new; } memFreeIdent(param); debugTrace(TRACE_OUT,"ParseAddFunctParam()"); return(0);}int parseAddFunctLiteral(value, query) mVal_t *value; mQuery_t *query;{ mField_t *new, *funct; debugTrace(TRACE_IN,"ParseAddFunctLiteral()"); funct = query->fieldTail; new = memMallocField(); if (!funct->function->paramHead) { funct->function->paramHead = funct->function->paramTail = new; } else { funct->function->paramTail->next = new; funct->function->paramTail = new; } new->value = value; new->literalParamFlag = 1; debugTrace(TRACE_OUT,"ParseAddFunctLiteral()"); return(0);}void parseSetFunctOutputName(name, query) char *name; mQuery_t *query;{ mField_t *funct; char *cp; debugTrace(TRACE_IN,"ParseSetFunctOutputName()"); /* ** The name is a text literal from the parser so we ** have to dodge the quotes */ funct = query->fieldTail; cp = name + strlen(name) - 1; *cp = 0; strncpy(funct->function->outputName, name + 1, NAME_LEN);}void parseSetRowLimit(value, query) mVal_t *value; mQuery_t *query;{ query->rowLimit = value->val.intVal;}void parseSetRowOffset(value, query) mVal_t *value; mQuery_t *query;{ query->rowOffset = value->val.intVal;}void parseSetTargetTable(value, query) char *value; mQuery_t *query;{ if (value) query->targetTable = value; else query->targetTable = NULL;}void parseAddFieldValue(value, query) mVal_t *value; mQuery_t *query;{ register mField_t *fieldVal; u_char *buf; debugTrace(TRACE_IN,"parseAddFieldValue()"); if (!query->lastField) { query->lastField = fieldVal = query->fieldHead; } else { fieldVal = query->lastField->next; query->lastField = query->lastField->next; } if (fieldVal) { if (fieldVal->type == CHAR_TYPE && value->nullVal == 0) { /* ** Just in case we have a 10 char string in ** a 10 char space (i.e. no room for the null ** termination) remalloc this field and ensure ** there's room for a null */ buf = (u_char *)malloc(fieldVal->length+1); if (value->val.charVal) { strncpy(buf,value->val.charVal, fieldVal->length); free(value->val.charVal); } else { *buf = 0; } value->val.charVal = buf; } fieldVal->value = value; } debugTrace(TRACE_OUT,"parseAddFieldValue()");}void parseAddInsertValue(value, query) mVal_t *value; mQuery_t *query;{ mValList_t *new; debugTrace(TRACE_IN,"parseAddInsertValue()"); new = memMallocValList(); new->value = value; new->next = NULL; new->offset = insertOffset++; if (query->insertValTail) { query->insertValTail->next = new; } else { query->insertValHead = new; } query->insertValTail = new; debugTrace(TRACE_OUT,"parseAddInsertValue()");}void parsePushCondition(query) mQuery_t *query;{ cstk_t *new; new = (cstk_t *)malloc(sizeof(cstk_t)); new->next = condStack; new->head = query->condHead; new->tail = query->condTail; condStack = new; query->condHead = query->condTail = NULL;}void parsePopCondition(query) mQuery_t *query;{ cstk_t *tmp; tmp = condStack; condStack = condStack->next; query->condHead = tmp->head; query->condTail = tmp->tail; free(tmp);}void parseAddSubCond(bool, query) int bool; mQuery_t *query;{ mCond_t *new = NULL; debugTrace(TRACE_IN,"parseAddSubCond()"); /* ** If there's only one cond in the sub-cond then we can ** pull it up to the level above. A lot of benchmark app's ** use single entry sub-conds (as do badly written SQL queries) */ if (query->condHead->next == NULL) { new = query->condHead; parsePopCondition(query); new->next = NULL; new->bool = bool; } else { /* ** Nope, it's a valid sub-cond. Set it up */ new = memMallocCondition(); new->op = 0; new->bool = bool; new->value = NULL; new->next = NULL; new->subCond = query->condHead; parsePopCondition(query); } if (!query->condHead) { query->condHead = query->condTail = new; } else { query->condTail->next = new; query->condTail = new; } debugTrace(TRACE_OUT,"parseAddSubCond()");}/****************************************************************************** _msqlAddBetween**** Purpose :** Args :** Returns : Nothing** Notes : the BOOL field is only provided if this is not the first** element of a where_clause.*/ void parseAddBetween(ident,minVal,maxVal,bool,query) mIdent_t *ident; mVal_t *minVal, *maxVal; int bool; mQuery_t *query;{ register mCond_t *new; char *name, *table; debugTrace(TRACE_IN,"parseAddBetween()"); if (*(ident->seg2)) { name = ident->seg2; table = ident->seg1; } else { name = ident->seg1; table = NULL; } new = memMallocCondition(); (void)strcpy(new->name,name); if (table) { (void)strcpy(new->table,table); } new->op = BETWEEN_OP; new->bool = bool; new->value = minVal; new->maxValue = maxVal; new->subCond = NULL; new->next = NULL; if (!query->condHead) { query->condHead = query->condTail = new; } else { query->condTail->next = new; query->condTail = new; } memFreeIdent(ident); debugTrace(TRACE_OUT,"parseAddBetween()");}/****************************************************************************** _msqlAddCond - add a conditional spec to the list**** Purpose : Store part of a "where_clause" for later use** Args : field name, test op, value, bool (ie. AND | OR)** Returns : Nothing** Notes : the BOOL field is only provided if this is not the first** element of a where_clause.*/int parseAddCondition(ident,op,value,bool,query) mIdent_t *ident; int op; mVal_t *value; int bool; mQuery_t *query;{ mCond_t *new; char *name, *table; debugTrace(TRACE_IN,"parseAddCondition()"); if (value == NULL) abort(); query->numConds++; if (query->numConds > MAX_FIELDS) { memFreeIdent(ident); netError(query->clientSock, "Too many conditions in query"); debugTrace(TRACE_OUT,"parseAddCondition()"); return(-1); } if (*(ident->seg2)) { name = ident->seg2; table = ident->seg1; } else { name = ident->seg1; table = NULL; } new = memMallocCondition(); (void)strcpy(new->name,name); if (table) { (void)strcpy(new->table,table); } new->op = op; new->bool = bool; new->value = value; new->subCond = NULL; new->next = NULL; if (!query->condHead) { query->condHead = query->condTail = new; } else { query->condTail->next = new; query->condTail = new; } memFreeIdent(ident); debugTrace(TRACE_OUT,"parseAddCond()"); return(0);}/****************************************************************************** _msqlAddOrder - add an order definition to the list**** Purpose : Store part of an "order_clause"** Args : field name, order direction (ie. ASC or DESC)** Returns : Nothing** Notes : */void parseAddOrder(ident,dir, query) mIdent_t *ident; int dir; mQuery_t *query;{ register mOrder_t *new; debugTrace(TRACE_IN,"parseAddOrder()"); new = memMallocOrder(); new->dir = dir; if (*ident->seg1) { (void)strcpy(new->table,ident->seg1); } (void)strcpy(new->name,ident->seg2); if (!query->orderHead) { query->orderHead = query->orderTail = new; } else { query->orderTail->next = new; query->orderTail = new; } memFreeIdent(ident); debugTrace(TRACE_OUT,"parseAddOrder()");}int parseAddTable(name,alias,query) char *name, *alias; mQuery_t *query;{ register mTable_t *new; char *badName = NULL; debugTrace(TRACE_IN,"parseAddTable()"); if (strlen(name) > NAME_LEN) badName = name; if (alias && strlen(alias) > NAME_LEN) badName = alias; if (badName) { netError(query->clientSock, "Identifier name '%s' too long\n",badName); debugTrace(TRACE_OUT,"parseAddTable()"); return(-1); } new = memMallocTable(); if (alias) { (void)strcpy(new->name,alias); (void)strcpy(new->cname,name); } else { (void)strcpy(new->name,name); *(new->cname) = 0; } if (!query->tableHead) { query->tableHead = query->tableTail = new; } else { query->tableTail->next = new; query->tableTail = new; } debugTrace(TRACE_OUT,"parseAddTable()"); return(0);}int parseAddIndex(name, table, uniq, type, query) char *name, *table; int uniq, type; mQuery_t *query;{ char *badName = NULL; debugTrace(TRACE_IN,"parseAddIndex()"); if ((int)strlen(name) > NAME_LEN) badName = name; if ((int)strlen(table) > NAME_LEN) badName = table; if (badName) { netError(query->clientSock, "Identifier name '%s' too long\n",badName); debugTrace(TRACE_OUT,"parseAddIndex()"); return(-1); } strncpy(query->indexDef.name,name,NAME_LEN); strncpy(query->indexDef.table,table,NAME_LEN); query->indexDef.unique = uniq; query->indexDef.idxType = type; debugTrace(TRACE_OUT,"parseAddIndex()"); return(0);}void parseSetInsertOffset(value) int value;{ insertOffset = value;}#ifdef NOT_DEFstatic void parseQueryOverrunError(txt, query) char *txt; mQuery_t *query;{ debugTrace(TRACE_IN,"parseQueryOverrunError()"); netError(query->clientSock, "Syntax error. Bad text after query. '%s'\n",txt); debugTrace(TRACE_OUT,"parseQueryOverrunError()");}#endifmQuery_t *parseQuery(server, inBuf, sock, user, db) msqld *server; char *inBuf; int sock; char *user, *db;{ mQuery_t *query; extern mQuery_t *curQuery; /* from lexer.c */ debugTrace(TRACE_IN,"parseQuery()"); query = memMallocQuery(); query->clientSock = sock; query->curUser = user; query->curDB = db; yyInitScanner(inBuf); curQuery = query; curQuery->queryText = inBuf; if (yyparse() != 0) { debugTrace(TRACE_OUT,"parseQuery()"); return(NULL); } debugTrace(TRACE_OUT,"parseQuery()"); return(query);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?