Changeset: 1a7f507a8e86 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1a7f507a8e86 Modified Files: sql/backends/monet5/vaults/lidar/lidar.c Branch: data-vaults Log Message:
Fix some memory leaks diffs (truncated from 542 to 300 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 @@ -451,12 +451,6 @@ LIDARtest(int *res, str *fname) return msg; } -typedef struct either_lidar_header { - str msg; - lidar_info *hi; -} lidar_header; - - static str * LIDARopenPath(str fname, int *len) { @@ -545,18 +539,17 @@ openpath_cleanup: } -static lidar_header * -LIDARopenFile(str fname) +static str +LIDARopenFile(str fname, lidar_info *res) { - lidar_header *res = (lidar_header *)malloc(sizeof(lidar_header)); LASReaderH reader = NULL; LASHeaderH header = NULL; - res->msg = NULL; - res->hi = NULL; + str msg = MAL_SUCCEED; + /* check if file exists */ if (access(fname, F_OK) == -1) { - res->msg = createException(MAL, "lidar.openfile", "File %s not found.", fname); - return res; + msg = createException(MAL, "lidar.openfile", "File %s not found.", fname); + return msg; } /* open the LAS/LAZ file */ @@ -565,64 +558,63 @@ LIDARopenFile(str fname) reader = LASReader_Create(fname); MT_lock_unset(&mt_lidar_lock); if (LASError_GetErrorCount() != 0) { - res->msg = createException(MAL, "lidar.openfile", "Error accessing LIDAR file %s (%s)", - fname, LASError_GetLastErrorMsg()); - return res; + msg = createException(MAL, "lidar.openfile", "Error accessing LIDAR file %s (%s)", + fname, LASError_GetLastErrorMsg()); + return msg; } /* get the header */ header = LASReader_GetHeader(reader); if (!header) { - res->msg = createException(MAL, "lidar.openfile", "Error accessing LIDAR file %s (%s)", - fname, LASError_GetLastErrorMsg()); - return res; + msg = createException(MAL, "lidar.openfile", "Error accessing LIDAR file %s (%s)", + fname, LASError_GetLastErrorMsg()); + return msg; } #ifndef NDEBUG print_lidar_header(stderr, header, fname, 0, 0); #endif - res->hi = (lidar_info *)malloc(sizeof(lidar_info)); /* read values from the header */ - res->hi->fileSourceId = LASHeader_GetFileSourceId(header); - res->hi->versionMajor = LASHeader_GetVersionMajor(header); - res->hi->versionMinor = LASHeader_GetVersionMinor(header); - res->hi->dataFormatId = LASHeader_GetDataFormatId(header); - res->hi->creationDOY = LASHeader_GetCreationDOY(header); - res->hi->creationYear = LASHeader_GetCreationYear(header); - res->hi->recordsCount = LASHeader_GetRecordsCount(header); - res->hi->pointRecordsCount = LASHeader_GetPointRecordsCount(header); - res->hi->dataOffset = LASHeader_GetDataOffset(header); - res->hi->headerPadding = LASHeader_GetHeaderPadding(header); - res->hi->reserved = LASHeader_GetReserved(header); - res->hi->dataRecordLength = LASHeader_GetDataRecordLength(header); - res->hi->headerSize = LASHeader_GetHeaderSize(header); - res->hi->byteSize = LASSchema_GetByteSize(LASHeader_GetSchema(header)); - res->hi->baseByteSize = LASSchema_GetBaseByteSize(LASHeader_GetSchema(header)); - res->hi->WKT = LASSRS_GetWKT(LASHeader_GetSRS(header)); - res->hi->WKT_CompoundOK = LASSRS_GetWKT_CompoundOK(LASHeader_GetSRS(header)); - res->hi->proj4 = LASSRS_GetProj4(LASHeader_GetSRS(header)); + res->fileSourceId = LASHeader_GetFileSourceId(header); + res->versionMajor = LASHeader_GetVersionMajor(header); + res->versionMinor = LASHeader_GetVersionMinor(header); + res->dataFormatId = LASHeader_GetDataFormatId(header); + res->creationDOY = LASHeader_GetCreationDOY(header); + res->creationYear = LASHeader_GetCreationYear(header); + res->recordsCount = LASHeader_GetRecordsCount(header); + res->pointRecordsCount = LASHeader_GetPointRecordsCount(header); + res->dataOffset = LASHeader_GetDataOffset(header); + res->headerPadding = LASHeader_GetHeaderPadding(header); + res->reserved = LASHeader_GetReserved(header); + res->dataRecordLength = LASHeader_GetDataRecordLength(header); + res->headerSize = LASHeader_GetHeaderSize(header); + res->byteSize = LASSchema_GetByteSize(LASHeader_GetSchema(header)); + res->baseByteSize = LASSchema_GetBaseByteSize(LASHeader_GetSchema(header)); + res->WKT = LASSRS_GetWKT(LASHeader_GetSRS(header)); + res->WKT_CompoundOK = LASSRS_GetWKT_CompoundOK(LASHeader_GetSRS(header)); + res->proj4 = LASSRS_GetProj4(LASHeader_GetSRS(header)); /* read data from the header */ - res->hi->scaleX = LASHeader_GetScaleX(header); - res->hi->scaleY = LASHeader_GetScaleY(header); - res->hi->scaleZ = LASHeader_GetScaleZ(header); - res->hi->offsetX = LASHeader_GetOffsetX(header); - res->hi->offsetY = LASHeader_GetOffsetY(header); - res->hi->offsetZ = LASHeader_GetOffsetZ(header); - res->hi->minX = LASHeader_GetMinX(header); - res->hi->minY = LASHeader_GetMinY(header); - res->hi->minZ = LASHeader_GetMinZ(header); - res->hi->maxX = LASHeader_GetMaxX(header); - res->hi->maxY = LASHeader_GetMaxY(header); - res->hi->maxZ = LASHeader_GetMaxZ(header); + res->scaleX = LASHeader_GetScaleX(header); + res->scaleY = LASHeader_GetScaleY(header); + res->scaleZ = LASHeader_GetScaleZ(header); + res->offsetX = LASHeader_GetOffsetX(header); + res->offsetY = LASHeader_GetOffsetY(header); + res->offsetZ = LASHeader_GetOffsetZ(header); + res->minX = LASHeader_GetMinX(header); + res->minY = LASHeader_GetMinY(header); + res->minZ = LASHeader_GetMinZ(header); + res->maxX = LASHeader_GetMaxX(header); + res->maxY = LASHeader_GetMaxY(header); + res->maxZ = LASHeader_GetMaxZ(header); MT_lock_set(&mt_lidar_lock); if (header != NULL) LASHeader_Destroy(header); if (reader != NULL) LASReader_Destroy(reader); MT_lock_unset(&mt_lidar_lock); - return res; + return msg; } /* @@ -819,7 +811,7 @@ LIDARattach(Client cntxt, MalBlkPtr mb, oid fid, tid, cid, rid = oid_nil; char *tname_low = NULL, *s, bname[BUFSIZ]; char *p; - lidar_header *header = NULL; + lidar_info header; int scaleX = 0, scaleY = 0, scaleZ = 0; int precisionX, precisionY, precisionZ; char *istmt=NULL, *cstmt=NULL; @@ -879,12 +871,17 @@ LIDARattach(Client cntxt, MalBlkPtr mb, lidar_col = mvc_bind_table(m, sch, "lidar_columns"); files = LIDARopenPath(fname, &files_len); - if (files == NULL || files_len == 0) { + if (files == NULL) { msg = createException(MAL, "lidar.attach", "Error accessing path %s (%s)", fname, LASError_GetLastErrorMsg()); return msg; } + if (files_len == 0) { + msg = createException(MAL, "lidar.attach", "No LiDAR files found in %s", fname); + goto attach_cleanup0; + } + #ifndef NDEBUG fprintf(stderr, "tname: %s\n", tname); #endif @@ -929,17 +926,25 @@ LIDARattach(Client cntxt, MalBlkPtr mb, return msg; } + /* For each file: + * 1. Try to open it as LIDAR and read the metadata + * 2. Add the necessary tuples in the LIDAR catalog + * 3. Compute scale and precision for X, Y and Z columns + * 4. Store the metadata in the catalog + * 5. Set min and max values for X, Y and Z as they will be needed later + */ 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) { - msg = header->msg; - free(header); - return msg; + msg = LIDARopenFile(filename, &header); + + /* If we cannot open the file, just ignore it. */ + if (msg != MAL_SUCCEED) { +#ifndef NDEBUG + fprintf(stderr, "Ignoring file %s:\n", filename); + fprintf(stderr, " Message: %s\n", msg); +#endif + continue; + /* return msg; */ } /* check if the file is already attached */ @@ -961,28 +966,28 @@ LIDARattach(Client cntxt, MalBlkPtr mb, col = mvc_bind_column(m, lidar_tbl, "id"); tid = store_funcs.count_col(tr, col, 1) + 1; - 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)); + scaleX = (int)ceil(-log(header.scaleX)/log(10)); + scaleY = (int)ceil(-log(header.scaleY)/log(10)); + scaleZ = (int)ceil(-log(header.scaleZ)/log(10)); - precisionX = scaleX + (int)ceil(log(header->hi->maxX)/log(10)); - precisionY = scaleY + (int)ceil(log(header->hi->maxY)/log(10)); - precisionZ = scaleZ + (int)ceil(log(header->hi->maxZ)/log(10)); + precisionX = scaleX + (int)ceil(log(header.maxX)/log(10)); + precisionY = scaleY + (int)ceil(log(header.maxY)/log(10)); + precisionZ = scaleZ + (int)ceil(log(header.maxZ)/log(10)); #ifndef NDEBUG fprintf(stderr, "Scale: %f %f %f\n", - header->hi->scaleX, - header->hi->scaleY, - header->hi->scaleZ); + header.scaleX, + header.scaleY, + header.scaleZ); fprintf(stderr, "Decimal type scale: %d %d %d\n", - (int)ceil(-log(header->hi->scaleX)/log(10)), - (int)ceil(-log(header->hi->scaleY)/log(10)), - (int)ceil(-log(header->hi->scaleZ)/log(10))); + (int)ceil(-log(header.scaleX)/log(10)), + (int)ceil(-log(header.scaleY)/log(10)), + (int)ceil(-log(header.scaleZ)/log(10))); fprintf(stderr, "Decimal type precision: %d %d %d\n", - (int)ceil(log(header->hi->maxX)/log(10)), - (int)ceil(log(header->hi->maxY)/log(10)), - (int)ceil(log(header->hi->maxZ)/log(10))); + (int)ceil(log(header.maxX)/log(10)), + (int)ceil(log(header.maxY)/log(10)), + (int)ceil(log(header.maxZ)/log(10))); fprintf(stderr, "decimal digits: %d %d %d\n", scaleX, scaleY, scaleZ); fprintf(stderr, "total digits: %d %d %d\n", precisionX, precisionY, precisionZ); @@ -999,41 +1004,41 @@ LIDARattach(Client cntxt, MalBlkPtr mb, store_funcs.append_col(m->session->tr, mvc_bind_column(m, lidar_tbl, "name"), tname_low, TYPE_str); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "FileSourceId"), &header->hi->fileSourceId, TYPE_int); + mvc_bind_column(m, lidar_tbl, "FileSourceId"), &header.fileSourceId, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "VersionMajor"), &header->hi->versionMajor, TYPE_int); + mvc_bind_column(m, lidar_tbl, "VersionMajor"), &header.versionMajor, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "VersionMinor"), &header->hi->versionMinor, TYPE_int); + mvc_bind_column(m, lidar_tbl, "VersionMinor"), &header.versionMinor, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "DataFormatId"), &header->hi->dataFormatId, TYPE_int); + mvc_bind_column(m, lidar_tbl, "DataFormatId"), &header.dataFormatId, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "CreationDOY"), &header->hi->creationDOY, TYPE_int); + mvc_bind_column(m, lidar_tbl, "CreationDOY"), &header.creationDOY, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "CreationYear"), &header->hi->creationYear, TYPE_int); + mvc_bind_column(m, lidar_tbl, "CreationYear"), &header.creationYear, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "RecordsCount"), &header->hi->recordsCount, TYPE_int); + mvc_bind_column(m, lidar_tbl, "RecordsCount"), &header.recordsCount, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "PointRecordsCount"), &header->hi->pointRecordsCount, TYPE_int); + mvc_bind_column(m, lidar_tbl, "PointRecordsCount"), &header.pointRecordsCount, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "DataOffset"), &header->hi->dataOffset, TYPE_int); + mvc_bind_column(m, lidar_tbl, "DataOffset"), &header.dataOffset, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "HeaderPadding"), &header->hi->headerPadding, TYPE_int); + mvc_bind_column(m, lidar_tbl, "HeaderPadding"), &header.headerPadding, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "Reserved"), &header->hi->reserved, TYPE_int); + mvc_bind_column(m, lidar_tbl, "Reserved"), &header.reserved, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "DataRecordLength"), &header->hi->dataRecordLength, TYPE_int); + mvc_bind_column(m, lidar_tbl, "DataRecordLength"), &header.dataRecordLength, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "HeaderSize"), &header->hi->headerSize, TYPE_int); + mvc_bind_column(m, lidar_tbl, "HeaderSize"), &header.headerSize, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "ByteSize"), &header->hi->byteSize, TYPE_int); + mvc_bind_column(m, lidar_tbl, "ByteSize"), &header.byteSize, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "BaseByteSize"), &header->hi->baseByteSize, TYPE_int); + mvc_bind_column(m, lidar_tbl, "BaseByteSize"), &header.baseByteSize, TYPE_int); store_funcs.append_col(m->session->tr, - mvc_bind_column(m, lidar_tbl, "WKT"), header->hi->WKT, TYPE_str); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list