diff options
| author | M.Shulhan <ms@kilabit.org> | 2009-04-05 17:52:57 +0700 |
|---|---|---|
| committer | M.Shulhan <ms@kilabit.org> | 2009-04-05 17:52:57 +0700 |
| commit | 19c3ee85ea45c5b5c2a479af17b86ba65d52673b (patch) | |
| tree | 2bf8fe1e94691e85d2c19adea8a42240586c5862 /op/vos_Stmt.c | |
| parent | 459cd2d7715baea5a56090b3331f0b9b95e832c2 (diff) | |
| download | vos-19c3ee85ea45c5b5c2a479af17b86ba65d52673b.tar.xz | |
fix sort process.
type/vos_TStmtJoin:
- deleted, merge into vos_TStmtMeta.h
op/vos_File:
- file_open: fix memory leak on open fail.
- file_raw_copy: new, function to copy file.
- file_raw_get_dirname: new, function to get directory name from path.
op/vos_Stmt:
- stmt_find_by_name: re-structure the switch.
- stmt_update_meta: new, update meta filename to the last output name.
op/vos_StmtSort:
- stmtsort_create: remove free sort->in.
- stmtsort_init_output: split into stmtsort_init.
- stmtsort_init: new.
- stmtsort_destroy: remove unused temporary sort file.
proc/vos_create:
- vos_process_create: update meta object before processing.
proc/vos_join:
- change affect by split of stmtsort_init_output.
proc/vos_parser:
- use 'filename' as an alias if alias is not set in statement.
proc/vos_sort:
- vos_process_sort: fix bug in sort process.
when input file is splitted into several thread and the first split
is precisely end in a new-line character, this can cause losing of one
row in the output file.
- sort_write: use 'get_tmp_dir()' to get temporary directory.
proc/vos_sort_merge:
- vos_sort_merge: simplified the merge process if only one file to be merged.
- single_merge: new.
vos:
- get_tmp_dir: new, function to get temporary directory.
Diffstat (limited to 'op/vos_Stmt.c')
| -rw-r--r-- | op/vos_Stmt.c | 78 |
1 files changed, 38 insertions, 40 deletions
diff --git a/op/vos_Stmt.c b/op/vos_Stmt.c index 41fc13c..0ad0bbd 100644 --- a/op/vos_Stmt.c +++ b/op/vos_Stmt.c @@ -26,59 +26,26 @@ void stmt_add(struct Stmt **stmt, struct Stmt *new_stmt) (*stmt)->last = new_stmt; } -struct Stmt * stmt_find_by_name(struct Stmt *stmt, const char *name) +struct Stmt * stmt_find_by_name(struct Stmt *p, const char *name) { - int s = 0; - struct Stmt *p = stmt->last; - while (p) { switch (p->type) { case STMT_LOAD: - s = strcasecmp(p->in->filename, name); - if (s == 0) - return p; - - if (p->in->alias) { - s = strcasecmp(p->in->alias, name); - if (s == 0) - return p; - } - break; - case STMT_SORT: - s = strcasecmp(p->in->filename, name); - if (s == 0) + if (strcasecmp(p->in->filename, name) == 0) return p; - if (p->in->alias) { - s = strcasecmp(p->in->alias, name); - if (s == 0) - return p; - } - break; - - case STMT_CREATE: - s = strcasecmp(p->out->filename, name); - if (s == 0) + if (strcasecmp(p->in->alias, name) == 0) return p; - - if (p->out->alias) { - s = strcasecmp(p->out->alias, name); - if (s == 0) - return p; - } break; + case STMT_CREATE: case STMT_JOIN: - s = strcasecmp(p->out->filename, name); - if (s == 0) + if (strcasecmp(p->out->filename, name) == 0) return p; - if (p->out->alias) { - s = strcasecmp(p->out->alias, name); - if (s == 0) - return p; - } + if (strcasecmp(p->out->alias, name) == 0) + return p; break; } p = p->prev; @@ -87,6 +54,37 @@ struct Stmt * stmt_find_by_name(struct Stmt *stmt, const char *name) return 0; } +/** + * @desc: update the filename in 'smeta' to point to sort output. + * + * some statement use sort output as input, since sort output some time + * is not defined in script (without INTO clause) then we need to update + * the filename before processing. + * + * @return: + * < 0 : success. + * < E_FILE_NOT_EXIST : fail, could not find file alias in 'stmt'. + */ +int stmt_update_meta(struct Stmt *stmt, struct StmtMeta *smeta) +{ + struct Stmt *p; + + if (smeta->filename) + return 0; + + p = stmt_find_by_name(stmt, smeta->alias); + if (! p) { + str_raw_copy(smeta->alias, &_vos.e_sparm0); + return E_FILE_NOT_EXIST; + } + + if (p->type == STMT_SORT) { + str_raw_copy(p->out->filename, &smeta->filename); + } + + return 0; +} + void stmt_print(struct Stmt *stmt) { while (stmt) { |
