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

Reply via email to