[postgis-commits] svn - r3869 - spike/wktraster/rt_pg

postgis-commits at postgis.refractions.net postgis-commits at postgis.refractions.net
Sat Mar 14 19:48:20 PDT 2009


Author: mloskot
Date: 2009-03-14 19:48:19 -0700 (Sat, 14 Mar 2009)
New Revision: 3869

Modified:
   spike/wktraster/rt_pg/rtpostgis.sql.in.c
Log:
Implemented basic version of AddRasterColumn function.

Modified: spike/wktraster/rt_pg/rtpostgis.sql.in.c
===================================================================
--- spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-03-13 13:11:50 UTC (rev 3868)
+++ spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-03-15 02:48:19 UTC (rev 3869)
@@ -335,16 +335,16 @@
     r_table_schema varchar(256) not null,
     r_table_name varchar(256) not null,
     r_column varchar(256) not null,
+    out_db boolean not null,
     srid integer not null,
+    pixel_types varchar[] not null,
+    nodata_values double precision[],
     pixelsize_x double precision,
     pixelsize_y double precision,
     blocksize_x double precision,
     blocksize_y double precision,
-    pixel_types varchar[] not null,
-    nodata_values double precision[] not null,
     regular_blocking integer,
     extent GEOMETRY,
-    out_db integer,
 
     CONSTRAINT raster_columns_pk primary key ( 
 		r_table_catalog, 
@@ -354,36 +354,216 @@
 ) WITH OIDS;
 
 
--------------------------------------------------------------------
+-------------------------------------------------------------------------------
 -- ADDRASTERCOLUMN
--------------------------------------------------------------------
+--      <catalog> <schema> <table> <column> <srid>
+--      <pixel_types> <nodata_values>
+--      <out_db> <regular_blocking>
+--      <pixelsize_x> <pixelsize_y>
+--      <blocksize_x> <blocksize_y>
+--      <extent>
+-------------------------------------------------------------------------------
+-- 
+-- TODO: to be documented
+-- 
+-------------------------------------------------------------------------------
 
-CREATEFUNCTION AddRasterColumn(varchar, varchar, varchar, varchar, integer)
-    RETURNS text
-    AS 
+CREATEFUNCTION AddRasterColumn(
+    varchar, varchar, varchar, varchar, -- catalog, schema, table, column
+    integer,             -- srid
+    varchar[],           -- pixel_types
+    double precision[],  -- nodata_values
+    boolean,             -- out_db
+    boolean,             -- regular_blocking
+    double precision,    -- pixelsize_x
+    double precision,    -- pixelsize_y
+    integer,             -- blocksize_x
+    integer,             -- blocksize_y
+    geometry)            -- extent
+
+    RETURNS text AS 
 $$
 DECLARE
-	catalog_name alias for $1;
-	schema_name alias for $2;
-	table_name alias for $3;
-	column_name alias for $4;
-	new_srid alias for $5;
 
+    -- Function arguments
+	p_catalog_name ALIAS FOR $1;
+	p_schema_name ALIAS FOR $2;
+	p_table_name ALIAS FOR $3;
+	p_column_name ALIAS FOR $4;
+	p_srid ALIAS FOR $5;
+    p_pixel_types ALIAS FOR $6;
+    p_nodata_values ALIAS FOR $7;
+    p_out_db ALIAS FOR $8;
+    p_regular_blocking ALIAS FOR $9;
+    p_pixelsize_x ALIAS FOR $10;
+    p_pixelsize_y ALIAS FOR $11;
+    p_blocksize_x ALIAS FOR $12;
+    p_blocksize_y ALIAS FOR $13;
+    p_extent ALIAS FOR $14;
+
+    -- Local helpers
+
+    pixel_types varchar[];
+	srid_into varchar;
+    pixel_types_found integer = 0;
+	real_schema name;
+	sql text;
+
 BEGIN
