#include "util.h"
#include "osl_core.h"
-/* Taken from Drepper: How to write shared libraries, Appendix B. */
+/*
+ * Taken from Drepper: How to write shared libraries, Appendix B.
+ *
+ * The main reason for this rather fancy implementation of strerror() is to
+ * avoid having an array of pointers. This is desirable because initialized
+ * pointer variables increase the startup time of the library due to the
+ * processing of relocations.
+ */
#include <stddef.h>
#define MSGSTRFIELD(line) MSGSTRFIELD1(line)
#define MSGSTRFIELD1(line) str##line
ret = -E_OSL_BAD_STORAGE_FLAGS;
if (st == OSL_DISK_STORAGE && sf & OSL_RBTREE)
goto err;
+ if ((sf & OSL_RBTREE) && !(sf & OSL_UNIQUE))
+ WARNING_LOG("invalid storage flags for column %s: "
+ "OSL_RBTREE && !OSL_UNIQUE\n", cd->name);
ret = -E_OSL_BAD_STORAGE_SIZE;
if (sf & OSL_FIXED_SIZE && !cd->data_size)
goto err;
}
remove_rb_node(t, col_num, r);
if (cd->storage_type == OSL_NO_STORAGE) { /* TODO: If fixed size, reuse object? */
- free(r->volatile_objects[col->volatile_num].data);
+ if (!(cd->storage_flags & OSL_DONT_FREE))
+ free(r->volatile_objects[col->volatile_num].data);
r->volatile_objects[col->volatile_num] = *obj;
} else if (cd->storage_type == OSL_DISK_STORAGE) {
char *ds_name;
unsigned num_rows;
int ret;
+ *result = NULL;
if (n == 0)
return -E_OSL_RB_KEY_NOT_FOUND;
ret = osl_get_num_rows(t, &num_rows);