prototyp/prototyp.sql
author František Kučera <franta-hg@frantovo.cz>
Mon, 01 Sep 2014 15:56:05 +0200
changeset 3 2cd2860c8fb3
parent 2 e4e0975dbe85
child 4 b0bbfff8eca1
permissions -rw-r--r--
prototyp: user groups
     1 -- CREATE SCHEMA unix_sql_api;
     2 
     3 SET search_path TO unix_sql_api;
     4 
     5 
     6 -- fstab: --------------------------------------------------------------------
     7 
     8 DROP VIEW IF EXISTS fstab;
     9 DROP FUNCTION IF EXISTS fstab();
    10 DROP TYPE IF EXISTS unix_sql_api_fstab;
    11 
    12 CREATE TYPE unix_sql_api_fstab AS (
    13 	device VARCHAR,
    14 	device_type VARCHAR,
    15 	device_value VARCHAR,
    16 	mount_point VARCHAR,
    17 	type VARCHAR,
    18 	types VARCHAR[],
    19 	options VARCHAR[],
    20 	dump INTEGER,
    21 	pass INTEGER
    22 );
    23 
    24 CREATE OR REPLACE FUNCTION fstab()
    25 RETURNS SETOF unix_sql_api_fstab AS $$
    26 	use strict;
    27 	use warnings;
    28 	
    29 	open(FSTAB, "<", "/etc/fstab") or die $!;
    30 	
    31 	while (<FSTAB>) {
    32 		if (/^([^\s#]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+(\d+)\s+(\d+)\s*$/) {
    33 			
    34 			my $device_spec_type;
    35 			my $device_spec_value;
    36 			{
    37 				if ($1 =~ /([^=]+)=(.*)/) {
    38 					($device_spec_type, $device_spec_value) = ($1, $2);
    39 				}
    40 			}
    41 			
    42 			return_next({
    43 				device => $1,
    44 				device_type => $device_spec_type,
    45 				device_value => $device_spec_value,
    46 				mount_point => $2,
    47 				type => $3,
    48 				types => [split(",", $3)],
    49 				options => [split(",", $4)],
    50 				dump => $5,
    51 				pass => $6
    52 			});
    53 		}
    54 	}
    55 	
    56 	return undef;
    57 $$ LANGUAGE plperlu;
    58 
    59 CREATE OR REPLACE VIEW fstab AS
    60 	SELECT * FROM fstab()
    61 ;
    62 
    63 
    64 -- user groups: --------------------------------------------------------------
    65 
    66 DROP VIEW IF EXISTS user_group;
    67 DROP FUNCTION IF EXISTS user_group();
    68 DROP TYPE IF EXISTS unix_sql_api_user_group;
    69 
    70 CREATE TYPE unix_sql_api_user_group AS (
    71 	id INTEGER,
    72 	name VARCHAR,
    73 	members VARCHAR[]
    74 );
    75 
    76 CREATE OR REPLACE FUNCTION user_group()
    77 RETURNS SETOF unix_sql_api_user_group AS $$
    78 	use strict;
    79 	use warnings;
    80 	
    81 	use User::grent;
    82 
    83 	while (my $group = getgrent) {
    84 		return_next({
    85 			id => $group->gid,
    86 			name => $group->name,
    87 			members => [@{$group->members}]
    88 		});
    89 	}
    90 	
    91 	return undef;
    92 $$ LANGUAGE plperlu;
    93 
    94 CREATE OR REPLACE VIEW user_group AS
    95 	SELECT * FROM user_group()
    96 ;
    97