+    
+    RAISE DEBUG 'Parameters: catalog=%, schema=%, table=%, column=%, srid=%, pixel_types=%, nodata_values=%, out_db=%, regular_blocking=%, pixelsize_x=%, pixelsize_y=%, blocksize_x=%, blocksize_y=%',
+                 p_catalog_name, p_schema_name, p_table_name, p_column_name,
+                 p_srid, p_pixel_types, p_nodata_values, p_out_db, p_regular_blocking,
+                 p_pixelsize_x, p_pixelsize_y, p_blocksize_x, p_blocksize_y;
 
-    RAISE NOTICE 'TODO: TO BE IMPLEMENTED';
+    -- Verify SRID
+	IF ( (p_srid != 0) AND (p_srid != -1) ) THEN
+		SELECT SRID INTO srid_into FROM spatial_ref_sys WHERE SRID = p_srid;
+		IF NOT FOUND THEN
+			RAISE EXCEPTION 'Invalid SRID';
+			RETURN 'fail';
+		END IF;
+	END IF;
 
-    RETURN schema_name || '.' || table_name || '.' || column_name ||' NOT added.';
+    -- Verify PIXEL TYPE
+    -- TODO: If only PostgreSQL 8.2+ supported, use @> operator instead of brute-force lookup
+    --       SELECT p_pixel_types <@ pixel_types INTO pixel_types_found_into; -- boolean
+    pixel_types := ARRAY['1BB','2BUI','4BUI','8BSI','8BUI','16BSI','16BUI','32BSI','32BUI','16BF','32BF','64BF'];
 
+    FOR npti IN array_lower(p_pixel_types,1) .. array_upper(p_pixel_types,1) LOOP
+
+        pixel_types_found := 0;
+        FOR pti IN array_lower(pixel_types,1) .. array_upper(pixel_types,1) LOOP
+            IF p_pixel_types[npti] = pixel_types[pti] THEN
+                pixel_types_found := 1;
+                RAISE DEBUG 'Identified pixel type %', p_pixel_types[npti];
+            END IF;
+        END LOOP;
+
+        IF pixel_types_found = 0 THEN
+			RAISE EXCEPTION 'Invalid pixel type % - valid ones are %', p_pixel_types[npti], pixel_types;
+			RETURN 'fail';
+        END IF;
+    END LOOP;
+
+    -- Verify SCHEMA
+    IF ( p_schema_name IS NOT NULL AND p_schema_name != '' ) THEN
+		sql := 'SELECT nspname FROM pg_namespace ' ||
+			'WHERE text(nspname) = ' || quote_literal(p_schema_name) ||
+			'LIMIT 1';
+		RAISE DEBUG '%', sql;
+		EXECUTE sql INTO real_schema;
+
+		IF ( real_schema IS NULL ) THEN
+			RAISE EXCEPTION 'Schema % is not a valid schemaname', quote_literal(p_schema_name);
+			RETURN 'fail';
+		END IF;
+	END IF;
+	
+	IF ( real_schema IS NULL ) THEN
+		RAISE DEBUG 'Detecting schema';
+		sql := 'SELECT n.nspname AS schemaname ' ||
+			'FROM pg_catalog.pg_class c ' ||
+			  'JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace ' ||
+			'WHERE c.relkind = ' || quote_literal('r') ||
+			' AND n.nspname NOT IN (' || quote_literal('pg_catalog') || ', ' || quote_literal('pg_toast') || ')' ||
+			' AND pg_catalog.pg_table_is_visible(c.oid)' ||
+			' AND c.relname = ' || quote_literal(p_table_name);
+		RAISE DEBUG '%', sql;
+		EXECUTE sql INTO real_schema;
+
+		IF ( real_schema IS NULL ) THEN
+			RAISE EXCEPTION 'Table % does not occur in the search_path', quote_literal(p_table_name);
+			RETURN 'fail';
+		END IF;
+	END IF;
+
+	-- Add raster column to target table
+	sql := 'ALTER TABLE ' ||
+		quote_ident(real_schema) || '.' || quote_ident(p_table_name)
+		|| ' ADD COLUMN ' || quote_ident(p_column_name) ||
+		' raster ';
+	RAISE DEBUG '%', sql;
+	EXECUTE sql;
+
+	-- Delete stale record in RASTER_COLUMNS (if any)
+	sql := 'DELETE FROM raster_columns ' ||
+        ' WHERE r_table_catalog = ' || quote_literal('') ||
+		' AND r_table_schema = ' || quote_literal(real_schema) ||
+		' AND r_table_name = ' || quote_literal(p_table_name) ||
+		' AND r_column = ' || quote_literal(p_column_name);
+	RAISE DEBUG '%', sql;
+	EXECUTE sql;
+
+	-- Add record in RASTER_COLUMNS
+	sql := 'INSERT INTO raster_columns ' ||
+        ' (r_table_catalog, r_table_schema, r_table_name, r_column, out_db, srid, pixel_types) ' ||
+		' VALUES (' ||
+		quote_literal('') || ',' ||
+		quote_literal(real_schema) || ',' ||
+		quote_literal(p_table_name) || ',' ||
+		quote_literal(p_column_name) || ',' ||
+		p_out_db::text || ',' ||
+		p_srid::text || ',' ||
+        quote_literal(p_pixel_types::text) || ')';
+	RAISE DEBUG '%', sql;
+	EXECUTE sql;
+
+    RAISE NOTICE 'TODO: Constraints not implemented';
+
+    RETURN p_schema_name || '.' || p_table_name || '.' || p_column_name
+        || ' SRID:' || p_srid::text
+        || ' pixel_types:' || p_pixel_types::text
+        || ' nodata_values:' || p_nodata_values::text
+        || ' out_db:' || p_out_db::text
+        || ' regular_blocking:' || p_regular_blocking::text
+        || ' pixelsize_x:' || p_pixelsize_x::text
+        || ' pixelsize_y:' || p_pixelsize_y::text
+        || ' blocksize_x:' || p_blocksize_x::text
+        || ' blocksize_y:' || p_blocksize_y;
+        -- TODO: Add extent field
+
 END;
 $$
 LANGUAGE 'plpgsql' _VOLATILE_STRICT; -- WITH (isstrict);
 
