prototyp/prototyp.sql
author František Kučera <franta-hg@frantovo.cz>
Mon, 01 Sep 2014 18:10:25 +0200
changeset 7 8f0e2d417702
parent 6 dc83d208e862
child 8 0f6df6850ba6
permissions -rw-r--r--
prototyp: UTF-8 encoding (decoding)
franta-hg@6
     1
-- SQL-UNIX-API (prototype)
franta-hg@6
     2
-- Copyright © 2014 František Kučera (frantovo.cz)
franta-hg@6
     3
-- 
franta-hg@6
     4
-- This program is free software: you can redistribute it and/or modify
franta-hg@6
     5
-- it under the terms of the GNU General Public License as published by
franta-hg@6
     6
-- the Free Software Foundation, either version 3 of the License, or
franta-hg@6
     7
-- (at your option) any later version.
franta-hg@6
     8
-- 
franta-hg@6
     9
-- This program is distributed in the hope that it will be useful,
franta-hg@6
    10
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
franta-hg@6
    11
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
franta-hg@6
    12
-- GNU General Public License for more details.
franta-hg@6
    13
-- 
franta-hg@6
    14
-- You should have received a copy of the GNU General Public License
franta-hg@6
    15
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
franta-hg@6
    16
franta-hg@6
    17
franta-hg@6
    18
franta-hg@2
    19
-- CREATE SCHEMA unix_sql_api;
franta-hg@2
    20
franta-hg@2
    21
SET search_path TO unix_sql_api;
franta-hg@2
    22
franta-hg@3
    23
franta-hg@3
    24
-- fstab: --------------------------------------------------------------------
franta-hg@3
    25
franta-hg@2
    26
DROP VIEW IF EXISTS fstab;
franta-hg@2
    27
DROP FUNCTION IF EXISTS fstab();
franta-hg@2
    28
DROP TYPE IF EXISTS unix_sql_api_fstab;
franta-hg@2
    29
franta-hg@2
    30
CREATE TYPE unix_sql_api_fstab AS (
franta-hg@2
    31
	device VARCHAR,
franta-hg@2
    32
	device_type VARCHAR,
franta-hg@2
    33
	device_value VARCHAR,
franta-hg@2
    34
	mount_point VARCHAR,
franta-hg@2
    35
	type VARCHAR,
franta-hg@2
    36
	types VARCHAR[],
franta-hg@2
    37
	options VARCHAR[],
franta-hg@2
    38
	dump INTEGER,
franta-hg@2
    39
	pass INTEGER
franta-hg@2
    40
);
franta-hg@2
    41
franta-hg@2
    42
CREATE OR REPLACE FUNCTION fstab()
franta-hg@2
    43
RETURNS SETOF unix_sql_api_fstab AS $$
franta-hg@2
    44
	use strict;
franta-hg@2
    45
	use warnings;
franta-hg@2
    46
	
franta-hg@2
    47
	open(FSTAB, "<", "/etc/fstab") or die $!;
franta-hg@2
    48
	
