Changeset: f197af35b40a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f197af35b40a Modified Files: gdk/gdk_rtree.c gdk/gdk_rtree.h Branch: geo-update-dev Log Message:
persistRtree added, using the rtree lib write function. RTree is stored in file, but not loaded. diffs (112 lines): diff --git a/gdk/gdk_rtree.c b/gdk/gdk_rtree.c --- a/gdk/gdk_rtree.c +++ b/gdk/gdk_rtree.c @@ -6,24 +6,60 @@ //TODO The check for hasrtree should look into the parent BAT, not just compare the BAT->rtree to NULL // Persist rtree to disk if the conditions are right -/*static void +static void persistRtree (BAT *b) -{*/ +{ /* Conditions to persist the RTree: * - BAT has to be persistent * - No deleted rows (when does batInserted update?) * - The heap is not dirty -> no new values * - DB Farm is persistent i.e. not in memory */ -/* if ((BBP_status(b->batCacheid) & BBPEXISTING) + if ((BBP_status(b->batCacheid) & BBPEXISTING) && b->batInserted == b->batCount && !b->theap->dirty && !GDKinmemory(b->theap->farmid)) { + //TODO Necessary? BBPfix(b->batCacheid); - //char name[MT_NAME_LEN]; - //snprintf(name, sizeof(name), "rtreesync%d", b->batCacheid); + rtree_t *rtree = b->T.rtree; + + if (rtree) { + const char *filename = "rtree"; + const char *ext = "new"; + int farmid = b->theap->farmid; + + int fd = GDKfdlocate(farmid, filename, "w", ext); + FILE *file_write = fdopen(fd,"w"); + + if (file_write != NULL) { + int err; + if ((err = rtree_bsrt_write(rtree,file_write)) != 0) { + GDKerror("%s", rtree_strerror(err)); + fclose(file_write); + BBPunfix(b->batCacheid); + return; + } + + + if (!(GDKdebug & NOSYNCMASK)) { + #if defined(NATIVE_WIN32) + _commit(fd); + #elif defined(HAVE_FDATASYNC) + fdatasync(fd); + #elif defined(HAVE_FSYNC) + fsync(fd); + #endif + } + fclose(file_write); + } + else { + GDKerror("%s",strerror(errno)); + close(fd); + } + } + BBPunfix(b->batCacheid); } -}*/ +} bool RTREEexists(BAT *b) @@ -71,7 +107,7 @@ RTREEcreate (BAT *b) { GDKerror("rtree_new failed\n"); return GDK_FAIL; } - //TODO persist rtree + persistRtree(pb); MT_lock_unset(&pb->batIdxLock); } return GDK_SUCCEED; @@ -106,7 +142,6 @@ RTREEaddmbr (BAT *b, mbr_t *inMBR, BUN i return GDK_SUCCEED; } -//TODO Make this multi-thread safe? -> Only allow one thread to do rtree_new and persist the BAT, but multiple threads can add new rects to the tree //MBR bat gdk_return BATrtree(BAT *wkb, BAT *mbr) @@ -158,7 +193,7 @@ BATrtree(BAT *wkb, BAT *mbr) } bat_iterator_end(&bi); pb->T.rtree = rtree; - //TODO persist rtree + persistRtree(pb); MT_lock_unset(&pb->batIdxLock); } //TODO Check if the rtree is complete in case of already existing rtree (not NULL) diff --git a/gdk/gdk_rtree.h b/gdk/gdk_rtree.h --- a/gdk/gdk_rtree.h +++ b/gdk/gdk_rtree.h @@ -13,8 +13,10 @@ typedef struct mbr_t { //TODO REMOVE gdk_export bool RTREEexists(BAT *b); -gdk_export gdk_return RTREEcreate (BAT *b); -gdk_export gdk_return RTREEaddmbr (BAT *pb, mbr_t *inMBR, BUN i); gdk_export gdk_return BATrtree(BAT *wkb, BAT* mbr); gdk_export void RTREEdestroy(BAT *b); gdk_export BUN* RTREEsearch(BAT *b, mbr_t *inMBR, int result_limit); + +//TODO Necessary? +gdk_export gdk_return RTREEcreate (BAT *b); +gdk_export gdk_return RTREEaddmbr (BAT *pb, mbr_t *inMBR, BUN i); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org