59 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2009 Doug Coleman.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: kernel db.errors peg.ebnf strings sequences math
 | 
						|
combinators.short-circuit accessors math.parser quoting
 | 
						|
locals ;
 | 
						|
IN: db.postgresql.errors
 | 
						|
 | 
						|
EBNF: parse-postgresql-sql-error
 | 
						|
 | 
						|
Error = "ERROR:" [ ]+
 | 
						|
 | 
						|
TableError =
 | 
						|
    Error ("relation "|"table ")(!(" already exists").)+:table " already exists"
 | 
						|
        => [[ table >string unquote <sql-table-exists> ]]
 | 
						|
    | Error ("relation "|"table ")(!(" does not exist").)+:table " does not exist"
 | 
						|
        => [[ table >string unquote <sql-table-missing> ]]
 | 
						|
 | 
						|
DatabaseError =
 | 
						|
    Error ("database")(!(" already exists").)+:database " already exists"
 | 
						|
        => [[ database >string <sql-database-exists> ]]
 | 
						|
 | 
						|
FunctionError =
 | 
						|
    Error "function" (!(" already exists").)+:table " already exists"
 | 
						|
        => [[ table >string <sql-function-exists> ]]
 | 
						|
    | Error "function" (!(" does not exist").)+:table " does not exist"
 | 
						|
        => [[ table >string <sql-function-missing> ]]
 | 
						|
 | 
						|
SyntaxError =
 | 
						|
    Error "syntax error at end of input":error
 | 
						|
        => [[ error >string <sql-syntax-error> ]]
 | 
						|
    | Error "syntax error at or near " .+:syntaxerror
 | 
						|
        => [[ syntaxerror >string unquote <sql-syntax-error> ]]
 | 
						|
 | 
						|
UnknownError = .* => [[ >string <sql-unknown-error> ]]
 | 
						|
 | 
						|
PostgresqlSqlError = (TableError | DatabaseError | FunctionError | SyntaxError | UnknownError) 
 | 
						|
 | 
						|
;EBNF
 | 
						|
 | 
						|
 | 
						|
TUPLE: parse-postgresql-location column line text ;
 | 
						|
C: <parse-postgresql-location> parse-postgresql-location
 | 
						|
 | 
						|
EBNF: parse-postgresql-line-error
 | 
						|
 | 
						|
Line = "LINE " [0-9]+:line ": " .+:sql
 | 
						|
    => [[ f line >string string>number sql >string <parse-postgresql-location> ]] 
 | 
						|
 | 
						|
;EBNF
 | 
						|
 | 
						|
:: set-caret-position ( error caret-line -- error )
 | 
						|
    caret-line length
 | 
						|
    error line>> number>string length "LINE : " length +
 | 
						|
    - [ error ] dip >>column ;
 | 
						|
 | 
						|
: postgresql-location ( line column -- obj )
 | 
						|
    [ parse-postgresql-line-error ] dip
 | 
						|
    set-caret-position ;
 |