Changeset: ac685a95d5ca for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ac685a95d5ca
Modified Files:
sql/backends/monet5/vaults/gdal/gdal.c
sql/backends/monet5/vaults/geotiff/geotiff.c
Branch: SciQL-2
Log Message:
gdal & geotiff: fixed BAT reference counting & avoid accessing released
BAT(header)s
diffs (235 lines):
diff --git a/sql/backends/monet5/vaults/gdal/gdal.c
b/sql/backends/monet5/vaults/gdal/gdal.c
--- a/sql/backends/monet5/vaults/gdal/gdal.c
+++ b/sql/backends/monet5/vaults/gdal/gdal.c
@@ -153,7 +153,7 @@ GDALloadGreyscaleImage(bat *x, bat *y, b
{
GDALDatasetH hDataset;
GDALRasterBandH hBand;
- bat bidx = 0, bidy = 0;
+ bat bidx = 0, bidy = 0, bidi;
int wid = 0, len = 0;
BUN pixels = BUN_NONE;
sht bps;
@@ -212,14 +212,15 @@ GDALloadGreyscaleImage(bat *x, bat *y, b
resI->tsorted = FALSE;
resI->trevsorted = FALSE;
BATkey(BATmirror(resI), FALSE);
- BBPkeepref(resI->batCacheid);
+ BBPkeepref(bidi = resI->batCacheid);
+ resI = NULL;
/* Manually compute values for the X-dimension, since we know that its
* range is [0:1:wid] and each of its value must be repeated 'len'
* times with 1 #repeats */
errbuf = ARRAYseries(&bidx, 0, 1, wid, 1, len);
if (errbuf != MAL_SUCCEED) {
- BBPdecref(resI->batCacheid, 1); /* undo the
BBPkeepref(resI->batCacheid) above */
+ BBPdecref(bidi, 1); /* undo the BBPkeepref(resI->batCacheid)
above */
return createException(MAL, "gdal.loadimage", "Failed to create
the X-dimension of %s", *fname);
}
/* Manually compute values for the Y-dimension, since we know that its
@@ -227,25 +228,30 @@ GDALloadGreyscaleImage(bat *x, bat *y, b
* with 'wid' #repeats */
errbuf = ARRAYseries(&bidy, 0, 1, len, wid, 1);
if (errbuf != MAL_SUCCEED) {
- BBPdecref(resI->batCacheid, 1); /* undo the
BBPkeepref(resI->batCacheid) above */
- BBPdecref(resX->batCacheid, 1); /* undo the
BBPkeepref(resX->batCacheid) by ARRAYseries_*() */
+ BBPdecref(bidi, 1); /* undo the BBPkeepref(resI->batCacheid)
above */
+ BBPdecref(bidx, 1); /* undo the BBPkeepref(resX->batCacheid) by
ARRAYseries_*() */
return createException(MAL, "gdal.loadimage", "Failed to create
the y-dimension of %s", *fname);
}
resX = BATdescriptor(bidx); /* these should not fail... */
resY = BATdescriptor(bidy);
if (BATcount(resX) != pixels || BATcount(resY) != pixels) {
- BBPdecref(resX->batCacheid, 1);
- BBPdecref(resY->batCacheid, 1);
- BBPdecref(resI->batCacheid, 1);
- BBPunfix(resX->batCacheid);
- BBPunfix(resY->batCacheid);
- return createException(MAL, "gdal.loadimage", "X or Y dimension
has invalid number of pixels. Got " BUNFMT "," BUNFMT " (!= " BUNFMT ")",
BATcount(resX), BATcount(resY), pixels);
+ BUN cntX = BATcount(resX), cntY = BATcount(resY);
+ BBPunfix(bidx); /* undo physical incref done by
BATdescriptor(bidx) */
+ BBPunfix(bidy); /* undo physical incref done by
BATdescriptor(bidy) */
+ resX = resY = NULL;
+ BBPdecref(bidx, 1); /* undo the BBPkeepref(resX->batCacheid) by
ARRAYseries_*() */
+ BBPdecref(bidy, 1); /* undo the BBPkeepref(resY->batCacheid) by
ARRAYseries_*() */
+ BBPdecref(bidi, 1); /* undo the BBPkeepref(resI->batCacheid)
above */
+ return createException(MAL, "gdal.loadimage", "X or Y dimension
has invalid number of pixels. Got " BUNFMT "," BUNFMT " (!= " BUNFMT ")", cntX,
cntY, pixels);
}
+ BBPunfix(resX->batCacheid); /* undo physical incref done by
BATdescriptor(bidx) */
+ BBPunfix(resY->batCacheid); /* undo physical incref done by
BATdescriptor(bidy) */
+ resX = resY = NULL;
- *x = resX->batCacheid;
- *y = resY->batCacheid;
- *intensity = resI->batCacheid;
+ *x = bidx;
+ *y = bidy;
+ *intensity = bidi;
return MAL_SUCCEED;
}
@@ -267,6 +273,7 @@ GDALimportImage(Client cntxt, MalBlkPtr
char aname[20], buf[BUFSIZ], *s = buf;
bte stat = 0;
bat x, y, intensity;
+ BAT *bx, *by, *bi;
msg = getSQLContext(cntxt, mb, &m, NULL);
if (msg)
@@ -355,17 +362,30 @@ GDALimportImage(Client cntxt, MalBlkPtr
col = mvc_bind_column(m, img, "x");
if (col == NULL)
return createException(MAL, "gdal.import", "Could not find
\"%s\".\"x\"\n", aname);
- store_funcs.append_col(m->session->tr, col, BATdescriptor(x), TYPE_bat);
+ bx = BATdescriptor(x);
+ store_funcs.append_col(m->session->tr, col, bx, TYPE_bat);
+ BBPunfix(x); /* release physical reference inherited from
BATdescriptor()*/
+ bx = NULL;
+ BBPdecref(x, 1); /* release logical reference inherited from
GDALloadGreyscaleImage() */
/* the 'y' dimension */
col = mvc_bind_column(m, img, "y");
if (col == NULL)
return createException(MAL, "gdal.import", "Could not find
\"%s\".\"y\"\n", aname);
- store_funcs.append_col(m->session->tr, col, BATdescriptor(y), TYPE_bat);
+ by = BATdescriptor(y);
+ store_funcs.append_col(m->session->tr, col, by, TYPE_bat);
+ BBPunfix(y); /* release physical reference inherited from
BATdescriptor()*/
+ by = NULL;
+ BBPdecref(y, 1); /* release logical reference inherited from
GDALloadGreyscaleImage() */
/* the 'intensity' column */
col = mvc_bind_column(m, img, "intensity");
if (col == NULL)
return createException(MAL, "gdal.import", "Could not find
\"%s\".\"intensity\"\n", aname);
- store_funcs.append_col(m->session->tr, col, BATdescriptor(intensity),
TYPE_bat);
+ bi = BATdescriptor(intensity);
+ store_funcs.append_col(m->session->tr, col, bi, TYPE_bat);
+ BBPunfix(intensity); /* release physical reference inherited from
BATdescriptor()*/
+ bi = NULL;
+ BBPdecref(intensity, 1); /* release logical reference inherited from
GDALloadGreyscaleImage() */
+
/* update the GDAL catalog to set status to 1 (loaded) */
stat = 1;
col = mvc_bind_column(m, fls, "status");
diff --git a/sql/backends/monet5/vaults/geotiff/geotiff.c
b/sql/backends/monet5/vaults/geotiff/geotiff.c
--- a/sql/backends/monet5/vaults/geotiff/geotiff.c
+++ b/sql/backends/monet5/vaults/geotiff/geotiff.c
@@ -26,7 +26,6 @@
#include "array.h"
#include <xtiffio.h> /* for TIFF */
-
/* FIXME: the use of the 'rs' schema should be reconsidered so that the geotiff
* catalog can be integrated into the SQL catalog.
* When removing the 'rs' schame, the code of client/mapiclient/dump.c MUST be
@@ -161,7 +160,7 @@ str
GTIFFloadGreyscaleImage(bat *x, bat *y, bat *intensity, str *fname)
{
TIFF *tif = (TIFF*)0;
- bat bidx = 0, bidy = 0;
+ bat bidx = 0, bidy = 0, bidi = 0;
int wid = 0, len = 0;
BUN pixels = BUN_NONE;
sht photoint, bps;
@@ -228,14 +227,15 @@ GTIFFloadGreyscaleImage(bat *x, bat *y,
resI->tsorted = FALSE;
resI->trevsorted = FALSE;
BATkey(BATmirror(resI), FALSE);
- BBPkeepref(resI->batCacheid);
+ BBPkeepref(bidi = resI->batCacheid);
+ resI = NULL;
/* Manually compute values for the X-dimension, since we know that its
* range is [0:1:wid] and each of its value must be repeated 'len'
* times with 1 #repeats */
errbuf = ARRAYseries(&bidx, 0, 1, wid, len, 1);
if (errbuf != MAL_SUCCEED) {
- BBPdecref(resI->batCacheid, 1); /* undo the
BBPkeepref(resI->batCacheid) above */
+ BBPdecref(bidi, 1); /* undo the BBPkeepref(resI->batCacheid)
above */
return createException(MAL, "geotiff.loadimage", "Failed to
create the X-dimension of %s", *fname);
}
/* Manually compute values for the Y-dimension, since we know that its
@@ -243,25 +243,30 @@ GTIFFloadGreyscaleImage(bat *x, bat *y,
* with 'wid' #repeats */
errbuf = ARRAYseries(&bidy, 0, 1, len, 1, wid);
if (errbuf != MAL_SUCCEED) {
- BBPdecref(resI->batCacheid, 1); /* undo the
BBPkeepref(resI->batCacheid) above */
- BBPdecref(resX->batCacheid, 1); /* undo the
BBPkeepref(resX->batCacheid) by ARRAYseries_*() */
+ BBPdecref(bidi, 1); /* undo the BBPkeepref(resI->batCacheid)
above */
+ BBPdecref(bidy, 1); /* undo the BBPkeepref(resX->batCacheid) by
ARRAYseries_*() */
return createException(MAL, "geotiff.loadimage", "Failed to
create the y-dimension of %s", *fname);
}
resX = BATdescriptor(bidx); /* these should not fail... */
resY = BATdescriptor(bidy);
if (BATcount(resX) != pixels || BATcount(resY) != pixels) {
- BBPdecref(resX->batCacheid, 1);
- BBPdecref(resY->batCacheid, 1);
- BBPdecref(resI->batCacheid, 1);
- BBPunfix(resX->batCacheid);
- BBPunfix(resY->batCacheid);
- return createException(MAL, "geotiff.loadimage", "X or Y
dimension has invalid number of pixels. Got " BUNFMT "," BUNFMT " (!= " BUNFMT
")", BATcount(resX), BATcount(resY), pixels);
+ BUN cntX = BATcount(resX), cntY = BATcount(resY);
+ BBPunfix(bidx); /* undo physical incref done by
BATdescriptor(bidx) */
+ BBPunfix(bidi); /* undo physical incref done by
BATdescriptor(bidy) */
+ resX = resY = NULL;
+ BBPdecref(bidx, 1); /* undo the BBPkeepref(resX->batCacheid) by
ARRAYseries_*() */
+ BBPdecref(bidy, 1); /* undo the BBPkeepref(resY->batCacheid) by
ARRAYseries_*() */
+ BBPdecref(bidi, 1); /* undo the BBPkeepref(resI->batCacheid)
above */
+ return createException(MAL, "geotiff.loadimage", "X or Y
dimension has invalid number of pixels. Got " BUNFMT "," BUNFMT " (!= " BUNFMT
")", cntX, cntY, pixels);
}
+ BBPunfix(resX->batCacheid); /* undo physical incref done by
BATdescriptor(bidx) */
+ BBPunfix(resY->batCacheid); /* undo physical incref done by
BATdescriptor(bidy) */
+ resX = resY = NULL;
- *x = resX->batCacheid;
- *y = resY->batCacheid;
- *intensity = resI->batCacheid;
+ *x = bidx;
+ *y = bidy;
+ *intensity = bidi;
return MAL_SUCCEED;
}
@@ -282,6 +287,7 @@ GTIFFimportImage(Client cntxt, MalBlkPtr
char aname[20], buf[BUFSIZ], *s = buf;
bte stat = 0;
bat x, y, intensity;
+ BAT *bx, *by, *bi;
msg = getSQLContext(cntxt, mb, &m, NULL);
if (msg)
@@ -370,17 +376,29 @@ GTIFFimportImage(Client cntxt, MalBlkPtr
col = mvc_bind_column(m, img, "x");
if (col == NULL)
return createException(MAL, "geotiff.import", "Could not find
\"%s\".\"x\"\n", aname);
- store_funcs.append_col(m->session->tr, col, BATdescriptor(x), TYPE_bat);
+ bx = BATdescriptor(x);
+ store_funcs.append_col(m->session->tr, col, bx, TYPE_bat);
+ BBPunfix(x); /* release physical reference inherited from
BATdescriptor()*/
+ bx = NULL;
+ BBPdecref(x, 1); /* release logical reference inherited from
GTIFFloadGreyscaleImage() */
/* the 'y' dimension */
col = mvc_bind_column(m, img, "y");
if (col == NULL)
return createException(MAL, "geotiff.import", "Could not find
\"%s\".\"y\"\n", aname);
- store_funcs.append_col(m->session->tr, col, BATdescriptor(y), TYPE_bat);
+ by = BATdescriptor(y);
+ store_funcs.append_col(m->session->tr, col, by, TYPE_bat);
+ BBPunfix(y); /* release physical reference inherited from
BATdescriptor() */
+ by = NULL;
+ BBPdecref(y, 1); /* release logical reference inherited from
GTIFFloadGreyscaleImage() */
/* the 'intensity' column */
col = mvc_bind_column(m, img, "intensity");
if (col == NULL)
return createException(MAL, "geotiff.import", "Could not find
\"%s\".\"intensity\"\n", aname);
- store_funcs.append_col(m->session->tr, col, BATdescriptor(intensity),
TYPE_bat);
+ bi = BATdescriptor(intensity);
+ store_funcs.append_col(m->session->tr, col, bi, TYPE_bat);
+ BBPunfix(intensity); /* release physical reference inherited from
BATdescriptor() */
+ bi = NULL;
+ BBPdecref(intensity, 1); /* release logical reference inherited from
GTIFFloadGreyscaleImage() */
/* update the GeoTIFF catalog to set status to 1 (loaded) */
stat = 1;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list