aboutsummaryrefslogtreecommitdiff
path: root/op/vos_Stmt.c
diff options
context:
space:
mode:
authorM.Shulhan <ms@kilabit.org>2009-04-05 17:52:57 +0700
committerM.Shulhan <ms@kilabit.org>2009-04-05 17:52:57 +0700
commit19c3ee85ea45c5b5c2a479af17b86ba65d52673b (patch)
tree2bf8fe1e94691e85d2c19adea8a42240586c5862 /op/vos_Stmt.c
parent459cd2d7715baea5a56090b3331f0b9b95e832c2 (diff)
downloadvos-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.c78
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) {