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

Reply via email to