Changeset: 6991eda27da9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6991eda27da9
Modified Files:
        sql/backends/monet5/vaults/parquet/parquet.c
        sql/backends/monet5/vaults/parquet/parquet.h
        sql/server/rel_file_loader.h
Branch: parquet
Log Message:

first check if the file exists

First we have to check ourselves if the file exists. We cannot rely on parquet 
to do it. Because if the parquet library tries to read it, and the file doesn't 
exists, it segfaults.


diffs (135 lines):

diff --git a/sql/backends/monet5/vaults/parquet/parquet.c 
b/sql/backends/monet5/vaults/parquet/parquet.c
--- a/sql/backends/monet5/vaults/parquet/parquet.c
+++ b/sql/backends/monet5/vaults/parquet/parquet.c
@@ -13,30 +13,32 @@
 #include "mal_parser.h"
 #include "mal_builder.h"
 #include "mal_namespace.h"
+#include "mal_exception.h"
 #include "mal_debugger.h"
 #include "mal_linker.h"
 #include "mal_utils.h"
 #include "sql_types.h"
 
+#include <unistd.h>
+
 static parquet_file *
 parquet_open_file(char* filename)
 {
     GParquetArrowFileReader *reader;
-    GError *g_error;
-    char* error = NULL;
-
-    reader = gparquet_arrow_file_reader_new_path(filename, &g_error);
-
-    if(!reader) {
-        reader = NULL;
-        error = g_error->message;
-    }
+    GError *g_error = NULL;
 
     parquet_file *file = GDKmalloc(sizeof(parquet_file));
 
+    if (access(filename, F_OK) != 0) {
+      reader = NULL;
+    } 
+    else {
+      reader = gparquet_arrow_file_reader_new_path(filename, &g_error);
+    }
+
     file->filename = filename;
     file->reader = reader;
-    file->error = error;
+    file->error = g_error;
 
     return file;
 }
@@ -161,38 +163,33 @@ static char* parquet_type_map(GArrowType
     return "not implemented";
 }
 
-static int
+static str
 parquet_add_types(mvc *sql, sql_subfunc *f, char *filename)
 {
-       (void)f;
-       (void)filename;
+  parquet_file *file = parquet_open_file(filename);
 
-    parquet_file *file = parquet_open_file(filename);
-
-       if(file->error) {
-               //return file->error;
-               return -1;
+       if(file->reader == NULL) {
+    throw(SQL, SQLSTATE(42000), "parquet" RUNTIME_FILE_NOT_FOUND);
        }
 
-    GError *table_error;
-    GArrowTable *table = gparquet_arrow_file_reader_read_table(file->reader, 
&table_error);
+  GError *table_error;
+  GArrowTable *table = gparquet_arrow_file_reader_read_table(file->reader, 
&table_error);
 
-    if(table_error) {
-        printf("%s", table_error->message);
-        return -1;
-    }
+  if(table_error) {
+    throw(SQL, SQLSTATE(42000), "parquet" RUNTIME_LOAD_ERROR); // TODO: 
different error.
+  }
 
-    guint n_columns = garrow_table_get_n_columns(table);
+  guint n_columns = garrow_table_get_n_columns(table);
 
-    list *types = sa_list(sql->sa);
+  list *types = sa_list(sql->sa);
 
-    for(int col = 0; col < (int)n_columns; col++) {
-        GArrowChunkedArray *array = garrow_table_get_column_data(table, col);
-        GArrowType type = garrow_chunked_array_get_value_type(array);
-        char* st = parquet_type_map(type);
+  for(int col = 0; col < (int)n_columns; col++) {
+      GArrowChunkedArray *array = garrow_table_get_column_data(table, col);
+      GArrowType type = garrow_chunked_array_get_value_type(array);
+      char* st = parquet_type_map(type);
 
-        printf("%s", st);
-    }
+      printf("%s", st);
+  }
 
        // for each parquet column
        //      get type from parquet column
@@ -207,7 +204,7 @@ parquet_add_types(mvc *sql, sql_subfunc 
 
        /* close file */
        GDKfree(file);
-       return 0;
+       return "";
 }
 
 static int
diff --git a/sql/backends/monet5/vaults/parquet/parquet.h 
b/sql/backends/monet5/vaults/parquet/parquet.h
--- a/sql/backends/monet5/vaults/parquet/parquet.h
+++ b/sql/backends/monet5/vaults/parquet/parquet.h
@@ -6,7 +6,7 @@
 typedef struct parquet_file {
     char* filename;
     GParquetArrowFileReader *reader;
-    char* error;
+    GError* error;
 } parquet_file;
 
 
diff --git a/sql/server/rel_file_loader.h b/sql/server/rel_file_loader.h
--- a/sql/server/rel_file_loader.h
+++ b/sql/server/rel_file_loader.h
@@ -13,7 +13,7 @@
 #include "sql_mvc.h"
 
 /* TODO think of set of file names */
-typedef int (*fl_add_types_fptr)(mvc *sql, sql_subfunc *f, char *filename);
+typedef str (*fl_add_types_fptr)(mvc *sql, sql_subfunc *f, char *filename);
 typedef int (*fl_load_fptr)(mvc *sql, sql_subfunc *f, char *filename);
 
 typedef struct file_loader_t {
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to