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

📄 process.c

📁 uClinux下用的数据库
💻 C
📖 第 1 页 / 共 4 页
字号:
			}		}	}	netEndOfList(sock);	debugTrace(TRACE_OUT,"msqlListFields()");}int processCreateTable(server, query)	msqld		*server;	mQuery_t	*query;{	char		*table;	char		datPath[255],			oflPath[255];	int		fd;	sblk_t 		sblock;	u_int		freeList;	debugTrace(TRACE_IN,"processCreateTable()");	table = query->tableHead->name;	/*	** Write the catalog entry	*/	if (tableCreateDefinition(server, table,query) < 0)	{		debugTrace(TRACE_OUT,"processCreateTable()");		return(-1);	}			/*	** Create an empty table	*/		snprintf(datPath,MSQL_PATH_LEN, "%s/%s/%s.dat", server->config.dbDir,		query->curDB, table);	fd = open(datPath,O_CREAT | O_WRONLY , 0600);	if (fd < 0)	{		unlink(datPath);		snprintf(errMsg, MAX_ERR_MSG,DATA_FILE_ERROR,table, 			(char*)strerror(errno));		msqlDebug1(MOD_ERR,"Error creating table file for \"%s\"\n",			table);		debugTrace(TRACE_OUT,"processCreateTable()");		return(-1);	}	sblock.version = DB_VERSION;	sblock.numRows = sblock.activeRows = 0;	sblock.freeList = NO_POS;	sblock.sequence.step = sblock.sequence.value = 0;	if (write(fd,&sblock,SBLK_SIZE) < SBLK_SIZE)	{		close(fd);		unlink(datPath);		snprintf(errMsg, MAX_ERR_MSG, DATA_FILE_ERROR,table, 			(char*)strerror(errno));		msqlDebug1(MOD_ERR,"Error creating table file for \"%s\"\n",			table);		debugTrace(TRACE_OUT,"processCreateTable()");		return(-1);	}	close(fd);	/*	** NOTE : The index def file file doesn't need to	** 	  be created here as it is a 0 length file.  It	**	  is now created using the open when the table is	**	  first loaded into the table cache	** 	** Create an empty overflow file	*/	snprintf(oflPath,MSQL_PATH_LEN,"%s/%s/%s.ofl", server->config.dbDir,		query->curDB, table);	fd = open(oflPath,O_CREAT | O_WRONLY , 0600);	if (fd < 0)	{		unlink(datPath);		snprintf(errMsg,MAX_ERR_MSG,DATA_FILE_ERROR,table, 			(char*)strerror(errno));		msqlDebug1(MOD_ERR,"Error creating table file for \"%s\"\n",			table);		debugTrace(TRACE_OUT,"processCreateTable()");		return(-1);	}	freeList = NO_POS;	if (write(fd,&freeList,sizeof(u_int)) < sizeof(u_int))	{		close(fd);		unlink(datPath);		snprintf(errMsg,MAX_ERR_MSG,DATA_FILE_ERROR,table, 			(char*)strerror(errno));		msqlDebug1(MOD_ERR,"Error creating table file for \"%s\"\n",			table);		debugTrace(TRACE_OUT,"processCreateTable()");		return(-1);	}	close(fd);	netOK(query->clientSock);	debugTrace(TRACE_OUT,"processCreateTable()");	return(0);}int processCreateIndex(server, query)	msqld		*server;	mQuery_t	*query;{	char		defPath[255],			idxPath[255],			*indexName,			*tableName,			*dbName;	mField_t	*curField,			*indexField;	int		fd,			fieldLoc,			fieldCount,			length,			existingData;	cache_t		*entry;	mIndex_t	tmp;	debugTrace(TRACE_IN,"processCreateIndex()");	/*	** Ensure the index name doesn't clash with a field	*/	tableName = query->indexDef.table;	indexName = query->indexDef.name;	dbName = query->curDB;	if ((entry = tableLoadDefinition(server,tableName,NULL,dbName)) == NULL)	{		debugTrace(TRACE_OUT,"processCreateIndex()");		return(-1);	}	existingData = (entry->sblk->activeRows > 0)?1:0;	length = 0;	curField = entry->def;	while(curField)	{		if ( *(curField->name) != *(indexName))		{			curField = curField->next;			continue;		}		if (strcmp(curField->name,indexName) != 0)		{			curField = curField->next;			continue;		}		strcpy(errMsg,"Bad index name");		debugTrace(TRACE_OUT,"processCreateIndex()");		return(-1);	}	/*	** Can't clash with another index either	*/	snprintf(defPath,MSQL_PATH_LEN,"%s/%s/%s.idx",server->config.dbDir,		dbName, tableName);	snprintf(idxPath,MSQL_PATH_LEN,"%s/%s/%s.idx-%s",server->config.dbDir,		dbName, tableName, indexName);	fd = open(defPath,O_RDWR | O_CREAT , 0600);	if (fd < 0)	{		(void)close(fd);		strcpy(errMsg,"Can't open index definition file");		debugTrace(TRACE_OUT,"processCreateIndex()");		return(-1);	}	while(read(fd, &tmp, sizeof(tmp)) == sizeof(tmp))	{		if ( *(tmp.name) != *(indexName))			continue;		if (strcmp(tmp.name, indexName) != 0)			continue;				strcpy(errMsg,"Bad index name");		debugTrace(TRACE_OUT,"processCreateIndex()");		close(fd);		return(-1);	}		/*	** OK, setup the struct and add it to the index def file	*/	indexField = query->fieldHead;	fieldCount = 0;	while(indexField)	{		fieldLoc = 0;		curField = entry->def;		while(curField)		{			if ( *(curField->name) != *(indexField->name))			{				curField = curField->next;				fieldLoc++;				continue;			}			if (strcmp(curField->name, indexField->name)!=0)			{				curField = curField->next;				fieldLoc++;				continue;			}			break;		}		if (!curField)		{			snprintf(errMsg,MAX_ERR_MSG,"Unknown field '%s'",				indexField->name);			debugTrace(TRACE_OUT,"msqlCreateIndex()");			close(fd);			return(-1);		}		if (curField->type == TEXT_TYPE)		{			strcpy(errMsg,"Can't index on a TEXT field!");			debugTrace(TRACE_OUT,"msqlCreateIndex()");			close(fd);			return(-1);		}		query->indexDef.fields[fieldCount] = fieldLoc;		fieldCount++;		length += curField->length;		if(fieldCount > MAX_INDEX_WIDTH - 1)		{			strcpy(errMsg,"Too many fields in index");			debugTrace(TRACE_OUT,"msqlCreateIndex()");			close(fd);			return(-1);		}		indexField = indexField->next;	}	if (fieldCount == 1)	{		switch(typeBaseType(curField->type))		{			case CHAR_TYPE:				query->indexDef.keyType = IDX_CHAR;				break;			case INT_TYPE:				query->indexDef.keyType = IDX_INT;				break;			case UINT_TYPE:				query->indexDef.keyType = IDX_UINT;				break;			case REAL_TYPE:				query->indexDef.keyType = IDX_REAL;				break;			default:				query->indexDef.keyType = IDX_BYTE;				break;		}	}	else	{		query->indexDef.keyType = IDX_BYTE;	}	query->indexDef.fields[fieldCount] = -1;	query->indexDef.length = length;	query->indexDef.fieldCount = fieldCount;	write(fd, &(query->indexDef), sizeof(mIndex_t));	close(fd);	idxCreate(idxPath, query->indexDef.idxType, 0600, length, 		query->indexDef.keyType, IDX_DUP, &query->indexDef.environ);        /*        ** Invalidate the cache entry so that we reload it        */	cacheInvalidateEntry(entry);	/*	** If there's data in the table then prime the index	*/	if (existingData)	{		if(_populateIndexFile(server, query) < 0)		{			debugTrace(TRACE_OUT,"msqlCreateIndex()");			return(-1);		}	}	if (server->config.hasBroker)		brokerChildSendFlush(query->curDB,query->indexDef.table);	netOK(query->clientSock);	debugTrace(TRACE_OUT,"msqlCreateIndex()");	return(0);}int processDropSequence(server, query)	msqld		*server;	mQuery_t	*query;{	cache_t		*entry;	debugTrace(TRACE_IN,"processDropSequence()");	/*	** See if there is a sequence on this table	*/	if ((entry = tableLoadDefinition(server,query->sequenceDef.table, NULL,		query->curDB)) == NULL)	{		debugTrace(TRACE_OUT,"processDropSequence()");		return(-1);	}	if (entry->sblk->sequence.step == 0)	{		snprintf(errMsg,MAX_ERR_MSG,			"Table '%s' does not have a sequence",			query->sequenceDef.table);		debugTrace(TRACE_OUT,"processDropSequence()");		return(-1);	}	entry->sblk->sequence.step = 0;	entry->sblk->sequence.value = 0;	if (server->config.hasBroker)		brokerChildSendFlush(query->curDB, query->sequenceDef.table);	netOK(query->clientSock);	debugTrace(TRACE_OUT,"processDropSequence()");	return(0);}int processCreateSequence(server, query)	msqld		*server;	mQuery_t	*query;{	cache_t		*entry;	debugTrace(TRACE_IN,"processCreateSequence()");	/*	** See if there is a sequence on this table already	*/	if ((entry = tableLoadDefinition(server,query->sequenceDef.table,NULL,		query->curDB)) == NULL)	{		debugTrace(TRACE_OUT,"processCreateSequence()");		return(-1);	}	if (entry->sblk->sequence.step != 0)	{		snprintf(errMsg,MAX_ERR_MSG,			"Table '%s' already has a sequence",			query->sequenceDef.table);		debugTrace(TRACE_OUT,"processCreateSequence()");		return(-1);	}	entry->sblk->sequence.step = query->sequenceDef.step;	entry->sblk->sequence.value = query->sequenceDef.value;	if (server->config.hasBroker)		brokerChildSendFlush(query->curDB,query->sequenceDef.table);	netOK(query->clientSock);	debugTrace(TRACE_OUT,"processCreateSequence()");	return(0);}int processDropTable(server, query)	msqld		*server;	mQuery_t	*query;{	extern	cache_t	*tableCache;	char		path[MSQL_PATH_LEN],			defPath[MSQL_PATH_LEN],			*cp;	FILE		*fp;	int		fd;	mIndex_t	tmp;	cache_t 	*entry;	int		count;	debugTrace(TRACE_IN,"processDropTable()");	/* 	** Invalidate the cache entry so that we don't use it again 	*/	count = 0;	while(count < server->config.tableCache)	{		entry = tableCache + count;		if (*entry->db == *query->curDB)		{			if((strcmp(entry->db,query->curDB)==0) &&		   	(strcmp(entry->table,query->tableHead->name)==0 ||		    	strcmp(entry->cname,query->tableHead->name)==0))			{				cacheInvalidateEntry(entry);			}		}		count++;	}	/*	** Now blow away the table files	*/	snprintf(path,MSQL_PATH_LEN,"%s/%s/%s.def",server->config.dbDir,		query->curDB, query->tableHead->name);	cp = (char *)rindex(path,'.');	fp = fopen(path,"rb");	if (!fp)	{		snprintf(errMsg,MAX_ERR_MSG,BAD_TABLE_ERROR,			query->tableHead->name);		msqlDebug1(MOD_ERR,"Unknown table \"%s\"\n",			query->tableHead->name);		debugTrace(TRACE_OUT,"processDropTable()");		return(-1);	}	(void)fclose(fp);	unlink(path);	*cp = 0;	strcat(path,".dat");	unlink(path);	*cp = 0;	strcat(path,".ofl");	unlink(path);	/*	** Take care of the index files.	*/	*cp = 0;	strcpy(defPath,path);	strcat(defPath,".idx");	*cp = 0;	strcat(path,".idx-");	cp = path + strlen(path);	fd = open(defPath,O_RDONLY ,0);	if (fd >= 0)	{		while(read(fd,&tmp,sizeof(tmp)) == sizeof(tmp))		{			strcat(path,tmp.name);			unlink(path);			*cp = 0;		}		close(fd);	}	unlink(defPath);	if (server->config.hasBroker)		brokerChildSendFlush(query->curDB, query->tableHead->name);	netOK(query->clientSock);	debugTrace(TRACE_OUT,"processDropTable()");	return(0);}int processDropIndex(server, query, internal)	msqld		*server;	mQuery_t	*query;	int		internal;{	char		defPath[255],			tmpPath[255];	int		in,			out,			found;	mIndex_t	tmp;	cache_t		*entry;	/* 	** Note : internal flag used to determine if we've been called	** directly from a "drop index" query or if some other part	** of the backend has called us (eg. during the processing	** of a table drop)	*/	debugTrace(TRACE_IN,"processDropIndex()");	/*	** Open the definition file and a file to copy it into	*/	if ((entry = tableLoadDefinition(server,query->indexDef.table, NULL,		query->curDB)) == NULL)	{		debugTrace(TRACE_OUT,"processDropIndex()");		return(-1);	}	snprintf(defPath,MSQL_PATH_LEN,"%s/%s/%s.idx", server->config.dbDir,		query->curDB, query->indexDef.table);	in = open(defPath,O_RDONLY ,0600);	if (in < 0)	{		snprintf(errMsg,MAX_ERR_MSG,"No indices defined for '%s'",			query->indexDef.table);		debugTrace(TRACE_OUT,"processDropIndex()");		return(-1);	}	snprintf(tmpPath,MSQL_PATH_LEN,"%s/%s/%s.idx-tmp", server->config.dbDir,		query->curDB, query->indexDef.table);	out = open(tmpPath,O_RDWR | O_CREAT ,0600);	if (out < 0)	{		(void)close(in);

⌨️ 快捷键说明

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