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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list