23#include "mdb_thread.h"
31# define sleep(sec) Sleep(sec * 1000)
40# error "SDDS_VERSION does not match the version number of this file"
45static MDB_THREAD_LOCK defaultIOBufferSizeLock = MDB_THREAD_LOCK_INITIALIZER;
46static int32_t defaultIOBufferSize = SDDS_FILEBUFFER_SIZE;
48static int32_t SDDS_GetLockedDefaultIOBufferSize(
void) {
50 mdb_thread_lock(&defaultIOBufferSizeLock);
51 size = defaultIOBufferSize;
52 mdb_thread_unlock(&defaultIOBufferSizeLock);
85 return SDDS_GetLockedDefaultIOBufferSize();
88 mdb_thread_lock(&defaultIOBufferSizeLock);
89 previous = defaultIOBufferSize;
90 defaultIOBufferSize = newValue;
91 mdb_thread_unlock(&defaultIOBufferSizeLock);
115 int float80tofloat64 = 0;
117 if (getenv(
"SDDS_LONGDOUBLE_64BITS") == NULL) {
119 float80tofloat64 = 1;
122 if (!fBuffer->bufferSize) {
125 return !fseek(fp, (
long)targetSize, SEEK_CUR);
127 if (float80tofloat64) {
131 while (shift < targetSize) {
132 if (fread(&x, (
size_t)1, 16, fp) != 16)
135 memcpy((
char *)target + shift, &d, 8);
140 return fread(target, (
size_t)1, (
size_t)targetSize, fp) == targetSize;
144 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
147 if (float80tofloat64) {
151 while (shift < targetSize) {
152 memcpy(x, (
char *)fBuffer->data + shift, 16);
154 memcpy((
char *)target + shift, &d, 8);
158 memcpy((
char *)target, (
char *)fBuffer->data, targetSize);
161 fBuffer->data += targetSize;
165 int64_t bytesNeeded, offset;
166 fBuffer->bytesLeft += targetSize;
169 if ((offset = fBuffer->bytesLeft)) {
172 if (float80tofloat64) {
176 while (shift < offset) {
177 memcpy(x, (
char *)fBuffer->data + shift, 16);
179 memcpy((
char *)target + shift, &d, 8);
183 memcpy((
char *)target, (
char *)fBuffer->data, offset);
186 bytesNeeded = targetSize - offset;
187 fBuffer->bytesLeft = 0;
189 bytesNeeded = targetSize;
191 fBuffer->data = fBuffer->buffer;
193 if (fBuffer->bufferSize < bytesNeeded) {
196 return !fseek(fp, (
long)bytesNeeded, SEEK_CUR);
198 if (float80tofloat64) {
202 while (shift < bytesNeeded) {
203 if (fread(&x, (
size_t)1, 16, fp) != 16)
206 memcpy((
char *)target + offset + shift, &d, 8);
211 return fread((
char *)target + offset, (
size_t)1, (
size_t)bytesNeeded, fp) == bytesNeeded;
217 if ((fBuffer->bytesLeft = fread(fBuffer->data, (
size_t)1, (
size_t)fBuffer->bufferSize, fp)) < bytesNeeded)
220 if (float80tofloat64) {
224 while (shift < bytesNeeded) {
225 memcpy(x, (
char *)fBuffer->data + shift, 16);
227 memcpy((
char *)target + offset + shift, &d, 8);
231 memcpy((
char *)target + offset, (
char *)fBuffer->data, bytesNeeded);
234 fBuffer->data += bytesNeeded;
235 fBuffer->bytesLeft -= bytesNeeded;
262 int float80tofloat64 = 0;
263 if (!fBuffer->bufferSize) {
264 SDDS_SetError(
"You must presently have a nonzero file buffer to use LZMA (reading/writing .lzma or .xz files)");
268 if (getenv(
"SDDS_LONGDOUBLE_64BITS") == NULL) {
270 float80tofloat64 = 1;
273 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
275 if (float80tofloat64) {
279 while (shift < targetSize) {
280 memcpy(x, (
char *)fBuffer->data + shift, 16);
282 memcpy((
char *)target + shift, &d, 8);
286 memcpy((
char *)target, (
char *)fBuffer->data, targetSize);
289 fBuffer->data += targetSize;
292 int64_t bytesNeeded, offset;
293 fBuffer->bytesLeft += targetSize;
294 if ((offset = fBuffer->bytesLeft)) {
296 if (float80tofloat64) {
300 while (shift < offset) {
301 memcpy(x, (
char *)fBuffer->data + shift, 16);
303 memcpy((
char *)target + shift, &d, 8);
307 memcpy((
char *)target, (
char *)fBuffer->data, offset);
310 bytesNeeded = targetSize - offset;
311 fBuffer->bytesLeft = 0;
313 bytesNeeded = targetSize;
315 fBuffer->data = fBuffer->buffer;
317 if (fBuffer->bufferSize < bytesNeeded) {
320 return !lzma_seek(lzmafp, (
long)bytesNeeded, SEEK_CUR);
322 if (float80tofloat64) {
326 while (shift < bytesNeeded) {
327 if (lzma_read(lzmafp, &x, 16) != 16)
330 memcpy((
char *)target + offset + shift, &d, 8);
335 return lzma_read(lzmafp, (
char *)target + offset, (
size_t)bytesNeeded) == bytesNeeded;
340 if ((fBuffer->bytesLeft = lzma_read(lzmafp, fBuffer->data, (
size_t)fBuffer->bufferSize)) < bytesNeeded)
343 if (float80tofloat64) {
347 while (shift < bytesNeeded) {
348 memcpy(x, (
char *)fBuffer->data + shift, 16);
350 memcpy((
char *)target + offset + shift, &d, 8);
354 memcpy((
char *)target + offset, (
char *)fBuffer->data, bytesNeeded);
357 fBuffer->data += bytesNeeded;
358 fBuffer->bytesLeft -= bytesNeeded;
385int32_t SDDS_GZipBufferedRead(
void *target, int64_t targetSize, gzFile gzfp,
SDDS_FILEBUFFER *fBuffer, int32_t type, int32_t byteOrder) {
386 int float80tofloat64 = 0;
387 if (!fBuffer->bufferSize) {
388 SDDS_SetError(
"You must presently have a nonzero file buffer to use zLib (reading/writing .gz files)");
392 if (getenv(
"SDDS_LONGDOUBLE_64BITS") == NULL) {
394 float80tofloat64 = 1;
397 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
399 if (float80tofloat64) {
403 while (shift < targetSize) {
404 memcpy(x, (
char *)fBuffer->data + shift, 16);
406 memcpy((
char *)target + shift, &d, 8);
410 memcpy((
char *)target, (
char *)fBuffer->data, targetSize);
413 fBuffer->data += targetSize;
416 int64_t bytesNeeded, offset;
417 fBuffer->bytesLeft += targetSize;
418 if ((offset = fBuffer->bytesLeft)) {
420 if (float80tofloat64) {
424 while (shift < offset) {
425 memcpy(x, (
char *)fBuffer->data + shift, 16);
427 memcpy((
char *)target + shift, &d, 8);
431 memcpy((
char *)target, (
char *)fBuffer->data, offset);
434 bytesNeeded = targetSize - offset;
435 fBuffer->bytesLeft = 0;
437 bytesNeeded = targetSize;
439 fBuffer->data = fBuffer->buffer;
441 if (fBuffer->bufferSize < bytesNeeded) {
444 return !gzseek(gzfp, bytesNeeded, SEEK_CUR);
446 if (float80tofloat64) {
450 while (shift < bytesNeeded) {
451 if (gzread(gzfp, &x, 16) != 16)
454 memcpy((
char *)target + offset + shift, &d, 8);
459 return gzread(gzfp, (
char *)target + offset, bytesNeeded) == bytesNeeded;
464 if ((fBuffer->bytesLeft = gzread(gzfp, fBuffer->data, fBuffer->bufferSize)) < bytesNeeded)
467 if (float80tofloat64) {
471 while (shift < bytesNeeded) {
472 memcpy(x, (
char *)fBuffer->data + shift, 16);
474 memcpy((
char *)target + offset + shift, &d, 8);
478 memcpy((
char *)target + offset, (
char *)fBuffer->data, bytesNeeded);
481 fBuffer->data += bytesNeeded;
482 fBuffer->bytesLeft -= bytesNeeded;
503 if (!fBuffer->bufferSize) {
504 return fwrite(target, (
size_t)1, (
size_t)targetSize, fp) == targetSize;
506 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
507 memcpy((
char *)fBuffer->data, (
char *)target, targetSize);
508 fBuffer->data += targetSize;
510 fprintf(stderr,
"SDDS_BufferedWrite of %" PRId64
" bytes done in-memory, %" PRId64
" bytes left\n", targetSize, fBuffer->bytesLeft);
519 lastLeft = (fBuffer->bytesLeft += targetSize);
521 memcpy((
char *)fBuffer->data, (
char *)target, (
size_t)fBuffer->bytesLeft);
522 if (fwrite(fBuffer->buffer, (
size_t)1, (
size_t)fBuffer->bufferSize, fp) != fBuffer->bufferSize)
533 fBuffer->data = fBuffer->buffer;
534 if ((targetSize -= lastLeft) > (fBuffer->bytesLeft = fBuffer->bufferSize)) {
535 return fwrite((
char *)target + lastLeft, (
size_t)1, (
size_t)targetSize, fp) == targetSize;
540 memcpy((
char *)fBuffer->data, (
char *)target + lastLeft, targetSize);
541 fBuffer->data += targetSize;
542 fBuffer->bytesLeft -= targetSize;
569 if (!fBuffer->bufferSize) {
570 SDDS_SetError(
"You must presently have a nonzero file buffer to use lzma (reading/writing .xz files)");
573 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
574 memcpy((
char *)fBuffer->data, (
char *)target, targetSize);
575 fBuffer->data += targetSize;
579 lastLeft = (fBuffer->bytesLeft += targetSize);
580 memcpy((
char *)fBuffer->data, (
char *)target, (
size_t)fBuffer->bytesLeft);
581 if (lzma_write(lzmafp, fBuffer->buffer, (
size_t)fBuffer->bufferSize) != fBuffer->bufferSize)
583 fBuffer->bytesLeft = fBuffer->bufferSize;
584 fBuffer->data = fBuffer->buffer;
611int32_t SDDS_GZipBufferedWrite(
void *target, int64_t targetSize, gzFile gzfp,
SDDS_FILEBUFFER *fBuffer) {
612 if (!fBuffer->bufferSize) {
613 SDDS_SetError(
"You must presently have a nonzero file buffer to use zLib (reading/writing .gz files}");
616 if ((fBuffer->bytesLeft -= targetSize) >= 0) {
617 memcpy((
char *)fBuffer->data, (
char *)target, targetSize);
618 fBuffer->data += targetSize;
622 lastLeft = (fBuffer->bytesLeft + targetSize);
623 memcpy((
char *)fBuffer->data, (
char *)target, lastLeft);
624 if (gzwrite(gzfp, fBuffer->buffer, fBuffer->bufferSize) != fBuffer->bufferSize)
627 fBuffer->bytesLeft = fBuffer->bufferSize;
628 fBuffer->data = fBuffer->buffer;
629 return SDDS_GZipBufferedWrite((
char *)target + lastLeft, targetSize - lastLeft, gzfp, fBuffer);
653 SDDS_SetError(
"Unable to flush buffer: file pointer is NULL. (SDDS_FlushBuffer)");
657 SDDS_SetError(
"Unable to flush buffer: buffer pointer is NULL. (SDDS_FlushBuffer)");
660 if (!fBuffer->bufferSize) {
668 if ((writeBytes = fBuffer->bufferSize - fBuffer->bytesLeft)) {
669 if (writeBytes < 0) {
670 SDDS_SetError(
"Unable to flush buffer: negative byte count (SDDS_FlushBuffer).");
674 fprintf(stderr,
"Writing %" PRId64
" bytes to disk\n", writeBytes);
676 if (fwrite(fBuffer->buffer, 1, writeBytes, fp) != writeBytes) {
677 SDDS_SetError(
"Unable to flush buffer: write operation failed (SDDS_FlushBuffer).");
680 fBuffer->bytesLeft = fBuffer->bufferSize;
681 fBuffer->data = fBuffer->buffer;
707 if ((writeBytes = fBuffer->bufferSize - fBuffer->bytesLeft)) {
708 if (lzma_write(lzmafp, fBuffer->buffer, writeBytes) != writeBytes)
710 fBuffer->bytesLeft = fBuffer->bufferSize;
711 fBuffer->data = fBuffer->buffer;
733 if ((writeBytes = fBuffer->bufferSize - fBuffer->bytesLeft)) {
734 if (gzwrite(gzfp, fBuffer->buffer, writeBytes) != writeBytes)
736 fBuffer->bytesLeft = fBuffer->bufferSize;
737 fBuffer->data = fBuffer->buffer;
773 int64_t i, rows, fixed_rows;
774 int32_t min32 = INT32_MIN, rows32;
777 char *outputEndianess = NULL;
779 if ((outputEndianess = getenv(
"SDDS_OUTPUT_ENDIANESS"))) {
788 if (SDDS_dataset->layout.gzipFile) {
789 if (!(gzfp = SDDS_dataset->layout.gzfp)) {
790 SDDS_SetError(
"Unable to write page--file pointer is NULL (SDDS_WriteBinaryPage)");
793 fBuffer = &SDDS_dataset->fBuffer;
795 if (!fBuffer->buffer) {
796 int32_t bufferSize = SDDS_GetLockedDefaultIOBufferSize();
797 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (bufferSize + 1)))) {
798 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_WriteBinaryPage)");
801 fBuffer->bufferSize = bufferSize;
802 fBuffer->bytesLeft = bufferSize;
806 SDDS_dataset->rowcount_offset = gztell(gzfp);
807 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
808 fixed_rows = ((rows / SDDS_dataset->layout.data_mode.fixed_row_increment) + 2) * SDDS_dataset->layout.data_mode.fixed_row_increment;
809 if (fixed_rows > INT32_MAX) {
810 if (!SDDS_GZipBufferedWrite(&min32,
sizeof(min32), gzfp, fBuffer)) {
811 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
814 if (!SDDS_GZipBufferedWrite(&fixed_rows,
sizeof(fixed_rows), gzfp, fBuffer)) {
815 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
819 rows32 = (int32_t)fixed_rows;
820 if (!SDDS_GZipBufferedWrite(&rows32,
sizeof(rows32), gzfp, fBuffer)) {
821 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
826 if (rows > INT32_MAX) {
827 if (!SDDS_GZipBufferedWrite(&min32,
sizeof(min32), gzfp, fBuffer)) {
828 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
831 if (!SDDS_GZipBufferedWrite(&rows,
sizeof(rows), gzfp, fBuffer)) {
832 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
836 rows32 = (int32_t)rows;
837 if (!SDDS_GZipBufferedWrite(&rows32,
sizeof(rows32), gzfp, fBuffer)) {
838 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
844 SDDS_SetError(
"Unable to write page--parameter writing problem (SDDS_WriteBinaryPage)");
848 SDDS_SetError(
"Unable to write page--array writing problem (SDDS_WriteBinaryPage)");
851 if (SDDS_dataset->layout.n_columns) {
852 if (SDDS_dataset->layout.data_mode.column_major) {
854 SDDS_SetError(
"Unable to write page--column writing problem (SDDS_WriteBinaryPage)");
858 for (i = 0; i < SDDS_dataset->n_rows; i++) {
860 SDDS_SetError(
"Unable to write page--row writing problem (SDDS_WriteBinaryPage)");
866 if (!SDDS_GZipFlushBuffer(gzfp, fBuffer)) {
867 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_WriteBinaryPage)");
870 SDDS_dataset->last_row_written = SDDS_dataset->n_rows - 1;
871 SDDS_dataset->n_rows_written = rows;
872 SDDS_dataset->writing_page = 1;
875 if (SDDS_dataset->layout.lzmaFile) {
876 if (!(lzmafp = SDDS_dataset->layout.lzmafp)) {
877 SDDS_SetError(
"Unable to write page--file pointer is NULL (SDDS_WriteBinaryPage)");
880 fBuffer = &SDDS_dataset->fBuffer;
882 if (!fBuffer->buffer) {
883 int32_t bufferSize = SDDS_GetLockedDefaultIOBufferSize();
884 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (bufferSize + 1)))) {
885 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_WriteBinaryPage)");
888 fBuffer->bufferSize = bufferSize;
889 fBuffer->bytesLeft = bufferSize;
892 SDDS_dataset->rowcount_offset = lzma_tell(lzmafp);
893 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
894 fixed_rows = ((rows / SDDS_dataset->layout.data_mode.fixed_row_increment) + 2) * SDDS_dataset->layout.data_mode.fixed_row_increment;
895 if (fixed_rows > INT32_MAX) {
897 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
901 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
905 rows32 = (int32_t)fixed_rows;
907 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
912 if (rows > INT32_MAX) {
914 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
918 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
922 rows32 = (int32_t)rows;
924 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
930 SDDS_SetError(
"Unable to write page--parameter writing problem (SDDS_WriteBinaryPage)");
934 SDDS_SetError(
"Unable to write page--array writing problem (SDDS_WriteBinaryPage)");
937 if (SDDS_dataset->layout.n_columns) {
938 if (SDDS_dataset->layout.data_mode.column_major) {
940 SDDS_SetError(
"Unable to write page--column writing problem (SDDS_WriteBinaryPage)");
944 for (i = 0; i < SDDS_dataset->n_rows; i++) {
946 SDDS_SetError(
"Unable to write page--row writing problem (SDDS_WriteBinaryPage)");
953 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_WriteBinaryPage)");
956 SDDS_dataset->last_row_written = SDDS_dataset->n_rows - 1;
957 SDDS_dataset->n_rows_written = rows;
958 SDDS_dataset->writing_page = 1;
960 if (!(fp = SDDS_dataset->layout.fp)) {
961 SDDS_SetError(
"Unable to write page--file pointer is NULL (SDDS_WriteBinaryPage)");
964 fBuffer = &SDDS_dataset->fBuffer;
966 if (!fBuffer->buffer) {
967 int32_t bufferSize = SDDS_GetLockedDefaultIOBufferSize();
968 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (bufferSize + 1)))) {
969 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_WriteBinaryPage)");
972 fBuffer->bufferSize = bufferSize;
973 fBuffer->bytesLeft = bufferSize;
980 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_WriteBinaryPage)");
986 SDDS_dataset->rowcount_offset = ftell(fp);
987 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
988 fixed_rows = ((rows / SDDS_dataset->layout.data_mode.fixed_row_increment) + 2) * SDDS_dataset->layout.data_mode.fixed_row_increment;
990 fprintf(stderr,
"setting %" PRId64
" fixed rows\n", fixed_rows);
992 if (fixed_rows > INT32_MAX) {
994 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
998 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
1002 rows32 = (int32_t)fixed_rows;
1004 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
1010 fprintf(stderr,
"setting %" PRId64
" rows\n", rows);
1012 if (rows > INT32_MAX) {
1014 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
1018 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
1022 rows32 = (int32_t)rows;
1024 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteBinaryPage)");
1032 SDDS_SetError(
"Unable to write page--parameter writing problem (SDDS_WriteBinaryPage)");
1036 SDDS_SetError(
"Unable to write page--array writing problem (SDDS_WriteBinaryPage)");
1039 if (SDDS_dataset->layout.n_columns) {
1040 if (SDDS_dataset->layout.data_mode.column_major) {
1042 SDDS_SetError(
"Unable to write page--column writing problem (SDDS_WriteBinaryPage)");
1046 for (i = 0; i < SDDS_dataset->n_rows; i++) {
1048 SDDS_SetError(
"Unable to write page--row writing problem (SDDS_WriteBinaryPage)");
1056 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_WriteBinaryPage)");
1059 SDDS_dataset->last_row_written = SDDS_dataset->n_rows - 1;
1060 SDDS_dataset->n_rows_written = rows;
1061 SDDS_dataset->writing_page = 1;
1100 int64_t i, rows, offset, code, fixed_rows;
1101 int32_t min32 = INT32_MIN, rows32;
1103 char *outputEndianess = NULL;
1105 if ((outputEndianess = getenv(
"SDDS_OUTPUT_ENDIANESS"))) {
1111 fprintf(stderr,
"%" PRId64
" virtual rows present, first=%" PRId64
"\n",
SDDS_CountRowsOfInterest(SDDS_dataset), SDDS_dataset->first_row_in_mem);
1116 if (SDDS_dataset->layout.gzipFile) {
1117 SDDS_SetError(
"Unable to perform page updates on a gzip file (SDDS_UpdateBinaryPage)");
1121 if (SDDS_dataset->layout.lzmaFile) {
1122 SDDS_SetError(
"Unable to perform page updates on an .lzma or .xz file (SDDS_UpdateBinaryPage)");
1125 if (SDDS_dataset->layout.data_mode.column_major) {
1126 SDDS_SetError(
"Unable to perform page updates on column major order file. (SDDS_UpdateBinaryPage)");
1129 if (!SDDS_dataset->writing_page) {
1131 fprintf(stderr,
"Page not being written---calling SDDS_UpdateBinaryPage\n");
1135 if (mode & FLUSH_TABLE) {
1138 SDDS_dataset->last_row_written = -1;
1139 SDDS_dataset->n_rows = 0;
1144 if (!(fp = SDDS_dataset->layout.fp)) {
1145 SDDS_SetError(
"Unable to update page--file pointer is NULL (SDDS_UpdateBinaryPage)");
1148 fBuffer = &SDDS_dataset->fBuffer;
1150 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_UpdateBinaryPage)");
1157 fprintf(stderr,
"%" PRId64
" rows stored in table, %" PRId64
" already written\n", rows, SDDS_dataset->n_rows_written);
1159 if (rows == SDDS_dataset->n_rows_written)
1161 if (rows < SDDS_dataset->n_rows_written) {
1162 SDDS_SetError(
"Unable to update page--new number of rows less than previous number (SDDS_UpdateBinaryPage)");
1165 if ((!SDDS_dataset->layout.data_mode.fixed_row_count) || (((rows + rows - SDDS_dataset->n_rows_written) / SDDS_dataset->layout.data_mode.fixed_row_increment) != (rows / SDDS_dataset->layout.data_mode.fixed_row_increment))) {
1166 if (
SDDS_fseek(fp, SDDS_dataset->rowcount_offset, 0) == -1) {
1167 SDDS_SetError(
"Unable to update page--failure doing fseek (SDDS_UpdateBinaryPage)");
1170 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
1171 if ((rows - SDDS_dataset->n_rows_written) + 1 > SDDS_dataset->layout.data_mode.fixed_row_increment) {
1172 SDDS_dataset->layout.data_mode.fixed_row_increment = (rows - SDDS_dataset->n_rows_written) + 1;
1174 fixed_rows = ((rows / SDDS_dataset->layout.data_mode.fixed_row_increment) + 2) * SDDS_dataset->layout.data_mode.fixed_row_increment;
1176 fprintf(stderr,
"Setting %" PRId64
" fixed rows\n", fixed_rows);
1178 if ((fixed_rows > INT32_MAX) && (SDDS_dataset->n_rows_written <= INT32_MAX)) {
1179 SDDS_SetError(
"Unable to update page--crossed the INT32_MAX row boundary (SDDS_UpdateBinaryPage)");
1182 if (fixed_rows > INT32_MAX) {
1183 if (fwrite(&min32,
sizeof(min32), 1, fp) != 1) {
1184 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateBinaryPage)");
1187 if (fwrite(&fixed_rows,
sizeof(fixed_rows), 1, fp) != 1) {
1188 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateBinaryPage)");
1192 rows32 = (int32_t)fixed_rows;
1193 if (fwrite(&rows32,
sizeof(rows32), 1, fp) != 1) {
1194 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateBinaryPage)");
1200 fprintf(stderr,
"Setting %" PRId64
" rows\n", rows);
1202 if ((rows > INT32_MAX) && (SDDS_dataset->n_rows_written <= INT32_MAX)) {
1203 SDDS_SetError(
"Unable to update page--crossed the INT32_MAX row boundary (SDDS_UpdateBinaryPage)");
1206 if (rows > INT32_MAX) {
1207 if (fwrite(&min32,
sizeof(min32), 1, fp) != 1) {
1208 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateBinaryPage)");
1211 if (fwrite(&rows,
sizeof(rows), 1, fp) != 1) {
1212 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateBinaryPage)");
1216 rows32 = (int32_t)rows;
1217 if (fwrite(&rows32,
sizeof(rows32), 1, fp) != 1) {
1218 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateBinaryPage)");
1224 SDDS_SetError(
"Unable to update page--failure doing fseek to end of page (SDDS_UpdateBinaryPage)");
1228 for (i = SDDS_dataset->last_row_written + 1; i < SDDS_dataset->n_rows; i++)
1230 SDDS_SetError(
"Unable to update page--failure writing row (SDDS_UpdateBinaryPage)");
1234 fprintf(stderr,
"Flushing buffer\n");
1237 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_UpdateBinaryPage)");
1240 SDDS_dataset->last_row_written = SDDS_dataset->n_rows - 1;
1241 SDDS_dataset->n_rows_written = rows;
1242 if (mode & FLUSH_TABLE) {
1244 SDDS_dataset->first_row_in_mem = rows;
1245 SDDS_dataset->last_row_written = -1;
1246 SDDS_dataset->n_rows = 0;
1251#define FSEEK_TRIES 10
1282 struct timespec rqtp;
1286 for (
try = 0;
try < FSEEK_TRIES;
try++) {
1287 if (fseek(fp, offset, dir) == -1) {
1289 nanosleep(&rqtp, NULL);
1298 if (
try == FSEEK_TRIES) {
1299 fputs(
"warning: fseek problems--unable to recover\n", stderr);
1302 fputs(
"warning: fseek problems--recovered\n", stderr);
1336 struct timespec rqtp;
1340 for (
try = 0;
try < FSEEK_TRIES;
try++) {
1341 if (lzma_seek(lzmafp, offset, dir) == -1) {
1343 nanosleep(&rqtp, NULL);
1352 if (
try == FSEEK_TRIES) {
1353 fputs(
"warning: lzma_seek problems--unable to recover\n", stderr);
1356 fputs(
"warning: lzma_seek problems--recovered\n", stderr);
1388int32_t SDDS_gzseek(gzFile gzfp, int64_t offset, int32_t dir) {
1390# if defined(vxWorks)
1391 struct timespec rqtp;
1395 for (
try = 0;
try < FSEEK_TRIES;
try++) {
1396 if (gzseek(gzfp, offset, dir) == -1) {
1397# if defined(vxWorks)
1398 nanosleep(&rqtp, NULL);
1407 if (
try == FSEEK_TRIES) {
1408 fputs(
"warning: gzseek problems--unable to recover\n", stderr);
1411 fputs(
"warning: gzseek problems--recovered\n", stderr);
1461 layout = &SDDS_dataset->layout;
1463 if (SDDS_dataset->layout.gzipFile) {
1464 gzfp = layout->gzfp;
1465 fBuffer = &SDDS_dataset->fBuffer;
1466 for (i = 0; i < layout->n_parameters; i++) {
1467 if (layout->parameter_definition[i].fixed_value)
1469 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
1470 if (!SDDS_GZipWriteBinaryString(*((
char **)SDDS_dataset->parameter[i]), gzfp, fBuffer)) {
1471 SDDS_SetError(
"Unable to write parameters--failure writing string (SDDS_WriteBinaryParameters)");
1474 }
else if (!SDDS_GZipBufferedWrite(SDDS_dataset->parameter[i],
SDDS_type_size[layout->parameter_definition[i].type - 1], gzfp, fBuffer)) {
1475 SDDS_SetError(
"Unable to write parameters--failure writing value (SDDS_WriteBinaryParameters)");
1481 if (SDDS_dataset->layout.lzmaFile) {
1482 lzmafp = layout->lzmafp;
1483 fBuffer = &SDDS_dataset->fBuffer;
1484 for (i = 0; i < layout->n_parameters; i++) {
1485 if (layout->parameter_definition[i].fixed_value)
1487 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
1489 SDDS_SetError(
"Unable to write parameters--failure writing string (SDDS_WriteBinaryParameters)");
1493 SDDS_SetError(
"Unable to write parameters--failure writing value (SDDS_WriteBinaryParameters)");
1499 fBuffer = &SDDS_dataset->fBuffer;
1500 for (i = 0; i < layout->n_parameters; i++) {
1501 if (layout->parameter_definition[i].fixed_value)
1503 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
1505 SDDS_SetError(
"Unable to write parameters--failure writing string (SDDS_WriteBinaryParameters)");
1509 SDDS_SetError(
"Unable to write parameters--failure writing value (SDDS_WriteBinaryParameters)");
1555 int32_t i, j, zero = 0;
1566 layout = &SDDS_dataset->layout;
1568 if (SDDS_dataset->layout.gzipFile) {
1569 gzfp = layout->gzfp;
1570 fBuffer = &SDDS_dataset->fBuffer;
1571 for (i = 0; i < layout->n_arrays; i++) {
1572 if (!SDDS_dataset->array[i].dimension) {
1573 for (j = 0; j < layout->array_definition[i].dimensions; j++)
1574 if (!SDDS_GZipBufferedWrite(&zero,
sizeof(zero), gzfp, fBuffer)) {
1575 SDDS_SetError(
"Unable to write null array--failure writing dimensions (SDDS_WriteBinaryArrays)");
1580 if (!SDDS_GZipBufferedWrite(SDDS_dataset->array[i].dimension,
sizeof(*(SDDS_dataset->array)[i].dimension) * layout->array_definition[i].dimensions, gzfp, fBuffer)) {
1581 SDDS_SetError(
"Unable to write arrays--failure writing dimensions (SDDS_WriteBinaryArrays)");
1584 if (layout->array_definition[i].type ==
SDDS_STRING) {
1585 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
1586 if (!SDDS_GZipWriteBinaryString(((
char **)SDDS_dataset->array[i].data)[j], gzfp, fBuffer)) {
1587 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteBinaryArrays)");
1591 }
else if (!SDDS_GZipBufferedWrite(SDDS_dataset->array[i].data,
SDDS_type_size[layout->array_definition[i].type - 1] * SDDS_dataset->array[i].elements, gzfp, fBuffer)) {
1592 SDDS_SetError(
"Unable to write arrays--failure writing values (SDDS_WriteBinaryArrays)");
1598 if (SDDS_dataset->layout.gzipFile) {
1599 lzmafp = layout->lzmafp;
1600 fBuffer = &SDDS_dataset->fBuffer;
1601 for (i = 0; i < layout->n_arrays; i++) {
1602 if (!SDDS_dataset->array[i].dimension) {
1603 for (j = 0; j < layout->array_definition[i].dimensions; j++)
1605 SDDS_SetError(
"Unable to write null array--failure writing dimensions (SDDS_WriteBinaryArrays)");
1610 if (!
SDDS_LZMABufferedWrite(SDDS_dataset->array[i].dimension,
sizeof(*(SDDS_dataset->array)[i].dimension) * layout->array_definition[i].dimensions, lzmafp, fBuffer)) {
1611 SDDS_SetError(
"Unable to write arrays--failure writing dimensions (SDDS_WriteBinaryArrays)");
1614 if (layout->array_definition[i].type ==
SDDS_STRING) {
1615 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
1617 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteBinaryArrays)");
1622 SDDS_SetError(
"Unable to write arrays--failure writing values (SDDS_WriteBinaryArrays)");
1628 fBuffer = &SDDS_dataset->fBuffer;
1629 for (i = 0; i < layout->n_arrays; i++) {
1630 if (!SDDS_dataset->array[i].dimension) {
1631 for (j = 0; j < layout->array_definition[i].dimensions; j++)
1633 SDDS_SetError(
"Unable to write null array--failure writing dimensions (SDDS_WriteBinaryArrays)");
1638 if (!
SDDS_BufferedWrite(SDDS_dataset->array[i].dimension,
sizeof(*(SDDS_dataset->array)[i].dimension) * layout->array_definition[i].dimensions, fp, fBuffer)) {
1639 SDDS_SetError(
"Unable to write arrays--failure writing dimensions (SDDS_WriteBinaryArrays)");
1642 if (layout->array_definition[i].type ==
SDDS_STRING) {
1643 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
1645 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteBinaryArrays)");
1649 }
else if (!
SDDS_BufferedWrite(SDDS_dataset->array[i].data,
SDDS_type_size[layout->array_definition[i].type - 1] * SDDS_dataset->array[i].elements, fp, fBuffer)) {
1650 SDDS_SetError(
"Unable to write arrays--failure writing values (SDDS_WriteBinaryArrays)");
1695 int64_t i, row, rows, type, size;
1706 layout = &SDDS_dataset->layout;
1707 fBuffer = &SDDS_dataset->fBuffer;
1710 if (SDDS_dataset->layout.gzipFile) {
1711 gzfp = layout->gzfp;
1712 for (i = 0; i < layout->n_columns; i++) {
1713 type = layout->column_definition[i].type;
1716 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1717 if (SDDS_dataset->row_flag[row] && !SDDS_GZipWriteBinaryString(*((
char **)SDDS_dataset->data[i] + row), gzfp, fBuffer)) {
1718 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteBinaryColumns)");
1723 if (rows == SDDS_dataset->n_rows) {
1724 if (!SDDS_GZipBufferedWrite(SDDS_dataset->data[i], size * rows, gzfp, fBuffer)) {
1725 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteBinaryColumns)");
1729 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1730 if (SDDS_dataset->row_flag[row] && !SDDS_GZipBufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, gzfp, fBuffer)) {
1731 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteBinaryColumns)");
1740 if (SDDS_dataset->layout.lzmaFile) {
1741 lzmafp = layout->lzmafp;
1742 for (i = 0; i < layout->n_columns; i++) {
1743 type = layout->column_definition[i].type;
1745 if (layout->column_definition[i].type ==
SDDS_STRING) {
1746 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1748 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteBinaryColumns)");
1753 if (rows == SDDS_dataset->n_rows) {
1755 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteBinaryColumns)");
1759 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1760 if (SDDS_dataset->row_flag[row] && !
SDDS_LZMABufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, lzmafp, fBuffer)) {
1761 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteBinaryColumns)");
1770 for (i = 0; i < layout->n_columns; i++) {
1771 type = layout->column_definition[i].type;
1773 if (layout->column_definition[i].type ==
SDDS_STRING) {
1774 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1775 if (SDDS_dataset->row_flag[row] && !
SDDS_WriteBinaryString(*((
char **)SDDS_dataset->data[i] + row), fp, fBuffer)) {
1776 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteBinaryColumns)");
1781 if (rows == SDDS_dataset->n_rows) {
1783 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteBinaryColumns)");
1787 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1788 if (SDDS_dataset->row_flag[row] && !
SDDS_BufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, fp, fBuffer)) {
1789 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteBinaryColumns)");
1838 int64_t i, row, rows, size, type;
1849 layout = &SDDS_dataset->layout;
1851 fBuffer = &SDDS_dataset->fBuffer;
1853 if (SDDS_dataset->layout.gzipFile) {
1854 gzfp = layout->gzfp;
1855 for (i = 0; i < layout->n_columns; i++) {
1856 type = layout->column_definition[i].type;
1859 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1860 if (SDDS_dataset->row_flag[row] && !SDDS_GZipWriteNonNativeBinaryString(*((
char **)SDDS_dataset->data[i] + row), gzfp, fBuffer)) {
1861 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteNonNativeBinaryColumns)");
1866 if (rows == SDDS_dataset->n_rows) {
1867 if (!SDDS_GZipBufferedWrite((
char *)SDDS_dataset->data[i], size * rows, gzfp, fBuffer)) {
1868 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteNonNativeBinaryColumns)");
1872 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1873 if (SDDS_dataset->row_flag[row] && !SDDS_GZipBufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, gzfp, fBuffer)) {
1874 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteNonNativeBinaryColumns)");
1883 if (SDDS_dataset->layout.lzmaFile) {
1884 lzmafp = layout->lzmafp;
1885 for (i = 0; i < layout->n_columns; i++) {
1886 type = layout->column_definition[i].type;
1889 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1891 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteNonNativeBinaryColumns)");
1896 if (rows == SDDS_dataset->n_rows) {
1898 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteNonNativeBinaryColumns)");
1902 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1903 if (SDDS_dataset->row_flag[row] && !
SDDS_LZMABufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, lzmafp, fBuffer)) {
1904 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteNonNativeBinaryColumns)");
1913 for (i = 0; i < layout->n_columns; i++) {
1914 type = layout->column_definition[i].type;
1917 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1919 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteNonNativeBinaryColumns)");
1924 if (rows == SDDS_dataset->n_rows) {
1926 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteNonNativeBinaryColumns)");
1930 for (row = 0; row < SDDS_dataset->n_rows; row++) {
1931 if (SDDS_dataset->row_flag[row] && !
SDDS_BufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, fp, fBuffer)) {
1932 SDDS_SetError(
"Unable to write columns--failure writing values (SDDS_WriteNonNativeBinaryColumns)");
1979 int64_t i, type, size;
1990 layout = &SDDS_dataset->layout;
1992 if (SDDS_dataset->layout.gzipFile) {
1993 gzfp = layout->gzfp;
1994 fBuffer = &SDDS_dataset->fBuffer;
1995 for (i = 0; i < layout->n_columns; i++) {
1996 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
1997 if (!SDDS_GZipWriteBinaryString(*((
char **)SDDS_dataset->data[i] + row), gzfp, fBuffer)) {
1998 SDDS_SetError(
"Unable to write rows--failure writing string (SDDS_WriteBinaryRows)");
2003 if (!SDDS_GZipBufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, gzfp, fBuffer)) {
2004 SDDS_SetError(
"Unable to write row--failure writing value (SDDS_WriteBinaryRow)");
2011 if (SDDS_dataset->layout.lzmaFile) {
2012 lzmafp = layout->lzmafp;
2013 fBuffer = &SDDS_dataset->fBuffer;
2014 for (i = 0; i < layout->n_columns; i++) {
2015 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
2017 SDDS_SetError(
"Unable to write rows--failure writing string (SDDS_WriteBinaryRows)");
2023 SDDS_SetError(
"Unable to write row--failure writing value (SDDS_WriteBinaryRow)");
2030 fBuffer = &SDDS_dataset->fBuffer;
2031 for (i = 0; i < layout->n_columns; i++) {
2032 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
2034 SDDS_SetError(
"Unable to write rows--failure writing string (SDDS_WriteBinaryRows)");
2039 if (!
SDDS_BufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, fp, fBuffer)) {
2040 SDDS_SetError(
"Unable to write row--failure writing value (SDDS_WriteBinaryRow)");
2076 int32_t returnValue;
2078 returnValue = SDDS_dataset->readRecoveryPossible;
2079 SDDS_dataset->readRecoveryPossible = 0;
2104 SDDS_dataset->readRecoveryPossible = mode;
2225 int64_t n_rows, i, j, k, alloc_rows, rows_to_store, mod;
2234 void **statData=NULL;
2237 if (SDDS_dataset->autoRecovered)
2239 if (SDDS_dataset->swapByteOrder) {
2247 if (SDDS_dataset->layout.gzipFile) {
2248 gzfp = SDDS_dataset->layout.gzfp;
2251 if (SDDS_dataset->layout.lzmaFile) {
2252 lzmafp = SDDS_dataset->layout.lzmafp;
2254 fp = SDDS_dataset->layout.fp;
2259 fBuffer = &SDDS_dataset->fBuffer;
2260 if (!fBuffer->buffer) {
2261 int32_t bufferSize = SDDS_GetLockedDefaultIOBufferSize();
2262 if (bufferSize == 0 && (SDDS_dataset->layout.popenUsed || !SDDS_dataset->layout.filename) && (sparse_interval > 1 || sparse_offset > 0 || last_rows > 0)) {
2263 SDDS_SetError(
"The IO buffer size is 0 for data being read from a pipe with sparsing. This is not supported.");
2266 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * (bufferSize + 1)))) {
2267 SDDS_SetError(
"Unable to do buffered read--allocation failure");
2270 fBuffer->bufferSize = bufferSize;
2271 fBuffer->bytesLeft = 0;
2273 SDDS_dataset->rowcount_offset = -1;
2275 if (SDDS_dataset->layout.gzipFile) {
2276 if (!SDDS_GZipBufferedRead(&n_rows32,
sizeof(n_rows32), gzfp, &SDDS_dataset->fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
2278 return (SDDS_dataset->page_number = -1);
2279 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadBinaryPageDetailed)");
2282 if (n_rows32 == INT32_MIN) {
2283 if (!SDDS_GZipBufferedRead(&n_rows,
sizeof(n_rows), gzfp, &SDDS_dataset->fBuffer,
SDDS_LONG64, SDDS_dataset->layout.byteOrderDeclared)) {
2285 return (SDDS_dataset->page_number = -1);
2286 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadBinaryPageDetailed)");
2298 if (SDDS_dataset->layout.lzmaFile) {
2300 if (lzma_eof(lzmafp))
2301 return (SDDS_dataset->page_number = -1);
2302 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadBinaryPageDetailed)");
2305 if (n_rows32 == INT32_MIN) {
2307 if (lzma_eof(lzmafp))
2308 return (SDDS_dataset->page_number = -1);
2309 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadBinaryPageDetailed)");
2316 SDDS_dataset->rowcount_offset = ftell(fp);
2317 if (!
SDDS_BufferedRead(&n_rows32,
sizeof(n_rows32), fp, &SDDS_dataset->fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
2319 return (SDDS_dataset->page_number = -1);
2320 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadBinaryPageDetailed)");
2323 if (n_rows32 == INT32_MIN) {
2326 return (SDDS_dataset->page_number = -1);
2327 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadBinaryPageDetailed)");
2339 fprintf(stderr,
"Expect %" PRId64
" rows of data\n", n_rows);
2342 SDDS_SetError(
"Unable to read page--negative number of rows (SDDS_ReadBinaryPageDetailed)");
2345 if (SDDS_dataset->layout.byteOrderDeclared == 0) {
2346 if (n_rows > 10000000) {
2347 SDDS_SetError(
"Unable to read page--endian byte order not declared and suspected to be non-native. (SDDS_ReadBinaryPageDetailed)");
2353 return (SDDS_dataset->page_number = -1);
2360 sparse_interval = 1;
2361 sparse_offset = n_rows - last_rows;
2363 if (sparse_interval <= 0)
2364 sparse_interval = 1;
2365 if (sparse_offset < 0)
2368 rows_to_store = (n_rows - sparse_offset) / sparse_interval + 2;
2369 alloc_rows = rows_to_store - SDDS_dataset->n_rows_allocated;
2372 SDDS_SetError(
"Unable to read page--couldn't start page (SDDS_ReadBinaryPageDetailed)");
2378 SDDS_SetError(
"Unable to read page--parameter reading error (SDDS_ReadBinaryPageDetailed)");
2384 SDDS_SetError(
"Unable to read page--array reading error (SDDS_ReadBinaryPageDetailed)");
2387 if (SDDS_dataset->layout.data_mode.column_major) {
2388 SDDS_dataset->n_rows = n_rows;
2389 if (sparse_statistics == 0) {
2391 SDDS_SetError(
"Unable to read page--column reading error (SDDS_ReadBinaryPageDetailed)");
2394 return (SDDS_dataset->page_number);
2397 if (SDDS_dataset->n_rows_allocated < n_rows) {
2399 SDDS_SetError(
"Unable to read page--couldn't start page (SDDS_ReadBinaryPageDetailed)");
2404 SDDS_SetError(
"Unable to read page--column reading error (SDDS_ReadBinaryPageDetailed)");
2407 statData = (
void**)malloc(SDDS_dataset->layout.n_columns *
sizeof(
void*));
2408 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
2411 statData[i] = (
double*)calloc(sparse_interval,
sizeof(
double));
2413 n_rows -= sparse_offset;
2414 for (j = k = 0; j < n_rows; j++) {
2415 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
2416 switch (SDDS_dataset->layout.column_definition[i].type) {
2419 ((
double*)statData[i])[j % sparse_interval] = (double)(((
float*)SDDS_dataset->data[i])[j + sparse_offset]);
2423 ((
double*)statData[i])[j % sparse_interval] = ((
double*)SDDS_dataset->data[i])[j + sparse_offset];
2427 ((
double*)statData[i])[j % sparse_interval] = (double)(((
long double*)SDDS_dataset->data[i])[j + sparse_offset]);
2430 if (((
char ***)SDDS_dataset->data)[i][k])
2431 free(((
char ***)SDDS_dataset->data)[i][k]);
2432 ((
char ***)SDDS_dataset->data)[i][k] = ((
char ***)SDDS_dataset->data)[i][j + sparse_offset];
2433 ((
char ***)SDDS_dataset->data)[i][j + sparse_offset] = NULL;
2436 ((
short*)SDDS_dataset->data[i])[k] = ((
short*)SDDS_dataset->data[i])[j + sparse_offset];
2439 ((
unsigned short*)SDDS_dataset->data[i])[k] = ((
unsigned short*)SDDS_dataset->data[i])[j + sparse_offset];
2442 ((int32_t*)SDDS_dataset->data[i])[k] = ((int32_t*)SDDS_dataset->data[i])[j + sparse_offset];
2445 ((uint32_t*)SDDS_dataset->data[i])[k] = ((uint32_t*)SDDS_dataset->data[i])[j + sparse_offset];
2448 ((int64_t*)SDDS_dataset->data[i])[k] = ((int64_t*)SDDS_dataset->data[i])[j + sparse_offset];
2451 ((uint64_t*)SDDS_dataset->data[i])[k] = ((uint64_t*)SDDS_dataset->data[i])[j + sparse_offset];
2454 ((
char*)SDDS_dataset->data[i])[k] = ((
char*)SDDS_dataset->data[i])[j + sparse_offset];
2460 if (sparse_statistics == 1)
2461 compute_average(&statResult, (
double*)statData[i], (j % sparse_interval) + 1);
2462 else if (sparse_statistics == 2)
2463 compute_median(&statResult, (
double*)statData[i], (j % sparse_interval) + 1);
2464 else if (sparse_statistics == 3)
2465 statResult =
min_in_array((
double*)statData[i], (j % sparse_interval) + 1);
2466 else if (sparse_statistics == 4)
2467 statResult =
max_in_array((
double*)statData[i], (j % sparse_interval) + 1);
2468 switch (SDDS_dataset->layout.column_definition[i].type) {
2470 ((
float*)SDDS_dataset->data[i])[k] = statResult;
2473 ((
double*)SDDS_dataset->data[i])[k] = statResult;
2476 ((
long double*)SDDS_dataset->data[i])[k] = statResult;
2481 if (j % sparse_interval == sparse_interval - 1)
2484 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
2485 if (SDDS_dataset->layout.column_definition[i].type ==
SDDS_STRING) {
2487 for (r = k; r < SDDS_dataset->n_rows; r++) {
2488 if (((
char ***)SDDS_dataset->data)[i][r]) {
2489 free(((
char ***)SDDS_dataset->data)[i][r]);
2490 ((
char ***)SDDS_dataset->data)[i][r] = NULL;
2498 SDDS_dataset->n_rows = k;
2499 return (SDDS_dataset->page_number);
2502 if ((sparse_interval <= 1) && (sparse_offset == 0)) {
2503 for (j = 0; j < n_rows; j++) {
2505 SDDS_dataset->n_rows = j;
2506 if (SDDS_dataset->autoRecover) {
2508 fprintf(stderr,
"Doing auto-read recovery\n");
2510 SDDS_dataset->autoRecovered = 1;
2512 return (SDDS_dataset->page_number);
2514 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_ReadBinaryPageDetailed)");
2519 SDDS_dataset->n_rows = j;
2520 return (SDDS_dataset->page_number);
2522 for (j = 0; j < sparse_offset; j++) {
2524 SDDS_dataset->n_rows = 0;
2525 if (SDDS_dataset->autoRecover) {
2526 SDDS_dataset->autoRecovered = 1;
2528 return (SDDS_dataset->page_number);
2530 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_ReadBinaryPageDetailed)");
2535 n_rows -= sparse_offset;
2536 if (sparse_statistics != 0) {
2538 statData = (
void**)malloc(SDDS_dataset->layout.n_columns *
sizeof(
void*));
2539 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
2542 statData[i] = (
double*)calloc(sparse_interval,
sizeof(
double));
2545 for (j = k = 0; j < n_rows; j++) {
2547 SDDS_dataset->n_rows = k;
2548 if (SDDS_dataset->autoRecover) {
2549 SDDS_dataset->autoRecovered = 1;
2551 return (SDDS_dataset->page_number);
2553 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_ReadBinaryPageDetailed)");
2557 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
2558 switch (SDDS_dataset->layout.column_definition[i].type) {
2560 ((
double*)statData[i])[j % sparse_interval] = (double)(((
float*)SDDS_dataset->data[i])[k]);
2563 ((
double*)statData[i])[j % sparse_interval] = ((
double*)SDDS_dataset->data[i])[k];
2566 ((
double*)statData[i])[j % sparse_interval] = (double)(((
long double*)SDDS_dataset->data[i])[k]);
2570 if (sparse_statistics == 1) {
2572 compute_average(&statResult, (
double*)statData[i], (j % sparse_interval) + 1);
2573 }
else if (sparse_statistics == 2) {
2575 compute_median(&statResult, (
double*)statData[i], (j % sparse_interval) + 1);
2576 }
else if (sparse_statistics == 3) {
2578 statResult =
min_in_array((
double*)statData[i], (j % sparse_interval) + 1);
2579 }
else if (sparse_statistics == 4) {
2581 statResult =
max_in_array((
double*)statData[i], (j % sparse_interval) + 1);
2584 switch (SDDS_dataset->layout.column_definition[i].type) {
2586 ((
float*)SDDS_dataset->data[i])[k] = statResult;
2589 ((
double*)SDDS_dataset->data[i])[k] = statResult;
2592 ((
long double*)SDDS_dataset->data[i])[k] = statResult;
2596 if (j % sparse_interval == sparse_interval - 1) {
2600 for (i = 0; i < SDDS_dataset->layout.n_columns; i++) {
2607 for (j = k = 0; j < n_rows; j++) {
2609 SDDS_dataset->n_rows = k;
2610 if (SDDS_dataset->autoRecover) {
2611 SDDS_dataset->autoRecovered = 1;
2613 return (SDDS_dataset->page_number);
2615 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_ReadBinaryPageDetailed)");
2622 SDDS_dataset->n_rows = k;
2623 return (SDDS_dataset->page_number);
2644 static const char dummy_string[] =
"";
2646 string = (
char *)dummy_string;
2647 length = strlen(
string);
2649 SDDS_SetError(
"Unable to write string--error writing length");
2653 SDDS_SetError(
"Unable to write string--error writing contents");
2676 static const char dummy_string[] =
"";
2678 string = (
char *)dummy_string;
2679 length = strlen(
string);
2681 SDDS_SetError(
"Unable to write string--error writing length");
2685 SDDS_SetError(
"Unable to write string--error writing contents");
2707int32_t SDDS_GZipWriteBinaryString(
char *
string, gzFile gzfp,
SDDS_FILEBUFFER *fBuffer) {
2709 static const char dummy_string[] =
"";
2711 string = (
char *)dummy_string;
2712 length = strlen(
string);
2713 if (!SDDS_GZipBufferedWrite(&length,
sizeof(length), gzfp, fBuffer)) {
2714 SDDS_SetError(
"Unable to write string--error writing length");
2717 if (length && !SDDS_GZipBufferedWrite(
string,
sizeof(*
string) * length, gzfp, fBuffer)) {
2718 SDDS_SetError(
"Unable to write string--error writing contents");
2747 if (!(
string =
SDDS_Malloc(
sizeof(*
string) * (length + 1))))
2777 if (!(
string =
SDDS_Malloc(
sizeof(*
string) * (length + 1))))
2802char *SDDS_ReadGZipBinaryString(gzFile gzfp,
SDDS_FILEBUFFER *fBuffer, int32_t skip) {
2806 if (!SDDS_GZipBufferedRead(&length,
sizeof(length), gzfp, fBuffer,
SDDS_LONG, 0) || length < 0)
2808 if (!(
string =
SDDS_Malloc(
sizeof(*
string) * (length + 1))))
2810 if (length && !SDDS_GZipBufferedRead(skip ? NULL :
string,
sizeof(*
string) * length, gzfp, fBuffer,
SDDS_STRING, 0))
2837 int64_t i, type, size;
2848 layout = &SDDS_dataset->layout;
2849 fBuffer = &SDDS_dataset->fBuffer;
2852 if (SDDS_dataset->layout.gzipFile) {
2853 gzfp = layout->gzfp;
2854 for (i = 0; i < layout->n_columns; i++) {
2855 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
2857 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
2859 if (((
char ***)SDDS_dataset->data)[i][row])
2860 free((((
char ***)SDDS_dataset->data)[i][row]));
2861 if (!(((
char ***)SDDS_dataset->data)[i][row] = SDDS_ReadGZipBinaryString(gzfp, fBuffer, 0))) {
2862 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadBinaryRows)");
2866 if (!SDDS_ReadGZipBinaryString(gzfp, fBuffer, 1)) {
2867 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadBinaryRows)");
2873 if (!SDDS_GZipBufferedRead(skip ? NULL : (
char *)SDDS_dataset->data[i] + row * size, size, gzfp, fBuffer, type, SDDS_dataset->layout.byteOrderDeclared)) {
2874 SDDS_SetError(
"Unable to read row--failure reading value (SDDS_ReadBinaryRow)");
2881 if (SDDS_dataset->layout.lzmaFile) {
2882 lzmafp = layout->lzmafp;
2883 for (i = 0; i < layout->n_columns; i++) {
2884 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
2886 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
2888 if (((
char ***)SDDS_dataset->data)[i][row])
2889 free((((
char ***)SDDS_dataset->data)[i][row]));
2891 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadBinaryRows)");
2896 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadBinaryRows)");
2902 if (!
SDDS_LZMABufferedRead(skip ? NULL : (
char *)SDDS_dataset->data[i] + row * size, size, lzmafp, fBuffer, type, SDDS_dataset->layout.byteOrderDeclared)) {
2903 SDDS_SetError(
"Unable to read row--failure reading value (SDDS_ReadBinaryRow)");
2910 for (i = 0; i < layout->n_columns; i++) {
2911 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
2913 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
2915 if (((
char ***)SDDS_dataset->data)[i][row])
2916 free((((
char ***)SDDS_dataset->data)[i][row]));
2918 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadBinaryRows)");
2923 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadBinaryRows)");
2929 if (!
SDDS_BufferedRead(skip ? NULL : (
char *)SDDS_dataset->data[i] + row * size, size, fp, fBuffer, type, SDDS_dataset->layout.byteOrderDeclared)) {
2930 SDDS_SetError(
"Unable to read row--failure reading value (SDDS_ReadBinaryRow)");
2963 int64_t row, offset, newRows = 0;
2964 int32_t rowsPresent32;
2965 int64_t rowsPresent;
2968 if (SDDS_dataset->parallel_io) {
2969 SDDS_SetError(
"Error: MPI mode not supported yet in SDDS_ReadNewBinaryRows");
2973 if (SDDS_dataset->original_layout.data_mode.mode == SDDS_ASCII) {
2974 SDDS_SetError(
"Error: ASCII files not supported in SDDS_ReadNewBinaryRows");
2977 if (SDDS_dataset->layout.data_mode.column_major) {
2978 SDDS_SetError(
"Error: column-major order binary files not supported in SDDS_ReadNewBinaryRows");
2981 if (SDDS_dataset->swapByteOrder) {
2982 SDDS_SetError(
"Error: Non-native endian not supported yet in SDDS_ReadNewBinaryRows");
2986 if (SDDS_dataset->layout.gzipFile) {
2987 SDDS_SetError(
"Error: gzip compressed files not supported yet in SDDS_ReadNewBinaryRows");
2991 if (SDDS_dataset->layout.lzmaFile) {
2992 SDDS_SetError(
"Error: lzma compressed files not supported yet in SDDS_ReadNewBinaryRows");
3000 offset = ftell(SDDS_dataset->layout.fp);
3001 fseek(SDDS_dataset->layout.fp, SDDS_dataset->rowcount_offset, 0);
3002 if (SDDS_dataset->layout.data_mode.mode == SDDS_BINARY) {
3003 if (fread(&rowsPresent32,
sizeof(rowsPresent32), 1, SDDS_dataset->layout.fp) == 0) {
3004 SDDS_SetError(
"Error: row count not present or not correct length");
3007 if (SDDS_dataset->swapByteOrder) {
3010 if (rowsPresent32 == INT32_MIN) {
3011 if (fread(&rowsPresent,
sizeof(rowsPresent), 1, SDDS_dataset->layout.fp) == 0) {
3012 SDDS_SetError(
"Error: row count not present or not correct length");
3015 if (SDDS_dataset->swapByteOrder) {
3019 rowsPresent = rowsPresent32;
3023 if (!fgets(buffer, 30, SDDS_dataset->layout.fp) || strlen(buffer) != 21 || sscanf(buffer,
"%" SCNd64, &rowsPresent) != 1) {
3024 SDDS_SetError(
"Error: row count not present or not correct length");
3028 fseek(SDDS_dataset->layout.fp, offset, 0);
3031 if (rowsPresent > SDDS_dataset->n_rows_allocated) {
3037 for (row = SDDS_dataset->n_rows; row < rowsPresent; row++) {
3039 if (SDDS_dataset->autoRecover) {
3041 SDDS_dataset->autoRecovered = 1;
3045 SDDS_SetError(
"Unable to read page--error reading data row");
3049 newRows = row + 1 - SDDS_dataset->n_rows;
3050 SDDS_dataset->n_rows = row + 1;
3076 char buffer[SDDS_MAXLINE];
3086 layout = &SDDS_dataset->layout;
3087 if (!layout->n_parameters)
3090 if (SDDS_dataset->layout.gzipFile) {
3091 gzfp = layout->gzfp;
3094 if (SDDS_dataset->layout.lzmaFile) {
3095 lzmafp = layout->lzmafp;
3102 fBuffer = &SDDS_dataset->fBuffer;
3103 for (i = 0; i < layout->n_parameters; i++) {
3104 if (layout->parameter_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
3106 if (layout->parameter_definition[i].fixed_value) {
3107 strcpy(buffer, layout->parameter_definition[i].fixed_value);
3108 if (!
SDDS_ScanData(buffer, layout->parameter_definition[i].type, 0, SDDS_dataset->parameter[i], 0, 1)) {
3109 SDDS_SetError(
"Unable to read page--parameter scanning error (SDDS_ReadBinaryParameters)");
3112 }
else if (layout->parameter_definition[i].type ==
SDDS_STRING) {
3113 if (*(
char **)SDDS_dataset->parameter[i])
3114 free(*(
char **)SDDS_dataset->parameter[i]);
3116 if (SDDS_dataset->layout.gzipFile) {
3117 if (!(*((
char **)SDDS_dataset->parameter[i]) = SDDS_ReadGZipBinaryString(gzfp, fBuffer, 0))) {
3118 SDDS_SetError(
"Unable to read parameters--failure reading string (SDDS_ReadBinaryParameters)");
3123 if (SDDS_dataset->layout.lzmaFile) {
3125 SDDS_SetError(
"Unable to read parameters--failure reading string (SDDS_ReadBinaryParameters)");
3130 SDDS_SetError(
"Unable to read parameters--failure reading string (SDDS_ReadBinaryParameters)");
3139 if (SDDS_dataset->layout.gzipFile) {
3140 if (!SDDS_GZipBufferedRead(SDDS_dataset->parameter[i],
SDDS_type_size[layout->parameter_definition[i].type - 1], gzfp, fBuffer, layout->parameter_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3141 SDDS_SetError(
"Unable to read parameters--failure reading value (SDDS_ReadBinaryParameters)");
3146 if (SDDS_dataset->layout.lzmaFile) {
3147 if (!
SDDS_LZMABufferedRead(SDDS_dataset->parameter[i],
SDDS_type_size[layout->parameter_definition[i].type - 1], lzmafp, fBuffer, layout->parameter_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3148 SDDS_SetError(
"Unable to read parameters--failure reading value (SDDS_ReadBinaryParameters)");
3152 if (!
SDDS_BufferedRead(SDDS_dataset->parameter[i],
SDDS_type_size[layout->parameter_definition[i].type - 1], fp, fBuffer, layout->parameter_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3153 SDDS_SetError(
"Unable to read parameters--failure reading value (SDDS_ReadBinaryParameters)");
3199 layout = &SDDS_dataset->layout;
3200 if (!layout->n_arrays)
3203 if (SDDS_dataset->layout.gzipFile) {
3204 gzfp = layout->gzfp;
3207 if (SDDS_dataset->layout.lzmaFile) {
3208 lzmafp = layout->lzmafp;
3215 fBuffer = &SDDS_dataset->fBuffer;
3216 if (!SDDS_dataset->array) {
3217 SDDS_SetError(
"Unable to read array--pointer to structure storage area is NULL (SDDS_ReadBinaryArrays)");
3220 for (i = 0; i < layout->n_arrays; i++) {
3221 array = SDDS_dataset->array + i;
3223 SDDS_SetError(
"Unable to get array--array definition corrupted (SDDS_ReadBinaryArrays)");
3227 SDDS_SetError(
"Unable to read array--definition copy failed (SDDS_ReadBinaryArrays)");
3231 if (!(array->dimension =
SDDS_Realloc(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions))) {
3232 SDDS_SetError(
"Unable to read array--allocation failure (SDDS_ReadBinaryArrays)");
3236 if (SDDS_dataset->layout.gzipFile) {
3237 if (!SDDS_GZipBufferedRead(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions, gzfp, fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
3238 SDDS_SetError(
"Unable to read arrays--failure reading dimensions (SDDS_ReadBinaryArrays)");
3243 if (SDDS_dataset->layout.lzmaFile) {
3244 if (!
SDDS_LZMABufferedRead(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions, lzmafp, fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
3245 SDDS_SetError(
"Unable to read arrays--failure reading dimensions (SDDS_ReadBinaryArrays)");
3249 if (!
SDDS_BufferedRead(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions, fp, fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
3250 SDDS_SetError(
"Unable to read arrays--failure reading dimensions (SDDS_ReadBinaryArrays)");
3257 array->elements = 1;
3258 for (j = 0; j < array->definition->dimensions; j++)
3259 array->elements *= array->dimension[j];
3262 array->data = array->pointer = NULL;
3263 if (array->elements == 0)
3265 if (array->elements < 0) {
3266 SDDS_SetError(
"Unable to read array--number of elements is negative (SDDS_ReadBinaryArrays)");
3270 SDDS_SetError(
"Unable to read array--allocation failure (SDDS_ReadBinaryArrays)");
3275 if (SDDS_dataset->layout.gzipFile) {
3276 for (j = 0; j < array->elements; j++) {
3277 if (!(((
char **)(array->data))[j] = SDDS_ReadGZipBinaryString(gzfp, fBuffer, 0))) {
3278 SDDS_SetError(
"Unable to read arrays--failure reading string (SDDS_ReadBinaryArrays)");
3284 if (SDDS_dataset->layout.lzmaFile) {
3285 for (j = 0; j < array->elements; j++) {
3287 SDDS_SetError(
"Unable to read arrays--failure reading string (SDDS_ReadBinaryArrays)");
3292 for (j = 0; j < array->elements; j++) {
3294 SDDS_SetError(
"Unable to read arrays--failure reading string (SDDS_ReadBinaryArrays)");
3304 if (SDDS_dataset->layout.gzipFile) {
3305 if (!SDDS_GZipBufferedRead(array->data,
SDDS_type_size[array->definition->type - 1] * array->elements, gzfp, fBuffer, array->definition->type, SDDS_dataset->layout.byteOrderDeclared)) {
3306 SDDS_SetError(
"Unable to read arrays--failure reading values (SDDS_ReadBinaryArrays)");
3311 if (SDDS_dataset->layout.lzmaFile) {
3312 if (!
SDDS_LZMABufferedRead(array->data,
SDDS_type_size[array->definition->type - 1] * array->elements, lzmafp, fBuffer, array->definition->type, SDDS_dataset->layout.byteOrderDeclared)) {
3313 SDDS_SetError(
"Unable to read arrays--failure reading values (SDDS_ReadBinaryArrays)");
3317 if (!
SDDS_BufferedRead(array->data,
SDDS_type_size[array->definition->type - 1] * array->elements, fp, fBuffer, array->definition->type, SDDS_dataset->layout.byteOrderDeclared)) {
3318 SDDS_SetError(
"Unable to read arrays--failure reading values (SDDS_ReadBinaryArrays)");
3350 int64_t i, j, k, row;
3363 layout = &SDDS_dataset->layout;
3364 if (!layout->n_columns || !SDDS_dataset->n_rows)
3367 if (SDDS_dataset->layout.gzipFile) {
3368 gzfp = layout->gzfp;
3371 if (SDDS_dataset->layout.lzmaFile) {
3372 lzmafp = layout->lzmafp;
3379 fBuffer = &SDDS_dataset->fBuffer;
3381 for (i = 0; i < layout->n_columns; i++) {
3382 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
3384 if (layout->column_definition[i].type ==
SDDS_STRING) {
3386 if (SDDS_dataset->layout.gzipFile) {
3387 for (row = 0; row < SDDS_dataset->n_rows; row++) {
3388 if (((
char ***)SDDS_dataset->data)[i][row])
3389 free((((
char ***)SDDS_dataset->data)[i][row]));
3390 if (!(((
char ***)SDDS_dataset->data)[i][row] = SDDS_ReadGZipBinaryString(gzfp, fBuffer, 0))) {
3391 SDDS_SetError(
"Unable to read columns--failure reading string (SDDS_ReadBinaryColumns)");
3397 if (SDDS_dataset->layout.lzmaFile) {
3398 for (row = 0; row < SDDS_dataset->n_rows; row++) {
3399 if (((
char ***)SDDS_dataset->data)[i][row])
3400 free((((
char ***)SDDS_dataset->data)[i][row]));
3402 SDDS_SetError(
"Unable to read columns--failure reading string (SDDS_ReadBinaryColumms)");
3407 for (row = 0; row < SDDS_dataset->n_rows; row++) {
3408 if (((
char ***)SDDS_dataset->data)[i][row])
3409 free((((
char ***)SDDS_dataset->data)[i][row]));
3411 SDDS_SetError(
"Unable to read columns--failure reading string (SDDS_ReadBinaryColumms)");
3421 if (SDDS_dataset->layout.gzipFile) {
3422 if (!SDDS_GZipBufferedRead(SDDS_dataset->data[i],
SDDS_type_size[layout->column_definition[i].type - 1] * SDDS_dataset->n_rows, gzfp, fBuffer, layout->column_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3423 SDDS_SetError(
"Unable to read columns--failure reading values (SDDS_ReadBinaryColumns)");
3428 if (SDDS_dataset->layout.lzmaFile) {
3429 if (!
SDDS_LZMABufferedRead(SDDS_dataset->data[i],
SDDS_type_size[layout->column_definition[i].type - 1] * SDDS_dataset->n_rows, lzmafp, fBuffer, layout->column_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3430 SDDS_SetError(
"Unable to read columns--failure reading values (SDDS_ReadBinaryColumns)");
3434 if (!
SDDS_BufferedRead(SDDS_dataset->data[i],
SDDS_type_size[layout->column_definition[i].type - 1] * SDDS_dataset->n_rows, fp, fBuffer, layout->column_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3435 SDDS_SetError(
"Unable to read columns--failure reading values (SDDS_ReadBinaryColumns)");
3445 if (sparse_interval == 1 && sparse_offset == 0) {
3449 j = SDDS_dataset->n_rows;
3450 for (i = 0; i < layout->n_columns; i++) {
3452 switch (layout->column_definition[i].type) {
3454 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3455 if (k % sparse_interval == 0) {
3456 ((
short*)SDDS_dataset->data[i])[j] = ((
short*)SDDS_dataset->data[i])[row];
3463 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3464 if (k % sparse_interval == 0) {
3465 ((
unsigned short*)SDDS_dataset->data[i])[j] = ((
unsigned short*)SDDS_dataset->data[i])[row];
3472 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3473 if (k % sparse_interval == 0) {
3474 ((int32_t*)SDDS_dataset->data[i])[j] = ((int32_t*)SDDS_dataset->data[i])[row];
3481 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3482 if (k % sparse_interval == 0) {
3483 ((uint32_t*)SDDS_dataset->data[i])[j] = ((uint32_t*)SDDS_dataset->data[i])[row];
3490 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3491 if (k % sparse_interval == 0) {
3492 ((int64_t*)SDDS_dataset->data[i])[j] = ((int64_t*)SDDS_dataset->data[i])[row];
3499 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3500 if (k % sparse_interval == 0) {
3501 ((uint64_t*)SDDS_dataset->data[i])[j] = ((uint64_t*)SDDS_dataset->data[i])[row];
3508 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3509 if (k % sparse_interval == 0) {
3510 ((
float*)SDDS_dataset->data[i])[j] = ((
float*)SDDS_dataset->data[i])[row];
3517 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3518 if (k % sparse_interval == 0) {
3519 ((
double*)SDDS_dataset->data[i])[j] = ((
double*)SDDS_dataset->data[i])[row];
3526 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3527 if (k % sparse_interval == 0) {
3528 ((
long double*)SDDS_dataset->data[i])[j] = ((
long double*)SDDS_dataset->data[i])[row];
3535 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3536 if (k % sparse_interval == 0) {
3537 ((
char**)SDDS_dataset->data[i])[j] = ((
char**)SDDS_dataset->data[i])[row];
3542 for (k=j; k<SDDS_dataset->n_rows; k++) {
3543 if (((
char ***)SDDS_dataset->data)[i][k]) {
3544 free((((
char ***)SDDS_dataset->data)[i][k]));
3545 ((
char ***)SDDS_dataset->data)[i][k] = NULL;
3551 for (row = sparse_offset; row < SDDS_dataset->n_rows; row++) {
3552 if (k % sparse_interval == 0) {
3553 ((
char*)SDDS_dataset->data[i])[j] = ((
char*)SDDS_dataset->data[i])[row];
3564 SDDS_dataset->n_rows = j;
3604 layout = &SDDS_dataset->layout;
3605 if (!layout->n_columns || !SDDS_dataset->n_rows)
3608 if (SDDS_dataset->layout.gzipFile) {
3609 gzfp = layout->gzfp;
3612 if (SDDS_dataset->layout.lzmaFile) {
3613 lzmafp = layout->lzmafp;
3620 fBuffer = &SDDS_dataset->fBuffer;
3622 for (i = 0; i < layout->n_columns; i++) {
3623 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
3625 if (layout->column_definition[i].type ==
SDDS_STRING) {
3627 if (SDDS_dataset->layout.gzipFile) {
3628 for (row = 0; row < SDDS_dataset->n_rows; row++) {
3629 if (((
char ***)SDDS_dataset->data)[i][row])
3630 free((((
char ***)SDDS_dataset->data)[i][row]));
3631 if (!(((
char ***)SDDS_dataset->data)[i][row] = SDDS_ReadNonNativeGZipBinaryString(gzfp, fBuffer, 0))) {
3632 SDDS_SetError(
"Unable to read columns--failure reading string (SDDS_ReadNonNativeBinaryColumns)");
3638 if (SDDS_dataset->layout.lzmaFile) {
3639 for (row = 0; row < SDDS_dataset->n_rows; row++) {
3640 if (((
char ***)SDDS_dataset->data)[i][row])
3641 free((((
char ***)SDDS_dataset->data)[i][row]));
3643 SDDS_SetError(
"Unable to read columns--failure reading string (SDDS_ReadNonNativeBinaryColumms)");
3648 for (row = 0; row < SDDS_dataset->n_rows; row++) {
3649 if (((
char ***)SDDS_dataset->data)[i][row])
3650 free((((
char ***)SDDS_dataset->data)[i][row]));
3652 SDDS_SetError(
"Unable to read columns--failure reading string (SDDS_ReadNonNativeBinaryColumms)");
3662 if (SDDS_dataset->layout.gzipFile) {
3663 if (!SDDS_GZipBufferedRead(SDDS_dataset->data[i],
SDDS_type_size[layout->column_definition[i].type - 1] * SDDS_dataset->n_rows, gzfp, fBuffer, layout->column_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3664 SDDS_SetError(
"Unable to read columns--failure reading values (SDDS_ReadNonNativeBinaryColumns)");
3669 if (SDDS_dataset->layout.lzmaFile) {
3670 if (!
SDDS_LZMABufferedRead(SDDS_dataset->data[i],
SDDS_type_size[layout->column_definition[i].type - 1] * SDDS_dataset->n_rows, lzmafp, fBuffer, layout->column_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3671 SDDS_SetError(
"Unable to read columns--failure reading values (SDDS_ReadNonNativeBinaryColumns)");
3675 if (!
SDDS_BufferedRead(SDDS_dataset->data[i],
SDDS_type_size[layout->column_definition[i].type - 1] * SDDS_dataset->n_rows, fp, fBuffer, layout->column_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
3676 SDDS_SetError(
"Unable to read columns--failure reading values (SDDS_ReadNonNativeBinaryColumns)");
3711 unsigned short *suData;
3718 long double *ldData;
3720 layout = &SDDSin->layout;
3721 for (i = 0; i < layout->n_columns; i++) {
3722 switch (layout->column_definition[i].type) {
3724 sData = SDDSin->data[i];
3725 for (row = 0; row < SDDSin->n_rows; row++)
3729 suData = SDDSin->data[i];
3730 for (row = 0; row < SDDSin->n_rows; row++)
3734 lData = SDDSin->data[i];
3735 for (row = 0; row < SDDSin->n_rows; row++)
3739 luData = SDDSin->data[i];
3740 for (row = 0; row < SDDSin->n_rows; row++)
3744 lData64 = SDDSin->data[i];
3745 for (row = 0; row < SDDSin->n_rows; row++)
3749 luData64 = SDDSin->data[i];
3750 for (row = 0; row < SDDSin->n_rows; row++)
3754 ldData = SDDSin->data[i];
3755 for (row = 0; row < SDDSin->n_rows; row++)
3759 dData = SDDSin->data[i];
3760 for (row = 0; row < SDDSin->n_rows; row++)
3764 fData = SDDSin->data[i];
3765 for (row = 0; row < SDDSin->n_rows; row++)
3797 unsigned short *suData;
3804 long double *ldData;
3806 layout = &SDDSin->layout;
3807 for (i = 0; i < layout->n_parameters; i++) {
3808 if (layout->parameter_definition[i].fixed_value) {
3811 switch (layout->parameter_definition[i].type) {
3813 sData = SDDSin->parameter[i];
3817 suData = SDDSin->parameter[i];
3821 lData = SDDSin->parameter[i];
3825 luData = SDDSin->parameter[i];
3829 lData64 = SDDSin->parameter[i];
3833 luData64 = SDDSin->parameter[i];
3837 ldData = SDDSin->parameter[i];
3841 dData = SDDSin->parameter[i];
3845 fData = SDDSin->parameter[i];
3876 unsigned short *suData;
3883 long double *ldData;
3885 layout = &SDDSin->layout;
3887 for (i = 0; i < layout->n_arrays; i++) {
3888 switch (layout->array_definition[i].type) {
3890 sData = SDDSin->array[i].data;
3891 for (j = 0; j < SDDSin->array[i].elements; j++)
3895 suData = SDDSin->array[i].data;
3896 for (j = 0; j < SDDSin->array[i].elements; j++)
3900 lData = SDDSin->array[i].data;
3901 for (j = 0; j < SDDSin->array[i].elements; j++)
3905 luData = SDDSin->array[i].data;
3906 for (j = 0; j < SDDSin->array[i].elements; j++)
3910 lData64 = SDDSin->array[i].data;
3911 for (j = 0; j < SDDSin->array[i].elements; j++)
3915 luData64 = SDDSin->array[i].data;
3916 for (j = 0; j < SDDSin->array[i].elements; j++)
3920 ldData = SDDSin->array[i].data;
3921 for (j = 0; j < SDDSin->array[i].elements; j++)
3925 dData = SDDSin->array[i].data;
3926 for (j = 0; j < SDDSin->array[i].elements; j++)
3930 fData = SDDSin->array[i].data;
3931 for (j = 0; j < SDDSin->array[i].elements; j++)
3954 c1 = *((
char *)data);
3955 *((
char *)data) = *(((
char *)data) + 1);
3956 *(((
char *)data) + 1) = c1;
3972 c1 = *((
char *)data);
3973 *((
char *)data) = *(((
char *)data) + 1);
3974 *(((
char *)data) + 1) = c1;
3992 for (i = 0, j = 3; i < 4; i++, j--)
3993 *(((
char *)data) + i) = *(((
char *)©) + j);
4011 for (i = 0, j = 3; i < 4; i++, j--)
4012 *(((
char *)data) + i) = *(((
char *)©) + j);
4030 for (i = 0, j = 7; i < 8; i++, j--)
4031 *(((
char *)data) + i) = *(((
char *)©) + j);
4049 for (i = 0, j = 7; i < 8; i++, j--)
4050 *(((
char *)data) + i) = *(((
char *)©) + j);
4068 for (i = 0, j = 3; i < 4; i++, j--)
4069 *(((
char *)data) + i) = *(((
char *)©) + j);
4087 for (i = 0, j = 7; i < 8; i++, j--)
4088 *(((
char *)data) + i) = *(((
char *)©) + j);
4107 if (LDBL_DIG == 18) {
4108 for (i = 0, j = 11; i < 12; i++, j--)
4109 *(((
char *)data) + i) = *(((
char *)©) + j);
4111 for (i = 0, j = 7; i < 8; i++, j--)
4112 *(((
char *)data) + i) = *(((
char *)©) + j);
4190 if (SDDS_dataset->layout.disconnected) {
4191 SDDS_SetError(
"Can't read page--file is disconnected (SDDS_ReadNonNativePageDetailed)");
4195 if (SDDS_dataset->layout.gzipFile) {
4196 if (!SDDS_dataset->layout.gzfp) {
4197 SDDS_SetError(
"Unable to read page--NULL file pointer (SDDS_ReadNonNativePageDetailed)");
4202 if (SDDS_dataset->layout.lzmaFile) {
4203 if (!SDDS_dataset->layout.lzmafp) {
4204 SDDS_SetError(
"Unable to read page--NULL file pointer (SDDS_ReadNonNativePageDetailed)");
4208 if (!SDDS_dataset->layout.fp) {
4209 SDDS_SetError(
"Unable to read page--NULL file pointer (SDDS_ReadNonNativePageDetailed)");
4216 if (SDDS_dataset->original_layout.data_mode.mode == SDDS_ASCII) {
4217 if ((retval =
SDDS_ReadAsciiPage(SDDS_dataset, sparse_interval, sparse_offset, 0)) < 1) {
4220 }
else if (SDDS_dataset->original_layout.data_mode.mode == SDDS_BINARY) {
4225 SDDS_SetError(
"Unable to read page--unrecognized data mode (SDDS_ReadNonNativePageDetailed)");
4253 if (SDDS_dataset->layout.disconnected) {
4254 SDDS_SetError(
"Can't read page--file is disconnected (SDDS_ReadNonNativePageLastRows)");
4258 if (SDDS_dataset->layout.gzipFile) {
4259 if (!SDDS_dataset->layout.gzfp) {
4260 SDDS_SetError(
"Unable to read page--NULL file pointer (SDDS_ReadNonNativePageLastRows)");
4265 if (SDDS_dataset->layout.lzmaFile) {
4266 if (!SDDS_dataset->layout.lzmafp) {
4267 SDDS_SetError(
"Unable to read page--NULL file pointer (SDDS_ReadNonNativePageLastRows)");
4271 if (!SDDS_dataset->layout.fp) {
4272 SDDS_SetError(
"Unable to read page--NULL file pointer (SDDS_ReadNonNativePageLastRows)");
4279 if (SDDS_dataset->original_layout.data_mode.mode == SDDS_ASCII) {
4283 }
else if (SDDS_dataset->original_layout.data_mode.mode == SDDS_BINARY) {
4288 SDDS_SetError(
"Unable to read page--unrecognized data mode (SDDS_ReadNonNativePageLastRows)");
4362 int32_t n_rows32 = 0;
4363 int64_t n_rows, j, k, alloc_rows, rows_to_store, mod;
4376 if (SDDS_dataset->layout.gzipFile) {
4377 gzfp = SDDS_dataset->layout.gzfp;
4380 if (SDDS_dataset->layout.lzmaFile) {
4381 lzmafp = SDDS_dataset->layout.lzmafp;
4383 fp = SDDS_dataset->layout.fp;
4388 fBuffer = &SDDS_dataset->fBuffer;
4389 if (!fBuffer->buffer) {
4390 int32_t bufferSize = SDDS_GetLockedDefaultIOBufferSize();
4391 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * bufferSize))) {
4392 SDDS_SetError(
"Unable to do buffered read--allocation failure");
4395 fBuffer->bufferSize = bufferSize;
4396 fBuffer->bytesLeft = 0;
4398 SDDS_dataset->rowcount_offset = -1;
4400 if (SDDS_dataset->layout.gzipFile) {
4401 if (!SDDS_GZipBufferedRead(&n_rows32,
sizeof(n_rows32), gzfp, &SDDS_dataset->fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
4403 return (SDDS_dataset->page_number = -1);
4404 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadNonNativeBinaryPage)");
4408 if (n_rows32 == INT32_MIN) {
4409 if (!SDDS_GZipBufferedRead(&n_rows,
sizeof(n_rows), gzfp, &SDDS_dataset->fBuffer,
SDDS_LONG64, SDDS_dataset->layout.byteOrderDeclared)) {
4411 return (SDDS_dataset->page_number = -1);
4412 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadNonNativeBinaryPage)");
4425 if (SDDS_dataset->layout.lzmaFile) {
4427 if (lzma_eof(lzmafp))
4428 return (SDDS_dataset->page_number = -1);
4429 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadNonNativeBinaryPage)");
4433 if (n_rows32 == INT32_MIN) {
4435 if (lzma_eof(lzmafp))
4436 return (SDDS_dataset->page_number = -1);
4437 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadNonNativeBinaryPage)");
4445 SDDS_dataset->rowcount_offset = ftell(fp);
4446 if (!
SDDS_BufferedRead(&n_rows32,
sizeof(n_rows32), fp, &SDDS_dataset->fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
4448 return (SDDS_dataset->page_number = -1);
4449 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadNonNativeBinaryPage)");
4453 if (n_rows32 == INT32_MIN) {
4456 return (SDDS_dataset->page_number = -1);
4457 SDDS_SetError(
"Unable to read page--failure reading number of rows (SDDS_ReadNonNativeBinaryPage)");
4469 SDDS_SetError(
"Unable to read page--negative number of rows (SDDS_ReadNonNativeBinaryPage)");
4475 if (SDDS_dataset->layout.data_mode.column_major) {
4476 sparse_interval = 1;
4481 sparse_interval = 1;
4482 sparse_offset = n_rows - last_rows;
4483 rows_to_store = last_rows + 2;
4484 alloc_rows = rows_to_store - SDDS_dataset->n_rows_allocated;
4486 if (sparse_interval <= 0)
4487 sparse_interval = 1;
4488 if (sparse_offset < 0)
4491 rows_to_store = (n_rows - sparse_offset) / sparse_interval + 2;
4492 alloc_rows = rows_to_store - SDDS_dataset->n_rows_allocated;
4494 SDDS_SetError(
"Unable to read page--couldn't start page (SDDS_ReadNonNativeBinaryPage)");
4500 SDDS_SetError(
"Unable to read page--parameter reading error (SDDS_ReadNonNativeBinaryPage)");
4506 SDDS_SetError(
"Unable to read page--array reading error (SDDS_ReadNonNativeBinaryPage)");
4509 if (SDDS_dataset->layout.data_mode.column_major) {
4510 SDDS_dataset->n_rows = n_rows;
4512 SDDS_SetError(
"Unable to read page--column reading error (SDDS_ReadNonNativeBinaryPage)");
4516 return (SDDS_dataset->page_number);
4518 if ((sparse_interval <= 1) && (sparse_offset == 0)) {
4519 for (j = 0; j < n_rows; j++) {
4521 SDDS_dataset->n_rows = j - 1;
4522 if (SDDS_dataset->autoRecover) {
4525 return (SDDS_dataset->page_number);
4527 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_ReadNonNativeBinaryPage)");
4532 SDDS_dataset->n_rows = j;
4534 return (SDDS_dataset->page_number);
4536 for (j = 0; j < sparse_offset; j++) {
4538 SDDS_dataset->n_rows = 0;
4539 if (SDDS_dataset->autoRecover) {
4542 return (SDDS_dataset->page_number);
4544 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_ReadNonNativeBinaryPage)");
4549 n_rows -= sparse_offset;
4550 for (j = k = 0; j < n_rows; j++) {
4552 SDDS_dataset->n_rows = k - 1;
4553 if (SDDS_dataset->autoRecover) {
4556 return (SDDS_dataset->page_number);
4558 SDDS_SetError(
"Unable to read page--error reading data row (SDDS_ReadNonNativeBinaryPage)");
4564 SDDS_dataset->n_rows = k;
4566 return (SDDS_dataset->page_number);
4596 char buffer[SDDS_MAXLINE];
4606 layout = &SDDS_dataset->layout;
4607 if (!layout->n_parameters)
4610 if (SDDS_dataset->layout.gzipFile) {
4611 gzfp = layout->gzfp;
4614 if (SDDS_dataset->layout.lzmaFile) {
4615 lzmafp = layout->lzmafp;
4622 fBuffer = &SDDS_dataset->fBuffer;
4623 for (i = 0; i < layout->n_parameters; i++) {
4624 if (layout->parameter_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
4626 if (layout->parameter_definition[i].fixed_value) {
4627 strcpy(buffer, layout->parameter_definition[i].fixed_value);
4628 if (!
SDDS_ScanData(buffer, layout->parameter_definition[i].type, 0, SDDS_dataset->parameter[i], 0, 1)) {
4629 SDDS_SetError(
"Unable to read page--parameter scanning error (SDDS_ReadNonNativeBinaryParameters)");
4632 }
else if (layout->parameter_definition[i].type ==
SDDS_STRING) {
4633 if (*(
char **)SDDS_dataset->parameter[i])
4634 free(*(
char **)SDDS_dataset->parameter[i]);
4636 if (SDDS_dataset->layout.gzipFile) {
4637 if (!(*((
char **)SDDS_dataset->parameter[i]) = SDDS_ReadNonNativeGZipBinaryString(gzfp, fBuffer, 0))) {
4638 SDDS_SetError(
"Unable to read parameters--failure reading string (SDDS_ReadNonNativeBinaryParameters)");
4643 if (SDDS_dataset->layout.lzmaFile) {
4645 SDDS_SetError(
"Unable to read parameters--failure reading string (SDDS_ReadNonNativeBinaryParameters)");
4650 SDDS_SetError(
"Unable to read parameters--failure reading string (SDDS_ReadNonNativeBinaryParameters)");
4659 if (SDDS_dataset->layout.gzipFile) {
4660 if (!SDDS_GZipBufferedRead(SDDS_dataset->parameter[i],
SDDS_type_size[layout->parameter_definition[i].type - 1], gzfp, fBuffer, layout->parameter_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
4661 SDDS_SetError(
"Unable to read parameters--failure reading value (SDDS_ReadNonNativeBinaryParameters)");
4666 if (SDDS_dataset->layout.lzmaFile) {
4667 if (!
SDDS_LZMABufferedRead(SDDS_dataset->parameter[i],
SDDS_type_size[layout->parameter_definition[i].type - 1], lzmafp, fBuffer, layout->parameter_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
4668 SDDS_SetError(
"Unable to read parameters--failure reading value (SDDS_ReadNonNativeBinaryParameters)");
4672 if (!
SDDS_BufferedRead(SDDS_dataset->parameter[i],
SDDS_type_size[layout->parameter_definition[i].type - 1], fp, fBuffer, layout->parameter_definition[i].type, SDDS_dataset->layout.byteOrderDeclared)) {
4673 SDDS_SetError(
"Unable to read parameters--failure reading value (SDDS_ReadNonNativeBinaryParameters)");
4723 layout = &SDDS_dataset->layout;
4724 if (!layout->n_arrays)
4727 if (SDDS_dataset->layout.gzipFile) {
4728 gzfp = layout->gzfp;
4731 if (SDDS_dataset->layout.lzmaFile) {
4732 lzmafp = layout->lzmafp;
4739 fBuffer = &SDDS_dataset->fBuffer;
4740 if (!SDDS_dataset->array) {
4741 SDDS_SetError(
"Unable to read array--pointer to structure storage area is NULL (SDDS_ReadNonNativeBinaryArrays)");
4744 for (i = 0; i < layout->n_arrays; i++) {
4745 array = SDDS_dataset->array + i;
4747 SDDS_SetError(
"Unable to get array--array definition corrupted (SDDS_ReadNonNativeBinaryArrays)");
4751 SDDS_SetError(
"Unable to read array--definition copy failed (SDDS_ReadNonNativeBinaryArrays)");
4755 if (!(array->dimension =
SDDS_Realloc(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions))) {
4756 SDDS_SetError(
"Unable to read array--allocation failure (SDDS_ReadNonNativeBinaryArrays)");
4760 if (SDDS_dataset->layout.gzipFile) {
4761 if (!SDDS_GZipBufferedRead(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions, gzfp, fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
4762 SDDS_SetError(
"Unable to read arrays--failure reading dimensions (SDDS_ReadNonNativeBinaryArrays)");
4767 if (SDDS_dataset->layout.lzmaFile) {
4768 if (!
SDDS_LZMABufferedRead(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions, lzmafp, fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
4769 SDDS_SetError(
"Unable to read arrays--failure reading dimensions (SDDS_ReadNonNativeBinaryArrays)");
4773 if (!
SDDS_BufferedRead(array->dimension,
sizeof(*array->dimension) * array->definition->dimensions, fp, fBuffer,
SDDS_LONG, SDDS_dataset->layout.byteOrderDeclared)) {
4774 SDDS_SetError(
"Unable to read arrays--failure reading dimensions (SDDS_ReadNonNativeBinaryArrays)");
4781 array->elements = 1;
4782 for (j = 0; j < array->definition->dimensions; j++) {
4784 array->elements *= array->dimension[j];
4788 array->data = array->pointer = NULL;
4789 if (array->elements == 0)
4791 if (array->elements < 0) {
4792 SDDS_SetError(
"Unable to read array--number of elements is negative (SDDS_ReadNonNativeBinaryArrays)");
4796 SDDS_SetError(
"Unable to read array--allocation failure (SDDS_ReadNonNativeBinaryArrays)");
4801 if (SDDS_dataset->layout.gzipFile) {
4802 for (j = 0; j < array->elements; j++) {
4803 if (!(((
char **)(array->data))[j] = SDDS_ReadNonNativeGZipBinaryString(gzfp, fBuffer, 0))) {
4804 SDDS_SetError(
"Unable to read arrays--failure reading string (SDDS_ReadNonNativeBinaryArrays)");
4810 if (SDDS_dataset->layout.lzmaFile) {
4811 for (j = 0; j < array->elements; j++) {
4813 SDDS_SetError(
"Unable to read arrays--failure reading string (SDDS_ReadNonNativeBinaryArrays)");
4818 for (j = 0; j < array->elements; j++) {
4820 SDDS_SetError(
"Unable to read arrays--failure reading string (SDDS_ReadNonNativeBinaryArrays)");
4830 if (SDDS_dataset->layout.gzipFile) {
4831 if (!SDDS_GZipBufferedRead(array->data,
SDDS_type_size[array->definition->type - 1] * array->elements, gzfp, fBuffer, array->definition->type, SDDS_dataset->layout.byteOrderDeclared)) {
4832 SDDS_SetError(
"Unable to read arrays--failure reading values (SDDS_ReadNonNativeBinaryArrays)");
4837 if (SDDS_dataset->layout.lzmaFile) {
4838 if (!
SDDS_LZMABufferedRead(array->data,
SDDS_type_size[array->definition->type - 1] * array->elements, lzmafp, fBuffer, array->definition->type, SDDS_dataset->layout.byteOrderDeclared)) {
4839 SDDS_SetError(
"Unable to read arrays--failure reading values (SDDS_ReadNonNativeBinaryArrays)");
4843 if (!
SDDS_BufferedRead(array->data,
SDDS_type_size[array->definition->type - 1] * array->elements, fp, fBuffer, array->definition->type, SDDS_dataset->layout.byteOrderDeclared)) {
4844 SDDS_SetError(
"Unable to read arrays--failure reading values (SDDS_ReadNonNativeBinaryArrays)");
4879 int64_t i, type, size;
4890 layout = &SDDS_dataset->layout;
4891 fBuffer = &SDDS_dataset->fBuffer;
4894 if (SDDS_dataset->layout.gzipFile) {
4895 gzfp = layout->gzfp;
4896 for (i = 0; i < layout->n_columns; i++) {
4897 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
4899 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
4901 if (((
char ***)SDDS_dataset->data)[i][row])
4902 free((((
char ***)SDDS_dataset->data)[i][row]));
4903 if (!(((
char ***)SDDS_dataset->data)[i][row] = SDDS_ReadNonNativeGZipBinaryString(gzfp, fBuffer, 0))) {
4904 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadNonNativeBinaryRow)");
4908 if (!SDDS_ReadNonNativeGZipBinaryString(gzfp, fBuffer, 1)) {
4909 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadNonNativeBinaryRow)");
4915 if (!SDDS_GZipBufferedRead(skip ? NULL : (
char *)SDDS_dataset->data[i] + row * size, size, gzfp, fBuffer, type, SDDS_dataset->layout.byteOrderDeclared)) {
4916 SDDS_SetError(
"Unable to read row--failure reading value (SDDS_ReadNonNativeBinaryRow)");
4923 if (SDDS_dataset->layout.lzmaFile) {
4924 lzmafp = layout->lzmafp;
4925 for (i = 0; i < layout->n_columns; i++) {
4926 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
4928 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
4930 if (((
char ***)SDDS_dataset->data)[i][row])
4931 free((((
char ***)SDDS_dataset->data)[i][row]));
4933 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadNonNativeBinaryRow)");
4938 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadNonNativeBinaryRow)");
4944 if (!
SDDS_LZMABufferedRead(skip ? NULL : (
char *)SDDS_dataset->data[i] + row * size, size, lzmafp, fBuffer, type, SDDS_dataset->layout.byteOrderDeclared)) {
4945 SDDS_SetError(
"Unable to read row--failure reading value (SDDS_ReadNonNativeBinaryRow)");
4952 for (i = 0; i < layout->n_columns; i++) {
4953 if (layout->column_definition[i].definition_mode & SDDS_WRITEONLY_DEFINITION)
4955 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
4957 if (((
char ***)SDDS_dataset->data)[i][row])
4958 free((((
char ***)SDDS_dataset->data)[i][row]));
4960 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadNonNativeBinaryRow)");
4965 SDDS_SetError(
"Unable to read rows--failure reading string (SDDS_ReadNonNativeBinaryRow)");
4971 if (!
SDDS_BufferedRead(skip ? NULL : (
char *)SDDS_dataset->data[i] + row * size, size, fp, fBuffer, type, SDDS_dataset->layout.byteOrderDeclared)) {
4972 SDDS_SetError(
"Unable to read row--failure reading value (SDDS_ReadNonNativeBinaryRow)");
5010 if (!(
string =
SDDS_Malloc(
sizeof(*
string) * (length + 1))))
5044 if (!(
string =
SDDS_Malloc(
sizeof(*
string) * (length + 1))))
5070char *SDDS_ReadNonNativeGZipBinaryString(gzFile gzfp,
SDDS_FILEBUFFER *fBuffer, int32_t skip) {
5074 if (!SDDS_GZipBufferedRead(&length,
sizeof(length), gzfp, fBuffer,
SDDS_LONG, 0))
5079 if (!(
string =
SDDS_Malloc(
sizeof(*
string) * (length + 1))))
5081 if (length && !SDDS_GZipBufferedRead(skip ? NULL :
string,
sizeof(*
string) * length, gzfp, fBuffer,
SDDS_STRING, 0))
5119 int64_t i, rows, fixed_rows;
5120 int32_t min32 = INT32_MIN, rows32;
5128 if (!(fp = SDDS_dataset->layout.fp)) {
5129 SDDS_SetError(
"Unable to write page--file pointer is NULL (SDDS_WriteNonNativeBinaryPage)");
5132 fBuffer = &SDDS_dataset->fBuffer;
5134 if (!fBuffer->buffer) {
5135 int32_t bufferSize = SDDS_GetLockedDefaultIOBufferSize();
5136 if (!(fBuffer->buffer = fBuffer->data =
SDDS_Malloc(
sizeof(
char) * bufferSize))) {
5137 SDDS_SetError(
"Unable to do buffered read--allocation failure (SDDS_WriteNonNativeBinaryPage)");
5140 fBuffer->bufferSize = bufferSize;
5141 fBuffer->bytesLeft = bufferSize;
5147 if (SDDS_dataset->layout.gzipFile) {
5148 if (!(gzfp = SDDS_dataset->layout.gzfp)) {
5149 SDDS_SetError(
"Unable to write page--file pointer is NULL (SDDS_WriteNonNativeBinaryPage)");
5152 SDDS_dataset->rowcount_offset = gztell(gzfp);
5153 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
5154 fixed_rows = ((rows / SDDS_dataset->layout.data_mode.fixed_row_increment) + 2) * SDDS_dataset->layout.data_mode.fixed_row_increment;
5155 if (fixed_rows > INT32_MAX) {
5156 if (!SDDS_GZipBufferedWrite(&min32,
sizeof(min32), gzfp, fBuffer)) {
5157 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5161 if (!SDDS_GZipBufferedWrite(&fixed_rows,
sizeof(fixed_rows), gzfp, fBuffer)) {
5162 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5167 rows32 = (int32_t)fixed_rows;
5169 if (!SDDS_GZipBufferedWrite(&rows32,
sizeof(rows32), gzfp, fBuffer)) {
5170 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5175 if (rows > INT32_MAX) {
5176 if (!SDDS_GZipBufferedWrite(&min32,
sizeof(min32), gzfp, fBuffer)) {
5177 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5181 if (!SDDS_GZipBufferedWrite(&rows,
sizeof(rows), gzfp, fBuffer)) {
5182 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5187 rows32 = (int32_t)rows;
5189 if (!SDDS_GZipBufferedWrite(&rows32,
sizeof(rows32), gzfp, fBuffer)) {
5190 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5197 if (SDDS_dataset->layout.lzmaFile) {
5198 if (!(lzmafp = SDDS_dataset->layout.lzmafp)) {
5199 SDDS_SetError(
"Unable to write page--file pointer is NULL (SDDS_WriteNonNativeBinaryPage)");
5202 SDDS_dataset->rowcount_offset = lzma_tell(lzmafp);
5203 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
5204 fixed_rows = ((rows / SDDS_dataset->layout.data_mode.fixed_row_increment) + 2) * SDDS_dataset->layout.data_mode.fixed_row_increment;
5205 if (fixed_rows > INT32_MAX) {
5207 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5212 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5217 rows32 = (int32_t)fixed_rows;
5220 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5225 if (rows > INT32_MAX) {
5227 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5232 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5237 rows32 = (int32_t)rows;
5240 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5246 SDDS_dataset->rowcount_offset = ftell(fp);
5247 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
5248 fixed_rows = ((rows / SDDS_dataset->layout.data_mode.fixed_row_increment) + 2) * SDDS_dataset->layout.data_mode.fixed_row_increment;
5249 if (fixed_rows > INT32_MAX) {
5251 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5256 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5261 rows32 = (int32_t)fixed_rows;
5264 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5269 if (rows > INT32_MAX) {
5271 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5276 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5281 rows32 = (int32_t)rows;
5284 SDDS_SetError(
"Unable to write page--failure writing number of rows (SDDS_WriteNonNativeBinaryPage)");
5294 SDDS_SetError(
"Unable to write page--parameter writing problem (SDDS_WriteNonNativeBinaryPage)");
5298 SDDS_SetError(
"Unable to write page--array writing problem (SDDS_WriteNonNativeBinaryPage)");
5302 if (SDDS_dataset->layout.n_columns) {
5303 if (SDDS_dataset->layout.data_mode.column_major) {
5305 SDDS_SetError(
"Unable to write page--column writing problem (SDDS_WriteNonNativeBinaryPage)");
5309 for (i = 0; i < SDDS_dataset->n_rows; i++) {
5310 if (SDDS_dataset->row_flag[i]) {
5312 SDDS_SetError(
"Unable to write page--row writing problem (SDDS_WriteNonNativeBinaryPage)");
5321 if (SDDS_dataset->layout.gzipFile) {
5322 if (!SDDS_GZipFlushBuffer(gzfp, fBuffer)) {
5323 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_WriteNonNativeBinaryPage)");
5328 if (SDDS_dataset->layout.lzmaFile) {
5330 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_WriteNonNativeBinaryPage)");
5335 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_WriteNonNativeBinaryPage)");
5342 SDDS_dataset->last_row_written = SDDS_dataset->n_rows - 1;
5343 SDDS_dataset->n_rows_written = rows;
5344 SDDS_dataset->writing_page = 1;
5384 layout = &SDDS_dataset->layout;
5385 fBuffer = &SDDS_dataset->fBuffer;
5387 if (SDDS_dataset->layout.gzipFile) {
5388 if (!(gzfp = layout->gzfp)) {
5389 SDDS_SetError(
"Unable to write parameters--file pointer is NULL (SDDS_WriteNonNativeBinaryParameters)");
5392 for (i = 0; i < layout->n_parameters; i++) {
5393 if (layout->parameter_definition[i].fixed_value)
5395 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
5396 if (!SDDS_GZipWriteNonNativeBinaryString(*((
char **)SDDS_dataset->parameter[i]), gzfp, fBuffer)) {
5397 SDDS_SetError(
"Unable to write parameters--failure writing string (SDDS_WriteNonNativeBinaryParameters)");
5401 }
else if (!SDDS_GZipBufferedWrite(SDDS_dataset->parameter[i],
SDDS_type_size[layout->parameter_definition[i].type - 1], gzfp, fBuffer)) {
5402 SDDS_SetError(
"Unable to write parameters--failure writing value (SDDS_WriteBinaryParameters)");
5409 if (SDDS_dataset->layout.lzmaFile) {
5410 if (!(lzmafp = layout->lzmafp)) {
5411 SDDS_SetError(
"Unable to write parameters--file pointer is NULL (SDDS_WriteNonNativeBinaryParameters)");
5414 for (i = 0; i < layout->n_parameters; i++) {
5415 if (layout->parameter_definition[i].fixed_value)
5417 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
5419 SDDS_SetError(
"Unable to write parameters--failure writing string (SDDS_WriteNonNativeBinaryParameters)");
5424 SDDS_SetError(
"Unable to write parameters--failure writing value (SDDS_WriteBinaryParameters)");
5431 for (i = 0; i < layout->n_parameters; i++) {
5432 if (layout->parameter_definition[i].fixed_value)
5434 if (layout->parameter_definition[i].type ==
SDDS_STRING) {
5436 SDDS_SetError(
"Unable to write parameters--failure writing string (SDDS_WriteNonNativeBinaryParameters)");
5441 SDDS_SetError(
"Unable to write parameters--failure writing value (SDDS_WriteBinaryParameters)");
5478 int32_t i, j, dimension, zero = 0;
5490 layout = &SDDS_dataset->layout;
5491 fBuffer = &SDDS_dataset->fBuffer;
5493 if (SDDS_dataset->layout.gzipFile) {
5494 gzfp = layout->gzfp;
5495 for (i = 0; i < layout->n_arrays; i++) {
5496 if (!SDDS_dataset->array[i].dimension) {
5497 for (j = 0; j < layout->array_definition[i].dimensions; j++)
5498 if (!SDDS_GZipBufferedWrite(&zero,
sizeof(zero), gzfp, fBuffer)) {
5499 SDDS_SetError(
"Unable to write null array--failure writing dimensions (SDDS_WriteNonNativeBinaryArrays)");
5506 for (j = 0; j < layout->array_definition[i].dimensions; j++) {
5507 dimension = SDDS_dataset->array[i].dimension[j];
5509 if (!SDDS_GZipBufferedWrite(&dimension,
sizeof(dimension), gzfp, fBuffer)) {
5510 SDDS_SetError(
"Unable to write arrays--failure writing dimensions (SDDS_WriteNonNativeBinaryArrays)");
5515 if (layout->array_definition[i].type ==
SDDS_STRING) {
5516 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
5517 if (!SDDS_GZipWriteNonNativeBinaryString(((
char **)SDDS_dataset->array[i].data)[j], gzfp, fBuffer)) {
5518 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteNonNativeBinaryArrays)");
5523 }
else if (!SDDS_GZipBufferedWrite(SDDS_dataset->array[i].data,
SDDS_type_size[layout->array_definition[i].type - 1] * SDDS_dataset->array[i].elements, gzfp, fBuffer)) {
5524 SDDS_SetError(
"Unable to write arrays--failure writing values (SDDS_WriteNonNativeBinaryArrays)");
5531 if (SDDS_dataset->layout.lzmaFile) {
5532 lzmafp = layout->lzmafp;
5533 for (i = 0; i < layout->n_arrays; i++) {
5534 if (!SDDS_dataset->array[i].dimension) {
5535 for (j = 0; j < layout->array_definition[i].dimensions; j++)
5537 SDDS_SetError(
"Unable to write null array--failure writing dimensions (SDDS_WriteNonNativeBinaryArrays)");
5544 for (j = 0; j < layout->array_definition[i].dimensions; j++) {
5545 dimension = SDDS_dataset->array[i].dimension[j];
5548 SDDS_SetError(
"Unable to write arrays--failure writing dimensions (SDDS_WriteNonNativeBinaryArrays)");
5553 if (layout->array_definition[i].type ==
SDDS_STRING) {
5554 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
5556 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteNonNativeBinaryArrays)");
5562 SDDS_SetError(
"Unable to write arrays--failure writing values (SDDS_WriteNonNativeBinaryArrays)");
5569 for (i = 0; i < layout->n_arrays; i++) {
5570 if (!SDDS_dataset->array[i].dimension) {
5571 for (j = 0; j < layout->array_definition[i].dimensions; j++)
5573 SDDS_SetError(
"Unable to write null array--failure writing dimensions (SDDS_WriteNonNativeBinaryArrays)");
5580 for (j = 0; j < layout->array_definition[i].dimensions; j++) {
5581 dimension = SDDS_dataset->array[i].dimension[j];
5584 SDDS_SetError(
"Unable to write arrays--failure writing dimensions (SDDS_WriteNonNativeBinaryArrays)");
5589 if (layout->array_definition[i].type ==
SDDS_STRING) {
5590 for (j = 0; j < SDDS_dataset->array[i].elements; j++) {
5592 SDDS_SetError(
"Unable to write arrays--failure writing string (SDDS_WriteNonNativeBinaryArrays)");
5597 }
else if (!
SDDS_BufferedWrite(SDDS_dataset->array[i].data,
SDDS_type_size[layout->array_definition[i].type - 1] * SDDS_dataset->array[i].elements, fp, fBuffer)) {
5598 SDDS_SetError(
"Unable to write arrays--failure writing values (SDDS_WriteNonNativeBinaryArrays)");
5633 int64_t i, type, size;
5644 layout = &SDDS_dataset->layout;
5645 fBuffer = &SDDS_dataset->fBuffer;
5647 if (SDDS_dataset->layout.gzipFile) {
5648 gzfp = layout->gzfp;
5649 for (i = 0; i < layout->n_columns; i++) {
5650 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
5651 if (!SDDS_GZipWriteNonNativeBinaryString(*((
char **)SDDS_dataset->data[i] + row), gzfp, fBuffer)) {
5652 SDDS_SetError(
"Unable to write rows--failure writing string (SDDS_WriteNonNativeBinaryRows)");
5657 if (!SDDS_GZipBufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, gzfp, fBuffer)) {
5658 SDDS_SetError(
"Unable to write row--failure writing value (SDDS_WriteNonNativeBinaryRow)");
5665 if (SDDS_dataset->layout.lzmaFile) {
5666 lzmafp = layout->lzmafp;
5667 for (i = 0; i < layout->n_columns; i++) {
5668 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
5670 SDDS_SetError(
"Unable to write rows--failure writing string (SDDS_WriteNonNativeBinaryRows)");
5676 SDDS_SetError(
"Unable to write row--failure writing value (SDDS_WriteNonNativeBinaryRow)");
5683 for (i = 0; i < layout->n_columns; i++) {
5684 if ((type = layout->column_definition[i].type) ==
SDDS_STRING) {
5686 SDDS_SetError(
"Unable to write rows--failure writing string (SDDS_WriteNonNativeBinaryRows)");
5691 if (!
SDDS_BufferedWrite((
char *)SDDS_dataset->data[i] + row * size, size, fp, fBuffer)) {
5692 SDDS_SetError(
"Unable to write row--failure writing value (SDDS_WriteNonNativeBinaryRow)");
5726 static const char dummy_string[] =
"";
5728 string = (
char *)dummy_string;
5729 length = strlen(
string);
5732 SDDS_SetError(
"Unable to write string--error writing length");
5737 SDDS_SetError(
"Unable to write string--error writing contents");
5765 static const char dummy_string[] =
"";
5767 string = (
char *)dummy_string;
5768 length = strlen(
string);
5771 SDDS_SetError(
"Unable to write string--error writing length");
5776 SDDS_SetError(
"Unable to write string--error writing contents");
5803int32_t SDDS_GZipWriteNonNativeBinaryString(
char *
string, gzFile gzfp,
SDDS_FILEBUFFER *fBuffer) {
5805 static const char dummy_string[] =
"";
5807 string = (
char *)dummy_string;
5808 length = strlen(
string);
5810 if (!SDDS_GZipBufferedWrite(&length,
sizeof(length), gzfp, fBuffer)) {
5811 SDDS_SetError(
"Unable to write string--error writing length");
5815 if (length && !SDDS_GZipBufferedWrite(
string,
sizeof(*
string) * length, gzfp, fBuffer)) {
5816 SDDS_SetError(
"Unable to write string--error writing contents");
5846 int32_t code, min32 = INT32_MIN, rows32;
5847 int64_t i, rows, offset, fixed_rows;
5853 if (SDDS_dataset->layout.gzipFile) {
5854 SDDS_SetError(
"Unable to perform page updates on a gzip file (SDDS_UpdateNonNativeBinaryPage)");
5858 if (SDDS_dataset->layout.lzmaFile) {
5859 SDDS_SetError(
"Unable to perform page updates on .lzma or .xz files (SDDS_UpdateNonNativeBinaryPage)");
5862 if (SDDS_dataset->layout.data_mode.column_major) {
5863 SDDS_SetError(
"Unable to perform page updates on a column major order file (SDDS_UpdateNonNativeBinaryPage)");
5866 if (!SDDS_dataset->writing_page) {
5868 fprintf(stderr,
"Page not being written---calling SDDS_UpdateNonNativeBinaryPage\n");
5873 if (mode & FLUSH_TABLE) {
5876 SDDS_dataset->last_row_written = -1;
5877 SDDS_dataset->n_rows = 0;
5882 if (!(fp = SDDS_dataset->layout.fp)) {
5883 SDDS_SetError(
"Unable to update page--file pointer is NULL (SDDS_UpdateNonNativeBinaryPage)");
5886 fBuffer = &SDDS_dataset->fBuffer;
5888 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_UpdateNonNativeBinaryPage)");
5895 fprintf(stderr,
"%" PRId64
" rows stored in table, %" PRId32
" already written\n", rows, SDDS_dataset->n_rows_written);
5897 if (rows == SDDS_dataset->n_rows_written) {
5900 if (rows < SDDS_dataset->n_rows_written) {
5901 SDDS_SetError(
"Unable to update page--new number of rows less than previous number (SDDS_UpdateNonNativeBinaryPage)");
5905 if ((!SDDS_dataset->layout.data_mode.fixed_row_count) || (((rows + rows - SDDS_dataset->n_rows_written) / SDDS_dataset->layout.data_mode.fixed_row_increment) != (rows / SDDS_dataset->layout.data_mode.fixed_row_increment))) {
5906 if (
SDDS_fseek(fp, SDDS_dataset->rowcount_offset, 0) == -1) {
5907 SDDS_SetError(
"Unable to update page--failure doing fseek (SDDS_UpdateNonNativeBinaryPage)");
5910 if (SDDS_dataset->layout.data_mode.fixed_row_count) {
5911 if ((rows - SDDS_dataset->n_rows_written) + 1 > SDDS_dataset->layout.data_mode.fixed_row_increment) {
5912 SDDS_dataset->layout.data_mode.fixed_row_increment = (rows - SDDS_dataset->n_rows_written) + 1;
5914 fixed_rows = ((rows / SDDS_dataset->layout.data_mode.fixed_row_increment) + 2) * SDDS_dataset->layout.data_mode.fixed_row_increment;
5916 fprintf(stderr,
"Setting %" PRId64
" fixed rows\n", fixed_rows);
5918 if ((fixed_rows > INT32_MAX) && (SDDS_dataset->n_rows_written <= INT32_MAX)) {
5919 SDDS_SetError(
"Unable to update page--crossed the INT32_MAX row boundary (SDDS_UpdateNonNativeBinaryPage)");
5922 if (fixed_rows > INT32_MAX) {
5923 if (fwrite(&min32,
sizeof(min32), 1, fp) != 1) {
5924 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateBinaryPage)");
5928 if (fwrite(&fixed_rows,
sizeof(fixed_rows), 1, fp) != 1) {
5929 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateNonNativeBinaryPage)");
5934 rows32 = (int32_t)fixed_rows;
5936 if (fwrite(&rows32,
sizeof(rows32), 1, fp) != 1) {
5937 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateNonNativeBinaryPage)");
5943 fprintf(stderr,
"Setting %" PRId64
" rows\n", rows);
5945 if ((rows > INT32_MAX) && (SDDS_dataset->n_rows_written <= INT32_MAX)) {
5946 SDDS_SetError(
"Unable to update page--crossed the INT32_MAX row boundary (SDDS_UpdateNonNativeBinaryPage)");
5949 if (rows > INT32_MAX) {
5950 if (fwrite(&min32,
sizeof(min32), 1, fp) != 1) {
5951 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateBinaryPage)");
5955 if (fwrite(&rows,
sizeof(rows), 1, fp) != 1) {
5956 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateNonNativeBinaryPage)");
5961 rows32 = (int32_t)rows;
5963 if (fwrite(&rows32,
sizeof(rows32), 1, fp) != 1) {
5964 SDDS_SetError(
"Unable to update page--failure writing number of rows (SDDS_UpdateNonNativeBinaryPage)");
5970 SDDS_SetError(
"Unable to update page--failure doing fseek to end of page (SDDS_UpdateNonNativeBinaryPage)");
5975 for (i = SDDS_dataset->last_row_written + 1; i < SDDS_dataset->n_rows; i++) {
5977 SDDS_SetError(
"Unable to update page--failure writing row (SDDS_UpdateNonNativeBinaryPage)");
5983 fprintf(stderr,
"Flushing buffer\n");
5986 SDDS_SetError(
"Unable to write page--buffer flushing problem (SDDS_UpdateNonNativeBinaryPage)");
5989 SDDS_dataset->last_row_written = SDDS_dataset->n_rows - 1;
5990 SDDS_dataset->n_rows_written = rows;
5991 if (mode & FLUSH_TABLE) {
5993 SDDS_dataset->first_row_in_mem = rows;
5994 SDDS_dataset->last_row_written = -1;
5995 SDDS_dataset->n_rows = 0;
6022 unsigned char d[8] = {0};
6025 if (byteOrder == SDDS_BIGENDIAN_SEEN) {
6029 for (i = 0; i < 6; i++) {
6031 x[0 + i] = x[11 - i];
6036 exponent = (((x[9] << 8) | x[8]) & 0x7FFF);
6038 ((uint64_t)x[7] << 56) | ((uint64_t)x[6] << 48) | ((uint64_t)x[5] << 40) | ((uint64_t)x[4] << 32) |
6039 ((uint64_t)x[3] << 24) | ((uint64_t)x[2] << 16) | ((uint64_t)x[1] << 8) | (uint64_t)x[0];
6043 if ((exponent == 0x7FFF) || (exponent == 0)) {
6045 if (exponent == 0x7FFF) {
6051 memcpy(&result, d, 8);
6056 exponent = exponent - 0x3FFF + 0x03FF;
6058 if (exponent <= -52)
6060 memcpy(&result, d, 8);
6062 }
else if (exponent < 0) {
6064 }
else if (exponent >= 0x7FF)
6069 memcpy(&result, d, 8);
6073 d[7] |= (exponent & 0x7F0) >> 4;
6074 d[6] |= (exponent & 0xF) << 4;
6083 mantissa >>= (-exponent + 1);
6086 d[0] = mantissa & 0xFF;
6087 d[1] = (mantissa >> 8) & 0xFF;
6088 d[2] = (mantissa >> 16) & 0xFF;
6089 d[3] = (mantissa >> 24) & 0xFF;
6090 d[4] = (mantissa >> 32) & 0xFF;
6091 d[5] = (mantissa >> 40) & 0xFF;
6092 d[6] |= (mantissa >> 48) & 0x0F;
6094 memcpy(&result, d, 8);
6096 if (byteOrder == SDDS_BIGENDIAN_SEEN) {
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_ReadAsciiPageLastRows(SDDS_DATASET *SDDS_dataset, int64_t last_rows)
Reads the last specified number of rows from an ASCII page of an SDDS dataset.
int32_t SDDS_ScanData(char *string, int32_t type, int32_t field_length, void *data, int64_t index, int32_t is_parameter)
Scans a string and saves the parsed value into a data pointer according to the specified data type.
int32_t SDDS_ReadAsciiPage(SDDS_DATASET *SDDS_dataset, int64_t sparse_interval, int64_t sparse_offset, int32_t sparse_statistics)
Reads the next SDDS ASCII page into memory with optional data sparsity and statistics.
void SDDS_SwapLongDouble(long double *data)
Swaps the endianness of a long double.
int32_t SDDS_SwapEndsColumnData(SDDS_DATASET *SDDSin)
Swaps the endianness of the column data in an SDDS dataset.
int32_t SDDS_ReadNewBinaryRows(SDDS_DATASET *SDDS_dataset)
Reads new binary rows from the SDDS dataset.
int32_t SDDS_ReadNonNativeBinaryPage(SDDS_DATASET *SDDS_dataset, int64_t sparse_interval, int64_t sparse_offset)
Reads a non-native endian binary page from an SDDS dataset.
char * SDDS_ReadNonNativeLZMABinaryString(struct lzmafile *lzmafp, SDDS_FILEBUFFER *fBuffer, int32_t skip)
Reads a non-native endian binary string from an LZMA-compressed file.
int32_t SDDS_SetDefaultIOBufferSize(int32_t newValue)
int32_t SDDS_WriteNonNativeBinaryPage(SDDS_DATASET *SDDS_dataset)
Writes a non-native endian binary page to an SDDS dataset.
int32_t SDDS_WriteNonNativeBinaryRow(SDDS_DATASET *SDDS_dataset, int64_t row)
Writes a non-native endian binary row to an SDDS dataset.
int32_t SDDS_ReadNonNativeBinaryPageDetailed(SDDS_DATASET *SDDS_dataset, int64_t sparse_interval, int64_t sparse_offset, int64_t last_rows)
Reads a detailed non-native endian binary page from an SDDS dataset.
void SDDS_SwapLong64(int64_t *data)
Swaps the endianness of a 64-bit integer.
int32_t SDDS_ReadNonNativePage(SDDS_DATASET *SDDS_dataset)
Reads a non-native endian page from an SDDS dataset.
int32_t SDDS_UpdateNonNativeBinaryPage(SDDS_DATASET *SDDS_dataset, uint32_t mode)
Updates a non-native endian binary page in an SDDS dataset.
int32_t SDDS_WriteBinaryColumns(SDDS_DATASET *SDDS_dataset)
Writes the binary columns of an SDDS dataset to the associated file.
int32_t SDDS_LZMABufferedRead(void *target, int64_t targetSize, struct lzmafile *lzmafp, SDDS_FILEBUFFER *fBuffer, int32_t type, int32_t byteOrder)
int32_t SDDS_WriteBinaryRow(SDDS_DATASET *SDDS_dataset, int64_t row)
Writes a single binary row of an SDDS dataset to the associated file.
int32_t SDDS_WriteBinaryArrays(SDDS_DATASET *SDDS_dataset)
Writes the binary arrays of the SDDS dataset to a file.
int32_t SDDS_ReadBinaryColumns(SDDS_DATASET *SDDS_dataset, int64_t sparse_interval, int64_t sparse_offset)
Reads the binary columns from an SDDS dataset.
int32_t SDDS_ReadBinaryRow(SDDS_DATASET *SDDS_dataset, int64_t row, int32_t skip)
Reads a binary row from the specified SDDS dataset.
int32_t SDDS_WriteNonNativeBinaryString(char *string, FILE *fp, SDDS_FILEBUFFER *fBuffer)
Writes a non-native endian binary string to a file.
int32_t SDDS_WriteNonNativeBinaryArrays(SDDS_DATASET *SDDS_dataset)
Writes non-native endian binary arrays to an SDDS dataset.
void SDDS_SwapULong64(uint64_t *data)
Swaps the endianness of a 64-bit unsigned integer.
int32_t SDDS_ReadNonNativeBinaryPageLastRows(SDDS_DATASET *SDDS_dataset, int64_t last_rows)
Reads the last few rows from a non-native endian binary page in an SDDS dataset.
char * SDDS_ReadBinaryString(FILE *fp, SDDS_FILEBUFFER *fBuffer, int32_t skip)
Reads a binary string from a file with buffering.
int32_t SDDS_BufferedWrite(void *target, int64_t targetSize, FILE *fp, SDDS_FILEBUFFER *fBuffer)
void SDDS_SwapULong(uint32_t *data)
Swaps the endianness of a 32-bit unsigned integer.
int32_t SDDS_LZMAWriteBinaryString(char *string, struct lzmafile *lzmafp, SDDS_FILEBUFFER *fBuffer)
Writes a binary string to a file with LZMA compression.
int32_t SDDS_WriteBinaryString(char *string, FILE *fp, SDDS_FILEBUFFER *fBuffer)
Writes a binary string to a file with buffering.
void SDDS_SwapUShort(unsigned short *data)
Swaps the endianness of an unsigned short integer.
int32_t SDDS_ReadNonNativePageSparse(SDDS_DATASET *SDDS_dataset, uint32_t mode, int64_t sparse_interval, int64_t sparse_offset)
Reads a sparse non-native endian page from an SDDS dataset.
int32_t SDDS_ReadBinaryPageDetailed(SDDS_DATASET *SDDS_dataset, int64_t sparse_interval, int64_t sparse_offset, int64_t last_rows, int32_t sparse_statistics)
Reads a binary page from an SDDS dataset with detailed options.
int32_t SDDS_BufferedRead(void *target, int64_t targetSize, FILE *fp, SDDS_FILEBUFFER *fBuffer, int32_t type, int32_t byteOrder)
int32_t SDDS_UpdateBinaryPage(SDDS_DATASET *SDDS_dataset, uint32_t mode)
Updates the binary page of an SDDS dataset.
int32_t SDDS_ReadNonNativeBinaryColumns(SDDS_DATASET *SDDS_dataset)
Reads the non-native endian binary columns from an SDDS dataset.
void SDDS_SetReadRecoveryMode(SDDS_DATASET *SDDS_dataset, int32_t mode)
Sets the read recovery mode for an SDDS dataset.
int32_t SDDS_SetBufferedRead(int32_t dummy)
Obsolete routine retained for backward compatibility.
int32_t SDDS_ReadRecoveryPossible(SDDS_DATASET *SDDS_dataset)
Checks if any data in an SDDS page was recovered after an error was detected.
double makeFloat64FromFloat80(unsigned char x[16], int32_t byteOrder)
Converts a 16-byte array representing a float80 value to a double.
int32_t SDDS_FlushBuffer(FILE *fp, SDDS_FILEBUFFER *fBuffer)
int32_t SDDS_ReadNonNativeBinaryRow(SDDS_DATASET *SDDS_dataset, int64_t row, int32_t skip)
Reads a non-native endian binary row from an SDDS dataset.
int32_t SDDS_WriteBinaryParameters(SDDS_DATASET *SDDS_dataset)
Writes the binary parameters of the SDDS dataset.
int32_t SDDS_SwapEndsArrayData(SDDS_DATASET *SDDSin)
Swaps the endianness of the array data in an SDDS dataset.
int32_t SDDS_ReadNonNativePageLastRows(SDDS_DATASET *SDDS_dataset, int64_t last_rows)
Reads the last few rows from a non-native endian page in an SDDS dataset.
int32_t SDDS_ReadBinaryPage(SDDS_DATASET *SDDS_dataset, int64_t sparse_interval, int64_t sparse_offset, int32_t sparse_statistics)
Reads a binary page from an SDDS dataset.
int32_t SDDS_SwapEndsParameterData(SDDS_DATASET *SDDSin)
Swaps the endianness of the parameter data in an SDDS dataset.
int32_t SDDS_ReadNonNativeBinaryParameters(SDDS_DATASET *SDDS_dataset)
Reads non-native endian binary parameters from an SDDS dataset.
void SDDS_SwapLong(int32_t *data)
Swaps the endianness of a 32-bit integer.
int32_t SDDS_ReadNonNativeBinaryArrays(SDDS_DATASET *SDDS_dataset)
Reads non-native endian binary arrays from an SDDS dataset.
void SDDS_SwapDouble(double *data)
Swaps the endianness of a double.
int32_t SDDS_WriteBinaryPage(SDDS_DATASET *SDDS_dataset)
int32_t SDDS_fseek(FILE *fp, int64_t offset, int32_t dir)
Sets the file position indicator for a given file stream with retry logic.
int32_t SDDS_WriteNonNativeBinaryColumns(SDDS_DATASET *SDDS_dataset)
Writes non-native endian binary columns of an SDDS dataset to the associated file.
int32_t SDDS_WriteNonNativeBinaryParameters(SDDS_DATASET *SDDS_dataset)
Writes non-native endian binary parameters to an SDDS dataset.
void SDDS_SwapShort(short *data)
Swaps the endianness of a short integer.
int32_t SDDS_lzmaseek(struct lzmafile *lzmafp, int64_t offset, int32_t dir)
Sets the file position indicator for a given LZMA file stream with retry logic.
char * SDDS_ReadNonNativeBinaryString(FILE *fp, SDDS_FILEBUFFER *fBuffer, int32_t skip)
Reads a non-native endian binary string from a file.
int32_t SDDS_ReadNonNativePageDetailed(SDDS_DATASET *SDDS_dataset, uint32_t mode, int64_t sparse_interval, int64_t sparse_offset, int64_t last_rows)
Reads a detailed non-native endian page from an SDDS dataset.
int32_t SDDS_LZMAFlushBuffer(struct lzmafile *lzmafp, SDDS_FILEBUFFER *fBuffer)
void SDDS_SwapFloat(float *data)
Swaps the endianness of a float.
int32_t SDDS_ReadBinaryArrays(SDDS_DATASET *SDDS_dataset)
Reads binary arrays from an SDDS dataset.
int32_t SDDS_LZMABufferedWrite(void *target, int64_t targetSize, struct lzmafile *lzmafp, SDDS_FILEBUFFER *fBuffer)
int32_t SDDS_LZMAWriteNonNativeBinaryString(char *string, struct lzmafile *lzmafp, SDDS_FILEBUFFER *fBuffer)
Writes a non-native endian binary string to an LZMA-compressed file.
int32_t SDDS_ReadBinaryPageLastRows(SDDS_DATASET *SDDS_dataset, int64_t last_rows)
Reads the last specified number of rows from a binary page of an SDDS dataset.
char * SDDS_ReadLZMABinaryString(struct lzmafile *lzmafp, SDDS_FILEBUFFER *fBuffer, int32_t skip)
Reads a binary string from an LZMA-compressed file with buffering.
int32_t SDDS_ReadBinaryParameters(SDDS_DATASET *SDDS_dataset)
Reads binary parameters from the specified SDDS dataset.
int32_t SDDS_type_size[SDDS_NUM_TYPES]
Array of sizes for each supported data type.
int32_t SDDS_LengthenTable(SDDS_DATASET *SDDS_dataset, int64_t n_additional_rows)
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
Internal definitions and function declarations for SDDS with LZMA support.
void SDDS_SetError(char *error_text)
Records an error message in the SDDS error stack.
int32_t SDDS_FreeArrayDefinition(ARRAY_DEFINITION *source)
Frees memory allocated for an array definition.
int32_t SDDS_CheckDataset(SDDS_DATASET *SDDS_dataset, const char *caller)
Validates the SDDS dataset pointer.
void * SDDS_Malloc(size_t size)
Allocates memory of a specified size.
void SDDS_ClearErrors()
Clears all recorded error messages from the SDDS error stack.
ARRAY_DEFINITION * SDDS_CopyArrayDefinition(ARRAY_DEFINITION **target, ARRAY_DEFINITION *source)
Creates a copy of an array definition.
int32_t SDDS_IsBigEndianMachine()
Determines whether the current machine uses big-endian byte ordering.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
#define SDDS_ULONG
Identifier for the unsigned 32-bit integer data type.
#define SDDS_FLOAT
Identifier for the float data type.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_ULONG64
Identifier for the unsigned 64-bit integer data type.
#define SDDS_FLOATING_TYPE(type)
Checks if the given type identifier corresponds to a floating-point type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_SHORT
Identifier for the signed short integer data type.
#define SDDS_CHARACTER
Identifier for the character data type.
#define SDDS_USHORT
Identifier for the unsigned short integer data type.
#define SDDS_DOUBLE
Identifier for the double data type.
#define SDDS_LONGDOUBLE
Identifier for the long double data type.
#define SDDS_LONG64
Identifier for the signed 64-bit integer data type.
double max_in_array(double *array, long n)
Finds the maximum value in an array of doubles.
double min_in_array(double *array, long n)
Finds the minimum value in an array of doubles.