franta-hg@2
    49
	while (<FSTAB>) {
franta-hg@2
    50
		if (/^([^\s#]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+(\d+)\s+(\d+)\s*$/) {
franta-hg@2
    51
			
franta-hg@2
    52
			my $device_spec_type;
franta-hg@2
    53
			my $device_spec_value;
franta-hg@2
    54
			{
franta-hg@2
    55
				if ($1 =~ /([^=]+)=(.*)/) {
franta-hg@2
    56
					($device_spec_type, $device_spec_value) = ($1, $2);
franta-hg@2
    57
				}
franta-hg@2
    58
			}
franta-hg@2
    59
			
franta-hg@2
    60
			return_next({
franta-hg@2
    61
				device => $1,
franta-hg@2
    62
				device_type => $device_spec_type,
franta-hg@2
    63
				device_value => $device_spec_value,
franta-hg@2
    64
				mount_point => $2,
franta-hg@2
    65
				type => $3,
franta-hg@2
    66
				types => [split(",", $3)],
franta-hg@2
    67
				options => [split(",", $4)],
franta-hg@2
    68
				dump => $5,
franta-hg@2
    69
				pass => $6
franta-hg@2
    70
			});
franta-hg@2
    71
		}
franta-hg@2
    72
	}
franta-hg@2
    73
	
franta-hg@2
    74
	return undef;
franta-hg@2
    75
$$ LANGUAGE plperlu;
franta-hg@2
    76
franta-hg@2
    77
CREATE OR REPLACE VIEW fstab AS
franta-hg@2
    78
	SELECT * FROM fstab()
franta-hg@3
    79
;
franta-hg@3
    80
franta-hg@3
    81
franta-hg@3
    82
-- user groups: --------------------------------------------------------------
franta-hg@3
    83
franta-hg@4
    84
DROP VIEW IF EXISTS groups;
franta-hg@4
    85
DROP FUNCTION IF EXISTS groups();
franta-hg@4
    86
DROP TYPE IF EXISTS unix_sql_api_groups;
franta-hg@3
    87
franta-hg@4
    88
CREATE TYPE unix_sql_api_groups AS (
franta-hg@3
    89
	id INTEGER,
franta-hg@3
    90
	name VARCHAR,
franta-hg@3
    91
	members VARCHAR[]
franta-hg@3
    92
);
franta-hg@3
    93
franta-hg@4
    94
CREATE OR REPLACE FUNCTION groups()
franta-hg@4
    95
RETURNS SETOF unix_sql_api_groups AS $$
franta-hg@3
    96
	use strict;
franta-hg@3
    97
	use warnings;
franta-hg@5
    98
franta-hg@3
    99
	use User::grent;
franta-hg@3
   100
franta-hg@5
   101
	while (my $group = getgrent()) {
franta-hg@3
   102
		return_next({
franta-hg@3
   103
			id => $group->gid,
franta-hg@3
   104
			name => $group->name,
franta-hg@3
   105
			members => [@{$group->members}]
franta-hg@3
   106
		});
franta-hg@3
   107
	}
franta-hg@3
   108
	
franta-hg@5
   109
	elog(NOTICE, "members field does not contain users who have this group as primary one");
franta-hg@5
   110
	
franta-hg@3
   111
	return undef;
franta-hg@3
   112
$$ LANGUAGE plperlu;
franta-hg@3
   113
franta-hg@4
   114
CREATE OR REPLACE VIEW groups AS
franta-hg@4
   115
	SELECT * FROM groups()
franta-hg@3
   116
;
franta-hg@5
   117
COMMENT ON COLUMN groups.members IS 'does not contain users who have this group as primary one';
franta-hg@3
   118
franta-hg@5
   119
franta-hg@5
   120
-- user: ---------------------------------------------------------------------
franta-hg@5
   121
franta-hg@5
   122
DROP VIEW IF EXISTS users;
franta-hg@5
   123
DROP FUNCTION IF EXISTS users();
franta-hg@5
   124
DROP TYPE IF EXISTS unix_sql_api_users;
franta-hg@5
   125
franta-hg@5
   126
CREATE TYPE unix_sql_api_users AS (
franta-hg@5
   127
	id INTEGER,
franta-hg@5
   128
	gid INTEGER,
franta-hg@5
   129
	name VARCHAR,
franta-hg@5
   130
	-- comment VARCHAR,
franta-hg@5
   131
	gecos VARCHAR[],
franta-hg@5
   132
	home VARCHAR,
franta-hg@5
   133
	shell VARCHAR
franta-hg@5
   134
	-- expire VARCHAR
franta-hg@5
   135
);
franta-hg@5
   136
franta-hg@5
   137
CREATE OR REPLACE FUNCTION users()
franta-hg@5
   138
RETURNS SETOF unix_sql_api_users AS $$
franta-hg@5
   139
	use strict;
franta-hg@5
   140
	use warnings;
franta-hg@5
   141
	
franta-hg@7
   142
	use encoding "UTF-8";
franta-hg@5
   143
	use User::pwent;
franta-hg@5
   144
	
franta-hg@5
   145
	while (my $user = getpwent()) {
franta-hg@5
   146
		return_next({
franta-hg@5
   147
			id => $user->uid,
franta-hg@5
   148
			gid => $user->gid,
franta-hg@5
   149
			name => $user->name,
franta-hg@5
   150
			# comment => $user->comment,
franta-hg@7
   151
			gecos => [split(",", $user->gecos)],
franta-hg@5
   152
			home => $user->dir,
franta-hg@5
   153
			shell => $user->shell,
franta-hg@5
   154
			# expire => $user->expire
franta-hg@5
   155
			
franta-hg@5
   156
		});
franta-hg@5
   157
	}
franta-hg@5
   158
	
franta-hg@5
   159
	return undef;
franta-hg@5
   160
$$ LANGUAGE plperlu;
franta-hg@5
   161
franta-hg@5
   162
CREATE OR REPLACE VIEW users AS
franta-hg@5
   163
	SELECT * FROM users()
franta-hg@5
   164
;
franta-hg@5
   165