Initial check-in of basename/dirname for PostgreSQL.
This commit is contained in:
parent
8fda1123b7
commit
6961710f75
|
@ -0,0 +1,8 @@
|
|||
*~
|
||||
*.swp
|
||||
db.sqlite3
|
||||
bower_components
|
||||
*.pyc
|
||||
\#*#
|
||||
.#*
|
||||
catalogia/settings.hy
|
|
@ -0,0 +1,21 @@
|
|||
Copyright (c) 2016 Elf M. Sternberg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
- Elf M. Sternberg <elf.sternberg@gmail.com>
|
|
@ -0,0 +1,18 @@
|
|||
Synopsis
|
||||
--------
|
||||
|
||||
`basename.sql` contains functions which provide the POSIX-equivalent
|
||||
functions `basename` and `dirname` of PostgreSQL. The functions are
|
||||
written in fairly standard PL/pgSQL, and should work with any version of
|
||||
PostgreSQL after version 6.
|
||||
|
||||
I make no claim that these functions are SQL/PSM-compliant.
|
||||
|
||||
LICENSE AND COPYRIGHT NOTICE: NO WARRANTY GRANTED OR IMPLIED
|
||||
------------------------------------------------------------
|
||||
|
||||
Copyright ⓒ 2016 Elf M. Sternberg <elf.sternberg@gmail.com>
|
||||
|
||||
Released under The MIT License. Please see the LICENSE file for more
|
||||
details. All rights not clearly enumerated by the LICENSE are reserved
|
||||
to the authors.
|
|
@ -0,0 +1,47 @@
|
|||
CREATE OR REPLACE FUNCTION basename(fullpath text,
|
||||
suffix text DEFAULT NULL,
|
||||
separator char DEFAULT '/')
|
||||
RETURNS text AS
|
||||
$$
|
||||
DECLARE
|
||||
basename text;
|
||||
suffixre text;
|
||||
separare text;
|
||||
BEGIN
|
||||
separare := '^.*' || separator;
|
||||
basename := regexp_replace(fullpath, separare, '');
|
||||
IF suffix IS NOT NULL THEN
|
||||
suffixre := suffix + '$';
|
||||
basename := regexp_replace(basename, suffixre, '');
|
||||
END IF;
|
||||
RETURN basename;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql' IMMUTABLE;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION dirname(fullpath text,
|
||||
separator char DEFAULT '/')
|
||||
RETURNS text AS
|
||||
$$
|
||||
DECLARE
|
||||
separare text;
|
||||
dirname text;
|
||||
compname text;
|
||||
BEGIN
|
||||
IF position(separator in fullpath) = 0 THEN
|
||||
return '';
|
||||
END IF;
|
||||
separare := '^(.*' || separator || ').*$';
|
||||
dirname = regexp_replace(fullpath, separare, '\1');
|
||||
IF length(dirname) != 0 THEN
|
||||
compname := lpad('', length(dirname), separator);
|
||||
IF compname != dirname THEN
|
||||
dirname = rtrim(dirname, separator);
|
||||
END IF;
|
||||
END IF;
|
||||
return dirname;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql' IMMUTABLE;
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
CREATE TABLE testdata (name TEXT, direxpected TEXT, baseexpected TEXT);
|
||||
|
||||
INSERT INTO testdata VALUES ('/foo/bar', '/foo', 'bar');
|
||||
INSERT INTO testdata VALUES ('/', '/', '');
|
||||
INSERT INTO testdata VALUES ('foo', '', 'foo');
|
||||
INSERT INTO testdata VALUES ('////foo', '////' ,'foo');
|
||||
INSERT INTO testdata VALUES ('//foo//bar', '//foo' ,'bar');
|
||||
INSERT INTO testdata VALUES ('/foo/bar', '/foo', 'bar');
|
||||
INSERT INTO testdata VALUES ('/foo/bar/', '/foo/bar', '');
|
||||
|
||||
SELECT name, basename(name) AS basetest, baseexpected, dirname(name) AS dirtest, direxpected,
|
||||
CASE WHEN basename(name) = baseexpected THEN 'PASS' ELSE 'FAIL' END AS base,
|
||||
CASE WHEN dirname(name) = direxpected THEN 'PASS' ELSE 'FAIL' END AS dir FROM testdata;
|
||||
|
||||
DROP TABLE testdata;
|
||||
DROP FUNCTION IF EXISTS basename(text, text, char);
|
||||
DROP FUNCTION IF EXISTS dirname(text, char);
|
Loading…
Reference in New Issue