⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.c

📁 uClinux下用的数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** Copyright (c) 1995-2001  Hughes Technologies Pty Ltd.  All rights** reserved.  **** Terms under which this software may be used or copied are** provided in the  specific license associated with this product.**** Hughes Technologies disclaims all warranties with regard to this ** software, including all implied warranties of merchantability and ** fitness, in no event shall Hughes Technologies be liable for any ** special, indirect or consequential damages or any damages whatsoever ** resulting from loss of use, data or profits, whether in an action of ** contract, negligence or other tortious action, arising out of or in ** connection with the use or performance of this software.****** $Id: util.c,v 1.19 2002/12/05 04:23:26 bambi Exp $***//*** Module	: main : util** Purpose	: ** Exports	: ** Depends Upon	: *//**************************************************************************** STANDARD INCLUDES**************************************************************************/#include <common/config.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#ifdef HAVE_UNISTD_H#  include <unistd.h>#endif#ifdef HAVE_STRING_H#  include <string.h>#endif#ifdef HAVE_STRINGS_H#  include <strings.h>#endif/**************************************************************************** MODULE SPECIFIC INCLUDES**************************************************************************/#include <fcntl.h>#include <errno.h>#include <sys/stat.h>#ifdef HAVE_DIRENT_H#    include <dirent.h>   #endif#ifdef HAVE_SYS_DIR_H#  include <sys/dir.h>#endif#include <common/msql_defs.h>#include <common/debug/debug.h>#include <msqld/index/index.h>#include <msqld/includes/errmsg.h>#include <msqld/includes/msqld.h>#include <msqld/main/main.h>#include <msqld/main/yaccer.h>#include <msqld/main/version.h>#include <msqld/main/table.h>#include <msqld/main/util.h>#include <msqld/main/sysvar.h>#include <msqld/main/memory.h>#include <msqld/cra/cra.h>#include <common/types/types.h>#include <libmsql/msql.h>/**************************************************************************** GLOBAL VARIABLES**************************************************************************/char	errMsg[MAX_ERR_MSG];/**************************************************************************** PRIVATE ROUTINES**************************************************************************/static char *escapeExport(buf)        char    *buf;{        char    *cp1,                *cp2;        static  char newBuf[1024];        cp1 = buf;        cp2 = newBuf;        while(*cp1)        {                if (*cp1 == '\\' || *cp1 == ',')                {                        *cp2 = '\\';                        cp2++;                }                *cp2 = *cp1;                cp1++;                cp2++;        }        *cp2 = 0;        return(newBuf);}static void _formatData(packet,fields, export)        char    *packet;        mField_t *fields;        int     export;{        char    outBuf[100],                realFmt[10],                *cp;        u_char  *outData = NULL;        mField_t *curField;	u_char	int8Val;	u_short	int16Val;        debugTrace(TRACE_IN,"formatPacket()");        *packet = 0;        cp = packet;        curField = fields;        while(curField)        {                if (!curField->value->nullVal)                {                        switch(curField->type)                        {                                case INT_TYPE:                                case INT8_TYPE:                                case INT16_TYPE:                                        snprintf(outBuf,sizeof(outBuf),"%d",                                            curField->value->val.intVal);                                        outData = (u_char *)outBuf;                                        break;                                case UINT_TYPE:                                        snprintf(outBuf,sizeof(outBuf),"%u",                                            curField->value->val.intVal);                                        outData = (u_char *)outBuf;                                        break;                                case UINT8_TYPE:					int8Val = curField->value->val.intVal;                                        snprintf(outBuf,sizeof(outBuf),"%u",                                            (u_int)int8Val);                                        outData = (u_char *)outBuf;                                        break;                                case UINT16_TYPE:					int16Val = curField->value->val.intVal;                                        snprintf(outBuf,sizeof(outBuf),"%u",                                            (u_int)int16Val);                                        outData = (u_char *)outBuf;                                        break;#ifdef HUGE_T                                case INT64_TYPE:                                        snprintf(outBuf,sizeof(outBuf),"%qd",                                            curField->value->val.int64Val);                                        outData = (u_char *)outBuf;                                        break;                                case UINT64_TYPE:                                        snprintf(outBuf,sizeof(outBuf),"%qu",                                            curField->value->val.int64Val);                                        outData = (u_char *)outBuf;                                        break;#endif                                case IPV4_TYPE:                                        typePrintIPv4(outBuf,sizeof(outBuf),                                                curField->value->val.intVal);                                        outData = (u_char *)outBuf;                                        break;                                case DATE_TYPE:                                        typePrintDate(outBuf,sizeof(outBuf),                                                curField->value->val.intVal);                                        outData = (u_char *)outBuf;                                        break;                                case TIME_TYPE:                                        typePrintTime(outBuf,sizeof(outBuf),                                                curField->value->val.intVal);                                        outData = (u_char *)outBuf;                                        break;                                case MONEY_TYPE:                                        typePrintMoney(outBuf,sizeof(outBuf),                                                curField->value->val.intVal);                                        outData = (u_char *)outBuf;                                        break;                                case CIDR4_TYPE:                                        typePrintCIDR4(outBuf,sizeof(outBuf),                                                curField->value->val.byteVal);                                        outData = (u_char *)outBuf;                                        break;                                case CHAR_TYPE:                                case TEXT_TYPE:                                        outData = curField->value->val.charVal;                                        break;                                case REAL_TYPE:                                        snprintf(realFmt,sizeof(realFmt),                                                "%%.%df",                                                curField->value->precision);                                        snprintf(outBuf,sizeof(outBuf),                                                realFmt,                                                curField->value->val.realVal);                                        outData = (u_char *)outBuf;                                        break;				default:					fprintf(stderr,"Unknown data type %d\n",						curField->type);                        }                        if (export == 0)                        {                                /* inline sprintf dodge */                                register int loop = 100000,                                                start=0,						vlen =strlen(outData),						v;				v = vlen;                                while(loop) {                                        if (v / loop > 0 || start) {                                                *cp++=(v / loop) + '0';                                                v = v % loop;                                                start=1;                                        }                                        loop /= 10;                                }                                *cp++ = ':';                                *cp = 0;                                strcat(cp, (char *)outData);                               /* cp = cp + strlen(cp); */                                cp = cp + vlen;                        }                        else                        {                                if (curField != fields)                                        strcat(packet,",");                                outData = escapeExport(outData);                                strcat(packet,(char *)outData);                        }                }                else                {                        strcat(cp,"-2:");                        cp += 3;                }                curField = curField->next;        }        strcat(packet,"\n");        debugTrace(TRACE_OUT,"formatPacket()");}/**************************************************************************** PUBLIC ROUTINES**************************************************************************/void utilQualifyFields(query)	mQuery_t	*query;{	mField_t	*curField,			*oldField;	debugTrace(TRACE_IN,"utilQualifyFields()");	curField = query->fieldHead;	while(curField)	{		if (curField->function)		{			oldField = curField;			curField = curField->function->paramHead;			while(curField)			{				if (*(curField->table) == 0)				{					strcpy(curField->table,						query->tableHead->name);				}				curField=curField->next;			}			curField = oldField->next;			continue;		}		if (*(curField->table) == 0)		{			(void)strcpy(curField->table,query->tableHead->name);		}		curField=curField->next;	}	debugTrace(TRACE_OUT,"utilQualifyFields()");}void utilQualifyConds(query)	mQuery_t	*query;{	mCond_t		*curCond;	mQuery_t	tmpQuery;	debugTrace(TRACE_IN,"utilQualifyConds()");	curCond = query->condHead;	while(curCond)	{		if (curCond->subCond)		{			bzero(&tmpQuery, sizeof(tmpQuery));			tmpQuery.tableHead = query->tableHead;			tmpQuery.condHead = curCond->subCond;			utilQualifyConds(&tmpQuery);			curCond = curCond->next;			continue;		}		if(*(curCond->table) == 0)		{			(void)strcpy(curCond->table,query->tableHead->name);		}		curCond=curCond->next;	}	debugTrace(TRACE_OUT,"utilQualifyConds()");}void utilQualifyOrder(query)	mQuery_t	*query;{	mOrder_t	*curOrder;	debugTrace(TRACE_IN,"utilQualifyOrder()");	curOrder = query->orderHead;	while(curOrder)	{		if(*(curOrder->table) == 0)		{			(void)strcpy(curOrder->table,query->tableHead->name);		}		curOrder=curOrder->next;	}	debugTrace(TRACE_OUT,"utilQualifyOrder()");}int utilSetFieldInfo(cacheEntry, fields)	cache_t		*cacheEntry;	mField_t	*fields;{	mField_t	*curField,			*fieldDef,			*curParam;	int		curOffset,			count,			res;	debugTrace(TRACE_IN,"utilSetFieldsInfo()");	curField = fields;	curOffset = count = 0;	while(curField)	{	    if (curField->literalParamFlag)	    {		curField = curField->next;		continue;	    }	    if (curField->function)	    {		if (cacheEntry->result == 1)		{			curField = curField->next;				continue;		}		if(utilSetFieldInfo(cacheEntry,curField->function->paramHead)<0)		{			debugTrace(TRACE_OUT,"utilSetFieldInfo()");			return(-1);		}		if (curField->type != CHAR_TYPE)		{			curField->dataLength = typeFieldSize(curField->type);		}		else		{			curParam = curField->function->paramHead;			while(curParam)			{				if (curParam->length > curField->dataLength)					curField->dataLength=curParam->length;				curParam = curParam->next;			}			curField->dataLength *= 2;		}		curField->length = curField->dataLength;		curField->offset = curOffset;		curField->fieldID = count;		curField->overflow = NO_POS;		curField->functResultFlag = 1;		curOffset+=curField->dataLength+1;		curField = curField->next;			continue;	    }	    if (*curField->name == '_' && ! cacheEntry->result)	    {		if ((res = sysvarCheckVariable(cacheEntry,curField)) < 0)		{			if (res == -2)				return(-1);					snprintf(errMsg, MAX_ERR_MSG, SYSVAR_ERROR, 				curField->name);			msqlDebug1(MOD_ERR,SYSVAR_ERROR, curField->name);			return(-1);		}	    	curField->sysvar = 1;		curField = curField->next;		continue;	    }	    curField->sysvar = 0;	    fieldDef = cacheEntry->def;	    while(fieldDef)	    {		if( *(curField->name) != *(fieldDef->name) ||		    (curField->function == NULL && 			*(curField->table) != *(fieldDef->table)))		{			curOffset+=fieldDef->dataLength+1;/* +1 for null flag */			fieldDef = fieldDef->next;			count++;			continue;		}		if(strcmp(curField->name,fieldDef->name) != 0 ||		    (curField->function == NULL && 		   	strcmp(curField->table,fieldDef->table) != 0))		{			curOffset+=fieldDef->dataLength+1;/* +1 for null flag */			fieldDef = fieldDef->next;			count++;			continue;		}		curField->type = fieldDef->type;		curField->length = fieldDef->length;		curField->dataLength = fieldDef->dataLength;		curField->flags = fieldDef->flags;		curField->entry = fieldDef->entry;		curField->offset = curOffset;		curField->fieldID = count;		curField->overflow = NO_POS;		curOffset+=curField->dataLength+1;		break;	    }	    curField = curField->next;	}	debugTrace(TRACE_OUT,"utilSetFieldInfo()");	return(0);}int utilSetupFields(cacheEntry,flist, fields)	cache_t		*cacheEntry;	int		*flist;	mField_t	*fields;{	mField_t	*curField,			*fieldDef;	int		numFields,			*curFL,			curOffset,			count,			res;	debugTrace(TRACE_IN,"utilSetupFields()");	numFields = 0;	curField = fields;	curFL = flist;	while(curField)	{		numFields++;		if (numFields < MAX_FIELDS)			*curFL++ = -1;		curField=curField->next;	}	if (numFields > MAX_FIELDS)	{		snprintf(errMsg,MAX_ERR_MSG,FIELD_COUNT_ERROR);		msqlDebug0(MOD_ERR,"Too many fileds in query\n");		debugTrace(TRACE_OUT,"utilSetupFields()");		return(-1);	}	*curFL = -1;	/*	** If this is a result table then the field list will already	** have the specific offsets we need (including the offsets of	** unusual fields like function results etc).  Just scan the	** field list and use those values	**	** NOTE: This code breaks the creation of tmp tables as the	** offsets are incorrect (i.e. they can reflect the original	** offset from the original table not the result offset of the	** tmp table	**	if (cacheEntry->result)	{		curField = fields;		curFL = flist;		while(curField)		{			*curFL = curField->offset;			curFL++;			curField = curField->next;		}		return(0);	}	*/		/*	** OK, this is not a simple result table so we have to do all	** to hard work	*/	curField = fields;	curFL = flist;	while(curField)	{	    curOffset = count = 0;	    if (curField->literalParamFlag)	    {		curField = curField->next;		continue;	    }	    if (curField->functResultFlag || curField->function)	    {		/*		** Don't mess with the parameter offset setting if we		** are being called for a result table.  We only set		** parameter offsets for source tables!		*/		if (! cacheEntry->result)		{			utilSetupFields(cacheEntry,curField->function->flist, 				curField->function->paramHead);		}		*curFL++ = curOffset;		curOffset+=curField->dataLength+1;		curField = curField->next;			continue;	    }	    if (*curField->name == '_' && ! cacheEntry->result)	    {		if ((res = sysvarCheckVariable(cacheEntry,curField)) < 0)		{			if (res == -2)				return(-1);					snprintf(errMsg, MAX_ERR_MSG, SYSVAR_ERROR, 				curField->name);			msqlDebug1(MOD_ERR,SYSVAR_ERROR, curField->name);			return(-1);		}	    	curField->sysvar = 1;		curField = curField->next;		continue;	    }	    curField->sysvar = 0;	    fieldDef = cacheEntry->def;	    while(fieldDef)	    {		if( *(curField->name) != *(fieldDef->name) ||		    (curField->function == NULL && 			*(curField->table) != *(fieldDef->table)))		{			curOffset+=fieldDef->dataLength+1;/* +1 for null flag */			fieldDef = fieldDef->next;			count++;			continue;		}		if(strcmp(curField->name,fieldDef->name) != 0 ||		    (curField->function == NULL && 		   	strcmp(curField->table,fieldDef->table) != 0))		{			curOffset+=fieldDef->dataLength+1;/* +1 for null flag */			fieldDef = fieldDef->next;			count++;			continue;		}		curField->type = fieldDef->type;		curField->length = fieldDef->length;		curField->dataLength = fieldDef->dataLength;		curField->flags = fieldDef->flags;		curField->entry = fieldDef->entry;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -