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