Changeset: ce317a8b57b2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ce317a8b57b2
Modified Files:
        gdk/gdk_posix.c
        gdk/gdk_storage.c
Branch: default
Log Message:

Use truncate/ftruncate to extend a file.  On Windows, use _chsize_s.


diffs (87 lines):

diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c
--- a/gdk/gdk_posix.c
+++ b/gdk/gdk_posix.c
@@ -519,7 +519,6 @@ MT_mremap(const char *path, int mode, vo
                                        /* size not too big yet or
                                         * anonymous, try to make new
                                         * anonymous mmap and copy
-
                                         * data over */
                                        p = mmap(NULL, *new_size, prot, flags,
                                                 fd, 0);
@@ -544,9 +543,7 @@ MT_mremap(const char *path, int mode, vo
                                                return NULL;
                                        if (write(fd, old_address,
                                                  old_size) < 0 ||
-                                           lseek(fd, *new_size - 1,
-                                                 SEEK_SET) < 0 ||
-                                           write(fd, "\0", 1) < 0) {
+                                           ftruncate(fd, *new_size) < 0) {
                                                close(fd);
                                                return NULL;
                                        }
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -242,11 +242,8 @@ GDKextendf(int fd, off_t size)
                return -1;
        }
        /* if necessary, extend the underlying file */
-       if (stb.st_size < size &&
-           (lseek(fd, size - 1, SEEK_SET) < 0 ||
-            write(fd, "\0", 1) < 0)) {
-               return -1;
-       }
+       if (stb.st_size < size)
+               return ftruncate(fd, size);
        return 0;
 }
 #endif
@@ -254,34 +251,26 @@ GDKextendf(int fd, off_t size)
 int
 GDKextend(const char *fn, size_t size)
 {
-       FILE *fp;
        int t0 = 0;
 
        IODEBUG t0 = GDKms();
-       if ((fp = fopen(fn, "rb+")) == NULL)
+#ifdef WIN32
+       {
+               int fd, rt;
+
+               if ((fd = open(fn, O_RDWR)) < 0)
+                       return -1;
+               rt = _chsize_s(fd, (__int64) size);
+               close(fd);
+               if (rt != 0)
+                       return -1;
+       }
+#else
+       if (truncate(fn, (off_t) size) < 0)
                return -1;
-#if defined(_WIN64)
-       if (_fseeki64(fp, (ssize_t) size - 1, SEEK_SET) < 0)
-               goto bailout;
-#elif defined(HAVE_FSEEKO)
-       if (fseeko(fp, (off_t) size - 1, SEEK_SET) < 0)
-               goto bailout;
-#else
-       if (fseek(fp, size - 1, SEEK_SET) < 0)
-               goto bailout;
 #endif
-       if (fputc('\n', fp) < 0)
-               goto bailout;
-       if (fflush(fp) < 0)
-               goto bailout;
-       if (fclose(fp) < 0)
-               return -1;
        IODEBUG fprintf(stderr, "#GDKextend %s " SZFMT " %dms\n", fn, size, 
GDKms() - t0);
        return 0;
-  bailout:
-       fclose(fp);
-       IODEBUG fprintf(stderr, "#GDKextend %s failed " SZFMT " %dms\n", fn, 
size, GDKms() - t0);
-       return -1;
 }
 
 /*
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to