aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorM. Shulhan <ms@kilabit.org>2009-02-15 21:20:52 +0700
committerM. Shulhan <ms@kilabit.org>2009-02-15 21:20:52 +0700
commit1661c4681059e0be014641bfae8aa5096a36fd8b (patch)
tree64ac439371e7cbeff25de6eb556218b845d2dd96
parent8db65208771259e7c4329de32891a5fe37bde227 (diff)
downloadvos-1661c4681059e0be014641bfae8aa5096a36fd8b.tar.xz
fix bug in create statement.
vos: - renice parsing arguments. vos_errno: - rewrite E_VOS_PARAM as global help message. op/vos_Bucket: - bucket_file_write(): new function. - record_write_once(): fix bug in start/end position. - bucket_read_filtered(): + if record is rejected, go to next line. + fix bug in using "str" variable while record is being rejected. op/vos_File: - file_write(): only reset file buffer until idx. op/vos_Record: - record_read_filtered(): if record is rejected, go to next line. proc/vos_create: - vos_process_create(): + remove "bucket_print()" in debug. + fix thread restart, at phase 2. proc/vos_sort: - sort_process(): fix typo.
-rw-r--r--op/vos_Bucket.c100
-rw-r--r--op/vos_File.c2
-rw-r--r--op/vos_Record.c4
-rw-r--r--proc/vos_create.c4
-rw-r--r--proc/vos_sort.c2
-rw-r--r--vos.c47
-rw-r--r--vos_errno.c7
7 files changed, 113 insertions, 53 deletions
diff --git a/op/vos_Bucket.c b/op/vos_Bucket.c
index f7985e2..00c0bb9 100644
--- a/op/vos_Bucket.c
+++ b/op/vos_Bucket.c
@@ -94,7 +94,31 @@ void bucket_destroy(struct Bucket *B, const int n)
}
}
-static int record_write_once(struct Record *R, struct File *F, struct Field *frmt)
+static int bucket_file_write(struct File *F)
+{
+ int s = 0;
+ unsigned long len = 0;
+ unsigned long fidx = F->idx;
+
+ /* set F->idx to the last new line */
+ while (F->idx > 0 && FCURC(F) != CH_NEWLINE)
+ F->idx--;
+
+ len = fidx - F->idx;
+ fidx = F->idx;
+
+ s = file_write(F);
+ if (s)
+ return s;
+
+ F->buf = memmove(F->buf, &F->buf[fidx], len);
+ F->idx = len;
+
+ return 0;
+}
+
+static int record_write_once(struct Record *R, struct File *F,
+ struct Field *frmt, int *start_p)
{
int s;
long len = 0;
@@ -102,20 +126,19 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm
/* set start position */
if (frmt->start_p) {
- len = F->pos + frmt->start_p;
- if (len < F->idx) {
- while (F->idx > len) {
+ if ((*start_p) > frmt->start_p) {
+ while ((*start_p) > frmt->start_p) {
FCURC(F) = ' ';
F->idx--;
+ (*start_p)--;
}
- } else {
- len2 = F->idx;
- while (len2 < len) {
+ } else if ((*start_p) < frmt->start_p) {
+ while ((*start_p) < frmt->start_p) {
+ (*start_p)++;
FCURC(F) = ' ';
F->idx++;
- len2++;
if (F->idx >= F->size) {
- s = file_write(F);
+ s = bucket_file_write(F);
if (s)
return s;
}
@@ -125,9 +148,10 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm
/* write left quote */
if (frmt->left_q) {
+ (*start_p)++;
FCURC(F) = frmt->left_q;
if (++F->idx >= F->size) {
- s = file_write(F);
+ s = bucket_file_write(F);
if (s)
return s;
}
@@ -146,13 +170,14 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm
len = len2;
}
if ((F->idx + len) >= F->size) {
- s = file_write(F);
+ s = bucket_file_write(F);
if (s)
return s;
}
if (len > 0) {
memcpy(&FCURC(F), R->v->buf, len);
F->idx += len;
+ (*start_p) += len;
str_prune(R->v);
}
@@ -160,8 +185,9 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm
if (frmt->right_q) {
FCURC(F) = frmt->right_q;
F->idx++;
+ (*start_p)++;
if (F->idx >= F->size) {
- s = file_write(F);
+ s = bucket_file_write(F);
if (s)
return s;
}
@@ -173,8 +199,9 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm
FCURC(F) = ' ';
F->idx++;
len++;
+ (*start_p)++;
if (F->idx >= F->size) {
- s = file_write(F);
+ s = bucket_file_write(F);
if (s)
return s;
}
@@ -184,8 +211,9 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm
if (frmt->sep) {
FCURC(F) = frmt->sep;
F->idx++;
+ (*start_p)++;
if (F->idx >= F->size) {
- s = file_write(F);
+ s = bucket_file_write(F);
if (s)
return s;
}
@@ -200,7 +228,7 @@ int bucket_write(struct Bucket *B, const int n, struct File *F,
int s = 0;
int i = 0;
int empty = 1;
- unsigned long nrow = 0;
+ int start_p = 0;
struct Field *pfld = 0;
struct String snon = {0, 0, "\0"};
struct Record non = {0, 0, &snon, 0, 0, 0, 0};
@@ -222,31 +250,33 @@ int bucket_write(struct Bucket *B, const int n, struct File *F,
pfld = flds;
for (i = 1; i < n; i++) {
if (! B[i].stat) {
- s = record_write_once(B[i].p, F, pfld);
+ s = record_write_once(B[i].p, F, pfld,
+ &start_p);
if (s)
goto err;
B[i].p = B[i].p->row_next;
- if (B[i].p == B[i].cnt->row_last || (! B[i].p)) {
+ if (B[i].p == B[i].cnt->row_last
+ || (! B[i].p)) {
empty++;
- B[i].stat = 1;
- B[i].p = B[i].cnt;
- B[i].cnt->row_last = 0;
+ B[i].stat = 1;
+ B[i].p = B[i].cnt;
+ B[i].cnt->row_last = 0;
}
} else {
- s = record_write_once(&non, F, pfld);
+ s = record_write_once(&non, F, pfld,
+ &start_p);
}
pfld = pfld->next;
}
if (F->idx >= F->size) {
- s = file_write(F);
+ s = bucket_file_write(F);
if (s)
goto err;
}
FCURC(F) = CH_NEWLINE;
F->idx++;
- F->pos = F->idx;
- nrow++;
+ start_p = 0;
}
file_write(F);
err:
@@ -303,7 +333,6 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld)
if (s)
goto err;
}
-
}
}
} else if (fld->left_q) {
@@ -334,16 +363,16 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld)
}
}
} else if (fld->right_q) {
- if (fld->flag && ! reject)
+ if (fld->flag && ! reject) {
s = file_fetch_until(F, str, fld->right_q);
- else
+ start_p += str->idx + 1;
+ } else {
s = file_skip_until(F, fld->right_q);
+ }
if (s)
goto err;
F->idx++;
- start_p += str->idx + 1;
-
if (F->idx >= F->size) {
s = file_read(F);
if (s)
@@ -370,16 +399,15 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld)
}
}
} else if (fld->sep) {
- if (fld->flag && !reject)
+ if (fld->flag && !reject) {
s = file_fetch_until(F, str, fld->sep);
- else
+ start_p += str->idx + 1;
+ } else
s = file_skip_until(F, fld->sep);
if (s)
goto err;
F->idx++;
- start_p += str->idx + 1;
-
if (F->idx >= F->size) {
s = file_read(F);
if (s)
@@ -400,6 +428,7 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld)
/* reject this record */
if (s == 0) {
reject = 1;
+ break;
/* prune later */
}
}
@@ -407,7 +436,7 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld)
fld = fld->next;
}
if (FCURC(F) != CH_NEWLINE) {
- s = file_fetch_until(F, str, CH_NEWLINE);
+ s = file_skip_until(F, CH_NEWLINE);
}
F->idx++;
@@ -424,7 +453,8 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld)
s = 0;
/* move `p' to the next row in the bucket */
while (fld) {
- B[fld->idx].p = B[fld->idx].p->row_next;
+ if (B[fld->idx].p)
+ B[fld->idx].p = B[fld->idx].p->row_next;
fld = fld->next;
}
}
diff --git a/op/vos_File.c b/op/vos_File.c
index 5d0ffee..dfb80cb 100644
--- a/op/vos_File.c
+++ b/op/vos_File.c
@@ -107,7 +107,7 @@ int file_write(struct File *F)
return E_FILE_WRITE;
}
- F->buf = memset(F->buf, FILE_DEF_SET, F->size);
+ F->buf = memset(F->buf, FILE_DEF_SET, F->idx);
F->pos += F->idx;
F->idx = 0;
diff --git a/op/vos_Record.c b/op/vos_Record.c
index 459b43f..17a9f3d 100644
--- a/op/vos_Record.c
+++ b/op/vos_Record.c
@@ -689,7 +689,7 @@ int record_read_filtered(struct Record **R, struct File *F, struct Field *fld)
/* reject this record */
if (s == 0) {
reject = 1;
- str_prune(str);
+ break;
}
}
@@ -710,7 +710,7 @@ int record_read_filtered(struct Record **R, struct File *F, struct Field *fld)
}
/* go to next row */
if (FCURC(F) != CH_NEWLINE) {
- s = file_fetch_until(F, str, CH_NEWLINE);
+ s = file_skip_until(F, CH_NEWLINE);
}
F->idx++;
s = 0;
diff --git a/proc/vos_create.c b/proc/vos_create.c
index 0f32de0..14134ab 100644
--- a/proc/vos_create.c
+++ b/proc/vos_create.c
@@ -205,7 +205,6 @@ int vos_process_create(struct Stmt *create)
if (_vos.debug & DBG_CREATE) {
printf("parent: writing bucket\n");
- bucket_print(buckets, n_bucket);
}
s = bucket_write(buckets, n_bucket, F, create->out->fields);
if (s)
@@ -217,7 +216,9 @@ int vos_process_create(struct Stmt *create)
/* restart threads */
if (cproc[i].status == CPROC_BUCKETS_FULL)
cproc[i].status = CPROC_START;
+ }
+ for (i = 0; i < n_in; i++) {
/* wait until child fill the buckets */
while (cproc[i].status == CPROC_START)
sleep(THREAD_TIME_WAIT);
@@ -238,7 +239,6 @@ int vos_process_create(struct Stmt *create)
if (_vos.debug & DBG_CREATE) {
printf("parent: writing bucket\n");
- bucket_print(buckets, n_bucket);
}
s = bucket_write(buckets, n_bucket, F, create->out->fields);
if (s)
diff --git a/proc/vos_sort.c b/proc/vos_sort.c
index 627bfd8..70b5078 100644
--- a/proc/vos_sort.c
+++ b/proc/vos_sort.c
@@ -191,7 +191,7 @@ static void *sort_process(void *parm)
goto err;
}
- /* phase 1: create & file rows */
+ /* phase 1: create & fill rows */
while (FCURP(F) < psort->pos_end) {
s = record_read(&R, F, psort->sort->in->fields);
if (! R)
diff --git a/vos.c b/vos.c
index a2d6fee..40f0d5a 100644
--- a/vos.c
+++ b/vos.c
@@ -5,6 +5,13 @@
#include "proc/vos_create.h"
#include "proc/vos_join.h"
+enum _arg_todo {
+ ARG_DONE = 0,
+ ARG_START,
+ ARG_DEBUG_VALUE,
+ ARG_VOS_SCRIPT
+};
+
/**
* @return:
* < 0..(n-1) : success
@@ -29,25 +36,43 @@ int get_token_idx(const char **ls, const unsigned int n, const char *tok)
static int vos_init(int argc, char **argv)
{
- /* very lazy parsing argument */
- if (argc < 1 || argc == 2 || argc > 3)
- return E_VOS_PARAM;
+ int i = 1;
+ int s = ARG_START;
_vos.debug = 0;
+ while (i <= argc && s != ARG_DONE) {
+ switch (s) {
+ case ARG_START:
+ s = strcmp(argv[i], "-h");
+ if (s == 0)
+ return E_VOS_PARAM;
+
+ s = strcmp(argv[i], "-d");
+ if (s == 0)
+ s = ARG_DEBUG_VALUE;
+ else
+ s = ARG_VOS_SCRIPT;
+ break;
+
+ case ARG_DEBUG_VALUE:
+ _vos.debug = strtol(argv[i], 0, 0);
+ s = ARG_VOS_SCRIPT;
+ break;
- if (argc == 3) {
- if (argv[1][0] != '-')
- return E_VOS_PARAM;
- if (argv[1][1] != 'd')
- return E_VOS_PARAM;
- _vos.debug = strtol(argv[2], 0, 0);
+ case ARG_VOS_SCRIPT:
+ _vos.script = argv[i];
+ s = ARG_DONE;
+ break;
+ }
+ i++;
}
+ if (s != ARG_DONE)
+ return E_VOS_PARAM;
_vos.file_buf_size = VOS_DEF_FILE_BUF_SIZE;
_vos.proc_cmp_case = VOS_DEF_PROC_CMP_CASE;
_vos.proc_max = VOS_DEF_PROC_MAX;
_vos.proc_max_row = VOS_DEF_PROC_MAX_ROW;
- _vos.script = argv[argc];
srand(time((void *) 0));
@@ -97,7 +122,7 @@ int main(int argc, char *argv[])
s = vos_init(argc - 1, argv);
if (s)
- return s;
+ goto err;
s = vos_parsing(&stmt, _vos.script);
if (s)
diff --git a/vos_errno.c b/vos_errno.c
index 5f340e1..09a5c5a 100644
--- a/vos_errno.c
+++ b/vos_errno.c
@@ -2,7 +2,12 @@
const char *vos_errmsg[N_VOS_ERRNO] = {
"\0",
- "Usage: vos [-d {1,2,4,8,16}] <vos script>\n\0",
+ "Usage: vos [-d {1|2|4|8|16}] <vos script>\n"\
+ " -d 1 : debug / test script\n"\
+ " -d 2 : debug script parser\n"\
+ " -d 4 : debug sort statement\n"\
+ " -d 8 : debug create statement\n"\
+ " -d 16 : debug join statement\n\0",
"line %d: unexpected character '%c'.\n\0",
"line %d: unexpected token '%s'.\n\0",