From 045ca0bf1475396d16c6e581047e2c0307b8e8bb Mon Sep 17 00:00:00 2001
From: Riccardo Boero <ribo@nilu.no>
Date: Thu, 11 Apr 2024 09:48:59 +0200
Subject: [PATCH] Pumped up size and duration parameters of MySQL queries.

---
 src/FACT_air.jl            | 17 +++++++++++++---
 src/FACT_bldgs.jl          | 17 ++++++++++++++--
 src/FACT_jobs.jl           | 40 +++++++++++++++++++++++++++++++++-----
 src/FACT_mine.jl           | 21 ++++++++++++++------
 src/FACT_population.jl     | 40 +++++++++++++++++++++++++++++++++-----
 src/FACT_ports.jl          | 25 +++++++++++++++++++++---
 src/FACT_power.jl          | 17 ++++++++++++++--
 src/FACT_rail.jl           | 34 ++++++++++++++++++++++++++++----
 src/utils_DB_connection.jl | 27 +++++++++++++++++++++++++
 9 files changed, 208 insertions(+), 30 deletions(-)

diff --git a/src/FACT_air.jl b/src/FACT_air.jl
index 5263424..108447f 100644
--- a/src/FACT_air.jl
+++ b/src/FACT_air.jl
@@ -32,7 +32,13 @@ function eu_air(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         # Check if the result is empty
@@ -72,7 +78,6 @@ This function queries a database for air traffic information, such as the number
 This example queries air traffic data for specified U.S. regions and returns the results in a DataFrame.
 """
 function us_air(conn_dict::Dict, selection::Dict)
-    
     # getting valuable info from dictionary: acceptable years are 1961, 71, 81, 91, 2001, 2011
     geo_id = selection["geo_id"]
     shape_obj = selection["shape_obj"]
@@ -85,7 +90,13 @@ function us_air(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         # Check if the result is empty
diff --git a/src/FACT_bldgs.jl b/src/FACT_bldgs.jl
index ae8ad28..6b76ac0 100644
--- a/src/FACT_bldgs.jl
+++ b/src/FACT_bldgs.jl
@@ -34,8 +34,21 @@ function footprint_avg_height(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
-        result2 = query_connection(conn, query2)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
+        # execute
+        result2 = DataFrame()
+        try
+            # Execute session variable adjustments
+            result2 = query_connection(conn, query2)
+        catch ex
+            @error "Failed to set session variables for query $query2 with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         # execute
diff --git a/src/FACT_jobs.jl b/src/FACT_jobs.jl
index 91be5cf..070dd5e 100644
--- a/src/FACT_jobs.jl
+++ b/src/FACT_jobs.jl
@@ -37,7 +37,13 @@ function us_lodes(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         long_df = stack(result, names(result), variable_name=:industry, value_name=:jobs)
@@ -103,7 +109,13 @@ function us_qcew(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         # Check if the 'industry' column exists
@@ -148,7 +160,13 @@ function eu_lfs(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         if !("industry" in names(result))
@@ -192,7 +210,13 @@ function eu_sbs(conn_dict::Dict, selection::Dict)
             # create connection
             conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
             # execute
-            result = query_connection(conn, query)
+            result = DataFrame()
+            try
+                # Execute session variable adjustments
+                result = query_connection(conn, query)
+            catch ex
+                @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+            end
             # close connection
             close_connection(conn)
             if !("industry" in names(result))
@@ -236,7 +260,13 @@ function eu_rea(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         if !("industry" in names(result))
diff --git a/src/FACT_mine.jl b/src/FACT_mine.jl
index 795e447..64ee8f4 100644
--- a/src/FACT_mine.jl
+++ b/src/FACT_mine.jl
@@ -21,9 +21,6 @@ This example retrieves geology data for two geographic areas in the "US" region
 
 """
 function geology_full(conn_dict::Dict, selection::Dict)
-    # temporarily increase max_allowed_packet
-    size_query = "SET GLOBAL max_allowed_packet=1073741824;" #Sets max_allowed_packet to 1GB
-    
     # getting valuable info from dictionary
     geo_id = selection["geo_id"]
     shape_obj = selection["shape_obj"]
@@ -66,8 +63,13 @@ function geology_full(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        DBInterface.execute(conn, size_query)
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         # Check if the result is empty
@@ -123,7 +125,14 @@ function minerals_full(conn_dict::Dict, selection::Dict)
         for table in tables
             # prepare query
             query = "SELECT SUM(ST_Area(ST_Intersection(SHAPE, ST_GeomFromText('$shape')))) / $ar AS $table FROM $table WHERE ST_Intersects(SHAPE, ST_GeomFromText('$shape'));"
-            result2 = query_connection(conn, query)
+            # execute
+            result2 = DataFrame()
+            try
+                # Execute session variable adjustments
+                result2 = query_connection(conn, query)
+            catch ex
+                @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+            end
             result = hcat(result, result2)
         end
         # close connection
diff --git a/src/FACT_population.jl b/src/FACT_population.jl
index dc45a05..554b5a0 100644
--- a/src/FACT_population.jl
+++ b/src/FACT_population.jl
@@ -34,7 +34,13 @@ function eu_lau(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         # Check if the result is empty
@@ -86,7 +92,13 @@ function eu_nuts(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         # Check if the result is empty
@@ -143,7 +155,13 @@ function us_block(conn_dict::Dict, selection::Dict)
             # create connection
             conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
             # execute
-            result = query_connection(conn, query)
+            result = DataFrame()
+            try
+                # Execute session variable adjustments
+                result = query_connection(conn, query)
+            catch ex
+                @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+            end
             # close connection
             close_connection(conn)
             # Check if the result is empty
@@ -164,7 +182,13 @@ function us_block(conn_dict::Dict, selection::Dict)
             # create connection
             conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
             # execute
-            result = query_connection(conn, query)
+            result = DataFrame()
+            try
+                # Execute session variable adjustments
+                result = query_connection(conn, query)
+            catch ex
+                @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+            end
             # close connection
             close_connection(conn)
             # Check if the result is empty
@@ -217,7 +241,13 @@ function us_county(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         # Check if the result is empty
diff --git a/src/FACT_ports.jl b/src/FACT_ports.jl
index 0e30d5c..a39d569 100644
--- a/src/FACT_ports.jl
+++ b/src/FACT_ports.jl
@@ -33,8 +33,21 @@ function eu_ports(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
-        result2 = query_connection(conn, query2)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
+        # execute
+        result2 = DataFrame()
+        try
+            # Execute session variable adjustments
+            result2 = query_connection(conn, query2)
+        catch ex
+            @error "Failed to set session variables for query $query2 with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         result = hcat(result, result2)
@@ -87,7 +100,13 @@ function us_ports(conn_dict::Dict, selection::Dict)
             # create connection
             conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
             # execute
-            result = query_connection(conn, query)
+            result = DataFrame()
+            try
+                # Execute session variable adjustments
+                result = query_connection(conn, query)
+            catch ex
+                @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+            end
             # close connection
             close_connection(conn)
             # Check if the result is empty
diff --git a/src/FACT_power.jl b/src/FACT_power.jl
index f6d169d..ad2ef75 100644
--- a/src/FACT_power.jl
+++ b/src/FACT_power.jl
@@ -89,8 +89,21 @@ function us_power(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
-        result2 = query_connection(conn, query2)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
+        # execute
+        result2 = DataFrame()
+        try
+            # Execute session variable adjustments
+            result2 = query_connection(conn, query2)
+        catch ex
+            @error "Failed to set session variables for query $query2 with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         result = hcat(result, result2)
diff --git a/src/FACT_rail.jl b/src/FACT_rail.jl
index 2c615ac..2138048 100644
--- a/src/FACT_rail.jl
+++ b/src/FACT_rail.jl
@@ -33,8 +33,21 @@ function eu_rail(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
-        result2 = query_connection(conn, query2)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
+        # execute
+        result2 = DataFrame()
+        try
+            # Execute session variable adjustments
+            result2 = query_connection(conn, query2)
+        catch ex
+            @error "Failed to set session variables for query $query2 with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         result = hcat(result, result2)
@@ -88,8 +101,21 @@ function us_rail(conn_dict::Dict, selection::Dict)
         # create connection
         conn = establish_connection(conn_dict["host"], conn_dict["user"], conn_dict["password"], conn_dict["database"]; port=conn_dict["port"])
         # execute
-        result = query_connection(conn, query)
-        result2 = query_connection(conn, query2)
+        result = DataFrame()
+        try
+            # Execute session variable adjustments
+            result = query_connection(conn, query)
+        catch ex
+            @error "Failed to set session variables for query $query with expection " exception=(ex, catch_backtrace())
+        end
+        # execute
+        result2 = DataFrame()
+        try
+            # Execute session variable adjustments
+            result2 = query_connection(conn, query2)
+        catch ex
+            @error "Failed to set session variables for query $query2 with expection " exception=(ex, catch_backtrace())
+        end
         # close connection
         close_connection(conn)
         result = hcat(result, result2)
diff --git a/src/utils_DB_connection.jl b/src/utils_DB_connection.jl
index 58d0e12..d951005 100644
--- a/src/utils_DB_connection.jl
+++ b/src/utils_DB_connection.jl
@@ -14,7 +14,33 @@ Establish a connection to a MySQL/MariaDB database.
 - `MySQL.Connection`: A connection object to the database.
 """
 function establish_connection(host::String, user::String, password::String, dbname::String; port::Int=3306)
+    # Establish connection
     conn = MySQL.Connection(host, user, password, dbname, port, "nothing")
+    # Temporarily increase max_allowed_packet
+    size_query = "SET SESSION max_allowed_packet=1073741824;"  # Sets max_allowed_packet to 1GB
+    timeout_query = "SET SESSION wait_timeout = 31536000;"     # Sets wait_timeout to 1 year
+    maxtime_query = "SET SESSION max_execution_time = 604800000;"  # Sets max_execution_time to 1 week
+    try
+        # Execute session variable adjustments
+        DBInterface.execute(conn, size_query)
+    catch ex
+        @error "Failed to set session variables for query $size_query with expection " exception=(ex, catch_backtrace())
+        # Handle error, possibly rethrow or clean up
+    end
+    try
+        # Execute session variable adjustments
+        DBInterface.execute(conn, timeout_query)
+    catch ex
+        @error "Failed to set session variables for query $timeout_query with expection " exception=(ex, catch_backtrace())
+        # Handle error, possibly rethrow or clean up
+    end
+    try
+        # Execute session variable adjustments
+        DBInterface.execute(conn, maxtime_query)
+    catch ex
+        @error "Failed to set session variables for query $maxtime_query with expection " exception=(ex, catch_backtrace())
+        # Handle error, possibly rethrow or clean up
+    end
     return conn
 end
 
@@ -39,6 +65,7 @@ Each column in the DataFrame is of type `String`.
 - It converts all columns in the query result to `String` to avoid type interpretation issues.
 """
 function query_connection(conn::MySQL.Connection, query::String)
+    #println("Executing query: ", query)
     cursor = DBInterface.execute(conn, query)
     cursor.types = [String for _ in cursor.types]
     rows = Tables.rows(cursor)
-- 
GitLab