| 
					
				 | 
			
			
				@@ -0,0 +1,56 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CREATE TABLE IF NOT EXISTS measure_settings ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    id SERIAL PRIMARY KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parameter_name VARCHAR(50) NOT NULL UNIQUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    min_value NUMERIC NOT NULL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    max_value NUMERIC NOT NULL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    unit VARCHAR(20) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+INSERT INTO measure_settings (parameter_name, min_value, max_value, unit) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+VALUES  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+('temperature', -58, 58, '°C'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+('pressure', 500, 900, 'mmHg'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+('wind_direction', 0, 59, 'degrees'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CREATE TYPE measurement_data AS ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    temperature NUMERIC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    pressure NUMERIC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wind_direction NUMERIC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CREATE OR REPLACE FUNCTION validate_measurement( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    input_temperature NUMERIC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    input_pressure NUMERIC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    input_wind_direction NUMERIC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+) RETURNS measurement_data AS $$ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+DECLARE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    validated_data measurement_data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+BEGIN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    IF input_temperature < (SELECT min_value FROM measure_settings WHERE parameter_name = 'temperature') OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       input_temperature > (SELECT max_value FROM measure_settings WHERE parameter_name = 'temperature') THEN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RAISE EXCEPTION 'Temperature out of range. Allowed range: % to % °C', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (SELECT min_value FROM measure_settings WHERE parameter_name = 'temperature'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (SELECT max_value FROM measure_settings WHERE parameter_name = 'temperature'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    END IF; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    IF input_pressure < (SELECT min_value FROM measure_settings WHERE parameter_name = 'pressure') OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       input_pressure > (SELECT max_value FROM measure_settings WHERE parameter_name = 'pressure') THEN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RAISE EXCEPTION 'Pressure out of range. Allowed range: % to % mmHg', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (SELECT min_value FROM measure_settings WHERE parameter_name = 'pressure'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (SELECT max_value FROM measure_settings WHERE parameter_name = 'pressure'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    END IF; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    IF input_wind_direction < (SELECT min_value FROM measure_settings WHERE parameter_name = 'wind_direction') OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       input_wind_direction > (SELECT max_value FROM measure_settings WHERE parameter_name = 'wind_direction') THEN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RAISE EXCEPTION 'Wind direction out of range. Allowed range: % to % degrees', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (SELECT min_value FROM measure_settings WHERE parameter_name = 'wind_direction'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (SELECT max_value FROM measure_settings WHERE parameter_name = 'wind_direction'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    END IF; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    validated_data.temperature := input_temperature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    validated_data.pressure := input_pressure; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    validated_data.wind_direction := input_wind_direction; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RETURN validated_data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+END; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$$ LANGUAGE plpgsql; 
			 |