+-------------------------------------------------------------------------------
+-- ADDRASTERCOLUMN
+--      <schema> <table> <column> <srid>
+--      <pixel_types> <nodata_values>
+-------------------------------------------------------------------------------
+--
+-- This is a wrapper to the real AddRasterColumn, for use
+-- when catalogue is undefined
+--
+-- TODO: To be documented
+-- 
+-------------------------------------------------------------------------------
 
--------------------------------------------------------------------
+CREATEFUNCTION AddRasterColumn(varchar, varchar, varchar, integer,
+                               varchar[], double precision[])
+RETURNS text AS $$ 
+
+DECLARE
+	ret text;
+BEGIN
+    --SELECT AddRasterColumn('',$1,$2,$3,$4,$5,$6,'f','f',0,0,0,0, 'POINT(0 0)'::geometry) into ret;
+	--RETURN ret;
+    RAISE NOTICE 'TODO: not implemented';
+    RETURN 'fail';
+END;
+$$
+LANGUAGE 'plpgsql' _STABLE_STRICT; -- WITH (isstrict);
+
+
+-------------------------------------------------------------------------------
 -- DROPRASTERCOLUMN
--------------------------------------------------------------------
-
+--      <catalog> <schema> <table> <column>
+-------------------------------------------------------------------------------
+-- 
+-- TODO: to be implemented, to be documented
+-- 
+-------------------------------------------------------------------------------
 CREATEFUNCTION DropRasterColumn(varchar, varchar, varchar, varchar)
     RETURNS text
     AS 



More information about the postgis-commits mailing list