このディレクトリの索引

% database_domain(postgresql,mydomain,mydatabase).
% database_domain(mysql,mydomain,mydatabase).

'Postgresqlコマンド読み出し'(SQL,X) :-
    database_domain(postgresql,Domain,Database),
    psql_macro(SQL,SQL_2),
    concat(['psql -h ',Domain,' ',Database,' -q -t -c ','"',SQL_2,'"'],S)
    shs(S,Y),
    findall(U,(member(V,Y) , not V = '' , psql_get_field(V,U)),X),
    ! .

'mysqlコマンド呼び出し'(SQL,X) :-
    database_domain(mysql,Domain,Database),
    psql_macro(SQL,SQL_2),
    replace_all(SQL_2,'"','',SQL_3),
    concat_atom(['mysql -h ',Domain,' ',Database,' -s -e ','"',SQL_3,'"'],S)
    shs(S,Y),
    findall(U,(member(V,Y) , not V = '' , mysql_get_field(V,U)),X),!.

psql_macro(SQL,SQL2) :-
    subatomic(SQL,1,12,'create table'),
    replace_all(SQL,number,numeric,SQL2),
    ! .
psql_macro(SQL,SQL).

mysql_get_field(S,X) :-
    atomic_length(S,Len),
    findall(N,(for(1,N,Len) , subatomic(S,N,1,'\t')),_区切り位置ならび),
    psql_get_field_2(S,Len,[0|_区切り位置ならび],X) .

psql_get_field(S,X) :-
    atomic_length(S,Len),
    findall(N,(for(1,N,Len) , subatomic(S,N,1,'|')),_区切り位置ならび),
    psql_get_field_2(S,Len,[0|_区切り位置ならび],X).

psql_get_field_2(S,_,[],[]) :-!.
psql_get_field_2(S,Len,[St],[A]) :-
    N2 is St + 1,
    Len2 is Len - St,
    subatomic(S,N2,Len2,A_1),
    erase_space(A_1,A_2),
    atomic_length(A_2,Len3),
    postgresql_parse_1(A_2,Len3,A),!.
psql_get_field_2(S,Len,[N1,N2|R],[A|R2]) :-
    Ns is N1 + 1,
    Len2 is N2 - N1 - 1,
    subatomic(S,Ns,Len2,A_1),
    erase_space(A_1,A_2),
    atomic_length(A_2,Len3),
    postgresql_parse_1(A_2,Len3,A),
    psql_get_field_2(S,Len,[N2|R],R2) .

postgresql_parse_1(A,Len,V) :-
    atom_number(A,V),
    '実数'(V),!.
postgresql_parse_1(A,Len,X) :-
    atom_number(A,N),
    integer(N),
    '整数から文字列'(Len,N,X),!.
postgresql_parse_1(A,Len,A).

erase_space(S,X) :-
    atomic_length(S,Len),
    erase_space_s(1,Len,S,X1),
    atomic_length(X1,Len2),
    erase_space_e(Len2,X1,X),!.

erase_space_s(St,Len,_,'') :-
    St > Len,!.
erase_space_s(St,Len,S,X) :-
    subatomic(S,St,1,' '),
    St2 is St + 1,
    erase_space_s(St2,Len,S,X),!.
erase_space_s(St,Len,S,X) :-
    subatomic(S,St,Len,X),!.

erase_space_e(0,_,'') :-!.
erase_space_e(St,S,X) :-
    subatomic(S,St,1,' '),
    St2 is St - 1,
    erase_space_e(St2,S,X),!.
erase_space_e(St,S,X) :-
    subatomic(S,1,St,X),!.

'整数から文字列'(_文字列桁,_文字列,_副文字列) :-
    atom(_文字列),
    subatomic(_文字列,1,_文字列桁,_副文字列),!.
'整数から文字列'(_文字列桁,_実数,_副文字列) :-
    '実数'(_実数),
    write_formatted_atom(_文字列形式,'%%%d.0f',[_文字列桁]),
    write_formatted_atom(_副文字列,_文字列形式,[_実数]),!.
'整数から文字列'(_文字列桁,_整数,_定数) :-
    '整数・文字番号変換'(_整数,_文字番号ならび),
    'ならびの長さ'(_文字番号ならび,_ならびの長さ),
    _不足桁 is _文字列桁 - _ならびの長さ,
    '頭部に零を詰める'(_不足桁,_文字番号ならび,_整形された文字番号ならび),
    '定数・文字番号変換'(_定数,_整形された文字番号ならび),!.

'ならびの長さ'(_ならび,_ならびの長さ) :-
    length(_ならび,_ならびの長さ).

'実数'(_項) :-
    real(_項).

'整数・文字番号変換'(_整数,_文字番号ならび) :-
    number(_整数,_文字番号ならび).

'頭部に零を詰める'(0,_文字ならび,_文字ならび) :- !.
'頭部に零を詰める'(_桁,[_|_未決定ならび],_文字ならび) :-
    _桁 < 0,
    !,
    _残り桁 is _桁 + 1,
    '頭部に零を詰める'(_残り桁,_未決定ならび,_文字ならび).
'頭部に零を詰める'(_桁,_文字ならび,[48|_未決定ならび]) :-
    _残り桁 is _桁 - 1,
    '頭部に零を詰める'(_残り桁,_文字ならび,_未決定ならび).

