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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list