日期:2014-05-16  浏览次数:20449 次

简易内存数据库(五)CREATE

接下来就是一行行读column了。

?

因为column有多个,所以我们需要写循环语句 while(...)

循环语句的结束条件是什么呢,读到什么时候column就算读完了呢?

当然是要么文件结束,要么读到‘)’啦。

所以我们可以开头这样写

	fscanf(fp,"%s",buffer);
	while (!feof(fp) && strcmp(buffer,")")) {

?while循环中每读到一次column就创建一个column对象。填充好。

而且column结构设计的时候我用链表结构。所以还要把每次创建的column对象连起来。

?

	//接下去开始读column内容
	Column * current = NULL;
	fscanf(fp,"%s",buffer);
	while (!feof(fp) && strcmp(buffer,")"))
	{
		//每次循环先创建一个column对象
		Column * column = (Column *)malloc(sizeof(Column));
		//清空column
		memset(column, 0, sizeof(Column));

		//因为column是链表结构,所以必有一下几句 1)保留住链表头 2)把链表连起来 3)当前的指针往后移一个
		if (t.columns == NULL) t.columns = column;
		if (current!=NULL) current->next = column;
		current = current->next;

?链表结构的创建一定要记住!1)保留住链表头 2)把链表连起来 3)当前的指针往后移一个

?

好了。到现在为止CREATE最复杂的部分实现了以后。接下来我们就轻松了。只要一个个内容读,读完了1保存在新创建的column中就可以了。

?

		t.columnCount++;

		//第一次读应该读到 column name
		strcpy(column->name, buffer);

		//第二次读应该读到 column type(column length)
		fscanf(fp,"%s",buffer);
		getColumnTypeLength(buffer, &column->type, &column->length)==0; 


		//第三次可能读到NULL; 可能读到; 这两种都代表着可以为空

		fscanf(fp,"%s",buffer);
		if (strcmp(buffer,";")==0 || strcmp(strupr(buffer),"null;")==0)
			column->allowNull = 1;
		//第三次读也可能读到NOT,代表着不能为空
		else if (stricmp(buffer,"not")==0)
		{
			//第四次读应该读到null;
			fscanf(fp,"%s",buffer);
			if (stricmp(buffer,"null;")) return 0; 
			column->allowNull = 0;
		}
 

?这样一个column就都算完成了。继续往下读,完成循环

		//继续读应该读到下一行内容了
		fscanf(fp,"%s",buffer);
	}
	return 1;

?