Changeset: e750bf9ef2fe for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e750bf9ef2fe Modified Files: sql/backends/monet5/vaults/lidar/lidar.c Branch: data-vaults Log Message:
[LiDAR]: Attach all files in directory diffs (296 lines): diff --git a/sql/backends/monet5/vaults/lidar/lidar.c b/sql/backends/monet5/vaults/lidar/lidar.c --- a/sql/backends/monet5/vaults/lidar/lidar.c +++ b/sql/backends/monet5/vaults/lidar/lidar.c @@ -630,20 +630,46 @@ typedef struct either_lidar_header { static str * LIDARopenPath(str fname, int *len) { - str *res = NULL; + str *ret = NULL; struct stat buf; + DIR *dir; + struct dirent *dir_entry; + str path; + int idx = 0; stat(fname, &buf); if (S_ISDIR(buf.st_mode)) { - *len = 1; + *len = 0; + dir = opendir(fname); + while((dir_entry = readdir(dir)) != NULL) { + if (dir_entry->d_type == DT_REG) + (*len)++; + } + closedir(dir); + ret = (str *)malloc((*len)*sizeof(str)); + path = (str)malloc(strlen(fname) + 256); + dir = opendir(fname); + while((dir_entry = readdir(dir)) != NULL) { + if (dir_entry->d_type == DT_REG) { + strncpy(path, fname, strlen(fname)); + path[strlen(fname)] = '\0'; + strncat(path, dir_entry->d_name, strlen(dir_entry->d_name)); + ret[idx++] = strdup(path); +#ifndef NDEBUG + printf("file: %s %d\n", path, *len); +#endif + } + } + closedir(dir); + free(path); } else { *len = 1; - res = (str *)malloc(sizeof(str)); - res[0] = fname; + ret = (str *)malloc(sizeof(str)); + ret[0] = strdup(fname); } - return res; + return ret; } static lidar_header * @@ -913,8 +939,7 @@ LIDARattach(Client cntxt, MalBlkPtr mb, oid fid, tid, cid, rid = oid_nil; char *tname_low = NULL, *s, bname[BUFSIZ]; char *p; - /* int cnum; */ - lidar_header *header; + lidar_header *header = NULL; int scaleX, scaleY, scaleZ; int precisionX, precisionY, precisionZ; char *istmt=NULL, *cstmt=NULL; @@ -925,6 +950,7 @@ LIDARattach(Client cntxt, MalBlkPtr mb, int prm = 0, files_len = 0, idx; str *files = NULL; str filename; + double minimumX, maximumX, minimumY, maximumY, minimumZ, maximumZ; switch(pci->argc) { case 2: @@ -956,24 +982,6 @@ LIDARattach(Client cntxt, MalBlkPtr mb, if ((msg = checkSQLContext(cntxt)) != MAL_SUCCEED) return msg; -/* stat(fname, &buf); */ -/* if (S_ISDIR(buf.st_mode)) { */ -/* header = LIDARopenDir(fname); */ -/* if (header->msg != NULL) { */ -/* msg = header->msg; */ -/* free(header); */ -/* return msg; */ -/* } */ -/* fprintf(stderr, "Path: %s is a directory.\n", fname); */ -/* msg = createException(MAL, "lidar.attach", "Unimplemented functionality"); */ -/* return msg; */ -/* } */ -/* else { */ -/* #ifndef NDEBUG */ -/* fprintf(stderr, "Path: %s is a file.\n", fname); */ -/* #endif */ -/* } */ - /* if needed, instantiate the schema and gather all appropriate tables */ tr = m->session->tr; sch = mvc_bind_schema(m, "sys"); @@ -993,8 +1001,55 @@ LIDARattach(Client cntxt, MalBlkPtr mb, fname, LASError_GetLastErrorMsg()); return msg; } - idx = 0; - for (filename = files[idx]; idx < files_len; idx++) { + +#ifndef NDEBUG + printf("tname: %s\n", tname); +#endif + /* extract the file name from the absolute path */ + if ((s = strrchr(tname, DIR_SEP)) == NULL) + s = tname; + else + s++; + strcpy(bname, s); + if (s) *s = 0; + + tname_low = toLower(bname); + + /* Find the last dot in the filename and replace it with '\0' if + * it exists. This removes the extension part of the file, unless + * the extension part itself contains a dot character. + */ + p = strrchr(tname_low, '.'); + if (p != NULL) { + *p = '\0'; + } + + /* Sanitize table name by substituting dot characters ('.') for underscores + * ('_'). + */ + while ((p = strchr(tname_low, '.')) != NULL) { + *p = '_'; + } + +#ifndef NDEBUG + printf("tablename: %s\n", tname_low); +#endif + + /* check table name for existence in the lidar catalog */ + col = mvc_bind_column(m, lidar_tbl, "name"); + rid = table_funcs.column_find_row(m->session->tr, col, tname_low, NULL); + /* or as regular SQL table */ + tbl = mvc_bind_table(m, sch, tname_low); + if (rid != oid_nil || tbl) { + msg = createException(SQL, "lidar.attach", "Table %s already exists\n", tname_low); + return msg; + } + + for (idx = 0; idx < files_len; idx++) { + filename = files[idx]; + if (header != NULL) { + free(header); + } header = LIDARopenFile(filename); /* See if anything went wrong */ if (header->msg != NULL) { @@ -1005,9 +1060,9 @@ LIDARattach(Client cntxt, MalBlkPtr mb, /* check if the file is already attached */ col = mvc_bind_column(m, lidar_fl, "name"); - rid = table_funcs.column_find_row(m->session->tr, col, fname, NULL); + rid = table_funcs.column_find_row(m->session->tr, col, filename, NULL); if (rid != oid_nil) { - msg = createException(SQL, "lidar.attach", "File %s already attached\n", fname); + msg = createException(SQL, "lidar.attach", "File %s already attached\n", filename); return msg; } @@ -1017,47 +1072,11 @@ LIDARattach(Client cntxt, MalBlkPtr mb, store_funcs.append_col(m->session->tr, mvc_bind_column(m, lidar_fl, "id"), &fid, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_fl, "name"), fname, TYPE_str); + mvc_bind_column(m, lidar_fl, "name"), filename, TYPE_str); /* table.id++ */ col = mvc_bind_column(m, lidar_tbl, "id"); tid = store_funcs.count_col(tr, col, 1) + 1; - /* extract the file name from the absolute path */ - if ((s = strrchr(tname, DIR_SEP)) == NULL) - s = tname; - else - s++; - strcpy(bname, s); - if (s) *s = 0; - - tname_low = toLower(bname); - - /* Find the last dot in the filename and replace it with '\0' if - * it exists. This removes the extension part of the file, unless - * the extension part itself contains a dot character. - */ - p = strrchr(tname_low, '.'); - if (p != NULL) { - *p = '\0'; - } - - /* Sanitize table name by substituting dot characters ('.') for underscores - * ('_'). - */ - while ((p = strchr(tname_low, '.')) != NULL) { - *p = '_'; - } - - /* check table name for existence in the lidar catalog */ - col = mvc_bind_column(m, lidar_tbl, "name"); - rid = table_funcs.column_find_row(m->session->tr, col, tname_low, NULL); - /* or as regular SQL table */ - tbl = mvc_bind_table(m, sch, tname_low); - if (rid != oid_nil || tbl) { - msg = createException(SQL, "lidar.attach", "Table %s already exists\n", tname_low); - return msg; - } - scaleX = (int)ceil(-log(header->hi->scaleX)/log(10)); scaleY = (int)ceil(-log(header->hi->scaleY)/log(10)); scaleZ = (int)ceil(-log(header->hi->scaleZ)/log(10)); @@ -1172,11 +1191,45 @@ LIDARattach(Client cntxt, MalBlkPtr mb, mvc_bind_column(m, lidar_col, "PrecisionY"), &precisionY, TYPE_int); store_funcs.append_col(m->session->tr, mvc_bind_column(m, lidar_col, "PrecisionZ"), &precisionZ, TYPE_int); + if (idx == 0) { + minimumX = header->hi->minX; + minimumY = header->hi->minY; + minimumZ = header->hi->minZ; + maximumX = header->hi->maxX; + maximumY = header->hi->maxY; + maximumZ = header->hi->maxZ; + } + else { + if (header->hi->minX < minimumX) { + minimumX = header->hi->minX; + } + if (header->hi->minY < minimumY) { + minimumY = header->hi->minY; + } + if (header->hi->minZ < minimumZ) { + minimumZ = header->hi->minZ; + } + + if (header->hi->maxX > maximumX) { + maximumX = header->hi->maxX; + } + if (header->hi->maxY > maximumY) { + maximumY = header->hi->maxY; + } + if (header->hi->maxZ > maximumZ) { + maximumZ = header->hi->maxZ; + } + } /* add a lidar_column tuple */ col = mvc_bind_column(m, lidar_col, "id"); cid = store_funcs.count_col(tr, col, 1) + 1; } + for (idx = 0; idx < files_len; idx++) { + free(files[idx]); + } + free(files); + /* create an SQL table to hold the LIDAR table */ tbl = mvc_create_table(m, sch, tname_low, tt_table, 0, SQL_PERSIST, 0, input_params.cnum); @@ -1266,8 +1319,8 @@ LIDARattach(Client cntxt, MalBlkPtr mb, cstmt = GDKzalloc(8192); col = mvc_bind_column(m, tbl, "x"); if (col) { - snprintf(minval, BUFSIZ, "%lf", header->hi->minX); - snprintf(maxval, BUFSIZ, "%lf", header->hi->maxX); + snprintf(minval, BUFSIZ, "%lf", minimumX); + snprintf(maxval, BUFSIZ, "%lf", maximumX); snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s,%s);", col->base.id, col_type, precisionX, sz, sz, uniq, nils, minval, maxval, "false", "false"); msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); @@ -1279,8 +1332,8 @@ LIDARattach(Client cntxt, MalBlkPtr mb, col = mvc_bind_column(m, tbl, "y"); if (col) { - snprintf(minval, BUFSIZ, "%lf", header->hi->minY); - snprintf(maxval, BUFSIZ, "%lf", header->hi->maxY); + snprintf(minval, BUFSIZ, "%lf", minimumY); + snprintf(maxval, BUFSIZ, "%lf", maximumY); snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s,%s);", col->base.id, col_type, precisionY, sz, sz, uniq, nils, minval, maxval, "false", "false"); msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); @@ -1291,8 +1344,8 @@ LIDARattach(Client cntxt, MalBlkPtr mb, } col = mvc_bind_column(m, tbl, "z"); if (col) { - snprintf(minval, BUFSIZ, "%lf", header->hi->minZ); - snprintf(maxval, BUFSIZ, "%lf", header->hi->maxZ); + snprintf(minval, BUFSIZ, "%lf", minimumZ); + snprintf(maxval, BUFSIZ, "%lf", maximumZ); snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s,%s);", col->base.id, col_type, precisionZ, sz, sz, uniq, nils, minval, maxval, "false", "false"); msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list