/*	SDB - relation creation routines	*/

#include "bdscio.h"
#include "dbqdefs.h"

struct relation *db_rcreate(rname)
	char *rname;
{
	struct relation *rptr;

	if ((rptr = alloc(RELSIZE)) == NULL)
		{ RETERR(INSMEM) }

	strncpy(rptr->rl_name,rname,RNSIZE);
	rptr->rl_tcnt = 0;
	rptr->rl_tmax = 0;
	rptr->rl_data = 512;
	rptr->rl_size = 1;
	rptr->rl_header.hd_attrs[0].at_name[0] = 0;

	return (rptr);
}

int db_rcheader(rptr)
	struct relation *rptr;
{
	char rname[RNSIZE+1],filename[RNSIZE+13];

	db_cvbytes(rptr->rl_tcnt,rptr->rl_header.hd_tcnt);
	db_cvbytes(rptr->rl_tmax,rptr->rl_header.hd_tmax);
	db_cvbytes(rptr->rl_data,rptr->rl_header.hd_data);
	db_cvbytes(rptr->rl_size,rptr->rl_header.hd_size);

	strncpy(rname,rptr->rl_name,RNSIZE);
	rname[RNSIZE] = 0;
	sprintf(filename,"%s.dbq",rname);

	if ((ccreat(rptr->rl_fd,filename)) == -1) {
		free(rptr);
		RETERR(RELCRE)
	}

	if (cwrite(rptr->rl_fd,&rptr->rl_header,512) != 512) {
		cclose(rptr->rl_fd);
		free(rptr);
		RETERR(BADHDR)
	}

	return (TRUE);
}

int db_rctuples(rptr,tcnt)
	struct relation *rptr;
	unsigned tcnt;
{
	unsigned i;
	char *tbuf;

	rptr->rl_tmax = tcnt;

	if ((tbuf = alloc(RELSIZE)) == NULL)
		{ RETERR(INSMEM) }

	for (i = 0; i < tcnt; i++)
		if (cwrite(rptr->rl_fd,tbuf,rptr->rl_size) != rptr->rl_size) {
			free(tbuf);
			RETERR(INSBLK)
		}
	free(tbuf);

	return(TRUE);
}

int db_rcdone(rptr)
	struct relation *rptr;
{
	db_cvbytes(rptr->rl_tcnt,rptr->rl_header.hd_tcnt);
	db_cvbytes(rptr->rl_tmax,rptr->rl_header.hd_tmax);

#ifdef DEBUG
	printf("rcdone - %d, %d, %d\n",rptr->rl_tmax,
			rptr->rl_header.hd_tmax[0],
			rptr->rl_header.hd_tmax[1]);
#endif
	cseek(rptr->rl_fd,0,0);
	if (cwrite(rptr->rl_fd,&rptr->rl_header,512) != 512) {
		cclose(rptr->rl_fd);
		free(rptr);
		RETERR(BADHDR)
	}

	cclose(rptr->rl_fd);
	free(rptr);
	return(TRUE);
}

int db_rcattr(rptr,aname,type,size,scale)
	struct relation *rptr;
	char *aname;
	int type,size,scale;
{
	int i;

	for (i = 0; i < NATTRS; i++)
		if (rptr->rl_header.hd_attrs[i].at_name[0] == 0)
			break;
		else if (db_sncmp(aname,rptr->rl_header.hd_attrs[i].at_name,ANSIZE) == 0)
			{ RETERR(DUPATT) }

	if (i == NATTRS)
		{ RETERR(MAXATT) }

	strncpy(rptr->rl_header.hd_attrs[i].at_name,aname,ANSIZE);
	rptr->rl_header.hd_attrs[i].at_type = type;
	rptr->rl_header.hd_attrs[i].at_size = size;
	rptr->rl_header.hd_attrs[i].at_scale = scale;

	if (++i != NATTRS)
		rptr->rl_header.hd_attrs[i].at_name[0] = 0;

	rptr->rl_size += size;

	return(TRUE);
}

cale;

	if (++i != NATTRS)
		rptr->rl_header.hd_attrs[i].at_name[0] = 0;

	rptr-