[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