replace_all('',A,B,'') :- !.
replace_all(String,S1,'',X) :-
    decompcons(String,StringL),
    decompcons(S1,S1L),
    replace_31(StringL,S1L,Y),
    concat_atom(Y,X),!.
replace_all(String,S1,S2,X) :-
    decompcons(String,StringL),
    decompcons(S1,S1L),
    decompcons(S2,S2L),
    replace_41(StringL,S1L,S2L,Y),
    concat_atom(Y,X),!.

replace_31([],_,[]) :- !.
replace_31(L,L1,Y) :-
    append(L1,R,L),
    replace_31(R,L1,Y),!.
replace_31([A|R],L1,[A|R2]) :-
    replace_31(R,L1,R2).

replace_41([],_,_,[]) :- !.
replace_41(L,L1,L2,R2) :-
    append(L1,R,L),
    replace_41(R,L1,L2,R3),
    append(L2,R3,R2),!.
replace_41([A|R],L1,L2,[A|R2]) :-
    replace_41(R,L1,L2,R2).

shs(Command,[],X) :-
    shs(Command,X),
    ! .
shs(Command,List,X) :-
    tmpnam(TMPNAM),
    open(TMPNAM,write,Output1),
    wrln(Output1,List),
    close(Output1),
    concat_atom(['cat ',TMPNAM],Cat),
    system(Cat,user_input,Pipe),
    system(Command,Pipe,Output),
    findall(Y,(repeat , get_line(Output,Y) , (Y = end_of_file , (!) , fail ; true)),X),
    close(Pipe),
    close(Output),
    unlink(TMPNAM),
    ! .
shs(Command,user_input,X) :-
    (
        var(X)
    ;
        \+(var(X)),
        \+(X = pipe(_))
    ),
    system(Command,user_input,Pipe),
    findall(S,(repeat , get_line(Pipe,S) , (S = end_of_file , (!) , fail ; true)),X),
    close(Pipe),
    ! .
shs(Command,user_input,X) :-
    \+(var(X)),
    X = pipe(Pipe),
    system(Command,user_input,Pipe),
    ! .
shs(Command,Input,Output) :-
    \+(var(Input)),
    Input = pipe(Pipe1),
    \+(var(Output)),
    Output = pipe(Pipe2),
    system(Command,Pipe1,Pipe2),
    close(Pipe1),
    ! .
shs(Command,Input,X) :-
    \+(var(Input)),
    Input = pipe(Pipe1),
    (
        var(X)
    ;
        \+(var(X)),
        \+(X = pipe(_))
    ),
    system(Command,Pipe1,Pipe2),
    close(Pipe1),
    findall(S,(repeat , get_line(Pipe2,S) , (S = end_of_file , (!) , fail ; true)),X),
    close(Pipe2),
    ! .
shs(Command,Input,X) :-
    \+(var(X)),
    X = pipe(Pipe),
    \+(var(Input)),
    \+(Input = pipe(_)),
    open(Input,read,InputStream),
    system(Command,InputStream,Pipe),
    close(InputStream),!.
shs(Command,Input,X) :-
    (
        var(X)
    ;
        \+(var(X)),
        \+(X = pipe(_))
    ),
    \+(var(Input)),
    \+(Input = pipe(_)),
    open(Input,read,InputStream),
    system(Command,InputStream,Pipe),
    close(InputStream),
    findall(S,(repeat , get_line(Pipe,S) , (S = end_of_file , (!) , fail ; true)),X),
    close(Pipe),!.

shs(Command,X) :-
    tmpnam(TMPNAM),
    open(TMPNAM,write,Output),
    system(Command,user_input,Output),
    close(Output),
    get_lines(TMPNAM,L),
    concat_atom(['rm -f ',TMPNAM],S),
    system(S),
    X = L,!.
shs(Command_list,X) :-
    list(Command_list),
    concat_atom(Command_list,' ',Command),
    shs(Command,X),!.

get_lines(File,Lines) :-
    get_chars(File,L),
    chars_lines(L,Lines),!.

chars_lines([],[],[]) :- !.
chars_lines(['\r'],[],[]) :- !.
chars_lines(['\r',A|R],[],[A|R]) :-
    \+(A = '\n'),!.
chars_lines(['\r','\n'|R],[],R) :- !.
chars_lines(['\n'|R],[],R) :- !.
chars_lines([A|R1],[A|R2],Z) :-
    chars_lines(R1,R2,Z).

chars_lines([],[]) :- !.
chars_lines(L,[A|R2]) :-
    chars_lines(L,U,R),
    concat_atom(U,A),
    chars_lines(R,R2).

tmpnam(TMPNAM) :-
    tmpnam_c(A),
    tmpnam_c(B),
    tmpnam_c(C),
    tmpnam_c(D),
    tmpnam_c(E),
    tmpnam_c(F),
    concat_atom(['/tmp/file',A,B,C,D,E,F],TMPNAM),!.

tmpnam_c(X) :-
    Y is (random mod 122) + 1,
    tmpnam_c_2(Y,X),!.
tmpnam_c(X) :-
    tmpnam_c(X).

tmpnam_c_2(X,X) :-
    X >= 97,X =< 121,!.
tmpnam_c_2(X,X) :-
    X >= 65,X =< 90,!.
tmpnam_c_2(X,X) :-
    X >= 48,X =< 57,!.
tmpnam_c_2(Y,X) :-
    Y >= 0,Y =< 47,
    X is Y + 65,
    \+((X >= 92,X =< 96)).