Changeset: a823bd637db2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a823bd637db2
Modified Files:
        monetdb5/modules/mal/tablet.c
Branch: directappend
Log Message:

Implement dedicated string column converter


diffs (116 lines):

diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -676,6 +676,7 @@ typedef struct {
        LoadOps *loadops;
        struct scratch_buffer scratch;
        struct scratch_buffer primary;
+       struct scratch_buffer secondary;
 } READERtask;
 
 static void
@@ -1029,6 +1030,59 @@ SQLworker_fixedwidth_column(READERtask *
 }
 
 static int
+SQLworker_str_column(READERtask *task, int col)
+{
+       Column *c = &task->as->format[col];
+       int count = task->top[task->cur];
+
+       int type = c->adt;
+       size_t width = ATOMsize(type);
+       size_t primary_size = count * width;
+
+       size_t secondary_size = 0;
+       for (int i = 0; i < count; i++) {
+               size_t max_field_size = c->nil_len;
+               char *s = task->fields[col][i];
+               if (s) {
+                       max_field_size += strlen(s) + 1;
+               }
+               secondary_size += max_field_size;
+       }
+
+       if (adjust_scratch_buffer(&task->primary, primary_size, 0) == NULL) {
+               tablet_error(task, lng_nil, lng_nil, int_nil, "cannot allocate 
memory", "");
+               return -1;
+       }
+       if (adjust_scratch_buffer(&task->secondary, secondary_size, 0) == NULL) 
{
+               tablet_error(task, lng_nil, lng_nil, int_nil, "cannot allocate 
memory", "");
+               return -1;
+       }
+
+       char **p = task->primary.data;
+       void *s = task->secondary.data;
+       void *s_end = (char*)s + task->secondary.len;
+       for (int i = 0; i < count; i++) {
+               assert(s <= s_end);
+               size_t len = (char*)s_end - (char*)s;
+               void *orig = s;
+               if (SQLconvert_val(task, col, i, &s, &len) < 0)
+                       return -1;
+               assert(s == orig); (void)orig;
+               *p++ = s;
+               s = (char*)s + strlen(s) + 1;
+       }
+
+       // Now insert it.
+       str msg = task->loadops->append_batch(task->loadops->state, 
task->primary.data, count, width, c->appendcol);
+       if (msg != MAL_SUCCEED) {
+               tablet_error(task, lng_nil, lng_nil, col, "bulk insert failed", 
msg);
+               return -1;
+       }
+
+       return 0;
+}
+
+static int
 SQLworker_bat_column(READERtask *task, int col)
 {
        Column *c = &task->as->format[col];
@@ -1075,9 +1129,8 @@ SQLworker_column(READERtask *task, int c
                return SQLworker_bat_column(task, col);
 
        switch (fmt->adt) {
-               // future work:
-               // case TYPE_str:
-               //      return SQLworker_str_column(task, fmt);
+               case TYPE_str:
+                       return SQLworker_str_column(task, col);
                default:
                        if (ATOMvarsized(fmt->adt))
                                return SQLworker_onebyone_column(task, col);
@@ -1694,7 +1747,7 @@ SQLload_file(Client cntxt, Tablet *as, b
        lng tio, t1 = 0;
        char name[MT_NAME_LEN];
 
-       // threads = 1;
+       threads = 1;
 
 /*     TRC_DEBUG(MAL_SERVER, "Prepare copy work for '%d' threads col '%s' rec 
'%s' quot '%c'\n", threads, csep, rsep, quote);*/
 
@@ -1840,6 +1893,7 @@ SQLload_file(Client cntxt, Tablet *as, b
                }
                initialize_scratch_buffer(&ptask[j].scratch);
                initialize_scratch_buffer(&ptask[j].primary);
+               initialize_scratch_buffer(&ptask[j].secondary);
        }
        if (threads == 0) {
                /* no threads started */
@@ -2104,6 +2158,7 @@ SQLload_file(Client cntxt, Tablet *as, b
        for (int t = 0; t < threads; t++) {
                destroy_scratch_buffer(&ptask[t].scratch);
                destroy_scratch_buffer(&ptask[t].primary);
+               destroy_scratch_buffer(&ptask[t].secondary);
        }
 #ifdef MLOCK_TST
        munlockall();
@@ -2128,6 +2183,7 @@ SQLload_file(Client cntxt, Tablet *as, b
        for (int t = 0; t < threads; t++) {
                destroy_scratch_buffer(&ptask[t].scratch);
                destroy_scratch_buffer(&ptask[t].primary);
+               destroy_scratch_buffer(&ptask[t].secondary);
        }
 #ifdef MLOCK_TST
        munlockall();
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to