ret = osl_add_row(table, objs);
if (ret < 0)
return ret;
- } else { /* get id of the dummy row and increment it */
+ } else {
+ /* check if name already exists */
struct osl_row *row;
- struct osl_object obj = {.data = "", .size = 1};
+ struct osl_object obj = {.data = name, .size = name_len};
+ ret = osl_get_row(table, BLOBCOL_NAME, &obj, &row);
+ if (ret < 0 && ret != -E_RB_KEY_NOT_FOUND)
+ return ret;
+ if (ret >= 0) { /* we already have a blob with this name */
+ obj.data = name + name_len;
+ obj.size = query->size - name_len;
+ return osl_update_object(table, row, BLOBCOL_DEF, &obj);
+ }
+ /* new blob, get id of the dummy row and increment it */
+ obj.data = "";
+ obj.size = 1;
ret = osl_get_row(table, BLOBCOL_NAME, &obj, &row);
if (ret < 0)
return ret;
return blob_get_name_by_id(table_name ## _table, id, name); \
}
-static int blob_get_name_and_def_by_row(struct osl_table *table, struct osl_row *row,
- char **name, struct osl_object *def)
+static int blob_get_name_and_def_by_row(struct osl_table *table,
+ const struct osl_row *row, char **name, struct osl_object *def)
{
struct osl_object obj;
int ret = osl_get_object(table, row, BLOBCOL_NAME, &obj);
}
/** Define the \p get_name_and_def_by_row function for this blob type. */
#define DEFINE_GET_NAME_AND_DEF_BY_ROW(table_name, cmd_prefix) \
- int cmd_prefix ## _get_name_and_def_by_row(struct osl_row *row, \
+ int cmd_prefix ## _get_name_and_def_by_row(const struct osl_row *row, \
char **name, struct osl_object *def) \
{ \
return blob_get_name_and_def_by_row(table_name ## _table, \
int ret;
desc->dir = db;
ti->desc = desc;
- ret = osl_open_table(ti->desc, &ti->table);
- if (ret >= 0) {
- *table = ti->table;
+ ret = osl_open_table(ti->desc, table);
+ if (ret >= 0)
return ret;
- }
*table = NULL;
return ret == -E_NOENT? 1 : ret;
}