Skip duplicate series
authorJeroen van der Heijden <jeroen@transceptor.technology>
Mon, 19 Oct 2020 14:17:02 +0000 (16:17 +0200)
committerJeroen van der Heijden <jeroen@transceptor.technology>
Mon, 19 Oct 2020 14:17:02 +0000 (16:17 +0200)
include/siri/version.h
src/siri/db/buffer.c
src/siri/db/series.c

index 375840789204286ac0ea5456be6e3c83d0e68de4..d2f3a2aa93892a2b769d84e01f60a636cb6949db 100644 (file)
@@ -15,7 +15,7 @@
  * Note that debian alpha packages should use versions like this:
  *   2.0.34-0alpha0
  */
-#define SIRIDB_VERSION_PRE_RELEASE "-alpha-0"
+#define SIRIDB_VERSION_PRE_RELEASE "-alpha-1"
 
 #ifndef NDEBUG
 #define SIRIDB_VERSION_BUILD_RELEASE "+debug"
index 6a317173c85ac7afca0daca518e194d17f4a9d52..67d405ed31c28083dc1520819ad030daf2d11abf 100644 (file)
@@ -341,6 +341,12 @@ int siridb_buffer_load(siridb_t * siridb)
             {
                 continue;
             }
+            else if (series->tp == TP_STRING)
+            {
+                log_error("Unexpected buffer found for string series '%s'",
+                        series->name);
+                continue;
+            }
 
             series->buffer = siridb_points_new(max_len, series->tp);
             if (series->buffer == NULL)
index d659347228f9236a5e3da6655f157427e6a1c4db..f4f5b355fc0850fe25da24566500d0d264bf3052 100644 (file)
@@ -1590,12 +1590,44 @@ static int SERIES_load(siridb_t * siridb, imap_t * dropped)
                     series_tp,
                     siridb->server->pool,
                     (const char *) qp_series_name.via.raw);
+
             if (series != NULL)
             {
                 /* add series to c-tree */
-                if (ct_add(siridb->series, series->name, series) ||
-                    imap_add(siridb->series_map, series->id, series))
+                int rc = ct_add(siridb->series, series->name, series);
+
+                if (rc == CT_EXISTS)
+                {
+                    /* Duplicate series found */
+                    siridb_series_t * other = ct_get(
+                            siridb->series,
+                            series->name);
+
+                    log_error(
+                            "Series '%s' with ID %"PRIu32" has a duplicate "
+                            "ID %"PRIu32", "
+                            "(SiriDB will keep the highest ID)",
+                            series->name,
+                            series->id,
+                            other->id);
+
+                    if (other->id >= series->id)
+                    {
+                        siridb__series_free(series);
+                        continue;
+                    }
+
+                    (void) ct_pop(siridb->series, series->name);
+                    (void) imap_pop(siridb->series_map, other->id);
+
+                    siridb__series_free(other);
+
+                    rc = ct_add(siridb->series, series->name, series);
+                }
+
+                if(rc || imap_add(siridb->series_map, series->id, series))
                 {
+                    log_critical("series cannot be added");
                     return -1;
                 }
             }