Moim zdaniem najlepszym sposobem na zrobienie tego jest użycie wyrażeń regularnych lub SED/AWK do sformatowania wszystkiego, co daje nam bonus w postaci wymiany map w locie. Prawdopodobieństwo wystąpienia błędów w kodzie jest jednak wysokie, więc jest to dość trudne.
pozwól mi trochę nad tym popracować i zobaczę, czy uda mi się wymyślić dobre rozwiązanie. Czy jest gwarantowane, że enkapsulujesz wszystkie podwójne cudzysłowy SQL?
EDYTUJ
Wypróbuj to
cd {{directory}} && find . -type f -print0 |
xargs -0 perl -i.bak -pe 's/select/SELECT/g ; s/from/\n\tFROM/g ; s/where/\n\t\tWHERE/g ; s/and/\n\t\tAND/g ; s/order by/\n\t\tORDER BY/g ; s/asc/ASC/g ; s/desc/DESC/g ;'
Oto przykład
$ printf '"select * from whatever where this = that and active = 1 order by something asc";\n' |
> perl -pe 's/select/SELECT/g ; s/from/\n\tFROM/g ; s/where/\n\t\tWHERE/g ; s/and/\n\t\tAND/g ; s/order by/\n\t\tORDER BY/g ; s/asc/ASC/g ; s/desc/DESC/g ;'
"SELECT *
FROM whatever
WHERE this = that
AND active = 1
ORDER BY something ASC";
Czy to jest ładne? nie, wcale nie, czy to działa... Tak.
Spróbuję utworzyć plik filtrujący i może mały program bash lub coś w tym stylu, gdy będę miał czas na uruchomienie tego gorącego bałaganu.
EDYTUJ
Oto poprawiony kod, wygląda ładniej (w pewnym sensie)
printf '$request1 = "select * from whatever where this = that and active = 1 order by something asc";\n' |
perl -pe 's/select/SELECT/gi ; s/from/\n FROM/gi ; s/where/\n WHERE/gi ; s/and/\n AND/gi ; s/order by/\n ORDER BY/gi ; s/asc/ASC/gi ; s/desc/DESC/gi ;' |
awk 'NR == 1 {pad = length($0)/2; print} NR > 1 {gsub(/\r/,""); printf "%*s%s\n", pad, " ", $0}'
__OUTPUTS__
$request1 = "SELECT *
FROM whatever
WHERE this = that
AND active = 1
ORDER BY something ASC";