Esempio n. 1
0
int segment_pageout(SEGMENT * SEG, int i)
{
    segment_seek(SEG, SEG->scb[i].n, 0);
    if (write(SEG->fd, SEG->scb[i].buf, SEG->size) != SEG->size) {
	G_warning("segment_pageout: %s", strerror(errno));
	return -1;
    }
    SEG->scb[i].dirty = 0;

    return 1;
}
Esempio n. 2
0
int segment_get_row(const SEGMENT * SEG, void *buf, int row)
{
    int size;
    int ncols;
    int scols;
    int n, index, col;

    ncols = SEG->ncols - SEG->spill;
    scols = SEG->scols;
    size = scols * SEG->len;

    for (col = 0; col < ncols; col += scols) {
	segment_address(SEG, row, col, &n, &index);
	if (segment_seek(SEG, n, index) < 0)
	    return -1;

	if (read(SEG->fd, buf, size) != size) {
	    G_warning("segment_get_row: %s", strerror(errno));
	    return -1;
	}

	/* The buf variable is a void pointer and thus points to anything. */
	/* Therefore, it's size is unknown and thus, it cannot be used for */
	/* pointer arithmetic (some compilers treat this as an error - SGI */
	/* MIPSPro compiler for one). Since the read command is reading in */
	/* "size" bytes, cast the buf variable to char * before incrementing */
	buf = ((char *)buf) + size;
    }
    if ((size = SEG->spill * SEG->len)) {
	segment_address(SEG, row, col, &n, &index);
	if (segment_seek(SEG, n, index) < 0)
	    return -1;

	if (read(SEG->fd, buf, size) != size) {
	    G_warning("segment_get_row: %s", strerror(errno));
	    return -1;
	}
    }

    return 1;
}