/*
* Copyright (C) 2015 Federico Iosue (federico.iosue@gmail.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package it.feio.android.omninotes.db;
import android.content.res.AssetManager;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class SqlParser {
public static List<String> parseSqlFile(String sqlFile,
AssetManager assetManager) throws IOException {
List<String> sqlIns = null;
InputStream is = assetManager.open(sqlFile);
try {
sqlIns = parseSqlFile(is);
} finally {
is.close();
}
return sqlIns;
}
public static List<String> parseSqlFile(InputStream is) throws IOException {
String script = removeComments(is);
return splitSqlScript(script, ';');
}
private static String removeComments(InputStream is) throws IOException {
StringBuilder sql = new StringBuilder();
InputStreamReader isReader = new InputStreamReader(is);
try {
BufferedReader buffReader = new BufferedReader(isReader);
try {
String line;
String multiLineComment = null;
while ((line = buffReader.readLine()) != null) {
line = line.trim();
if (multiLineComment == null) {
if (line.startsWith("/*")) {
if (!line.endsWith("}")) {
multiLineComment = "/*";
}
} else if (line.startsWith("{")) {
if (!line.endsWith("}")) {
multiLineComment = "{";
}
} else if (!line.startsWith("--") && !line.equals("")) {
sql.append(" ").append(line);
}
} else if (multiLineComment.equals("/*")) {
if (line.endsWith("*/")) {
multiLineComment = null;
}
} else if (multiLineComment.equals("{")) {
if (line.endsWith("}")) {
multiLineComment = null;
}
}
}
} finally {
buffReader.close();
}
} finally {
isReader.close();
}
return sql.toString();
}
private static List<String> splitSqlScript(String script, char delim) {
List<String> statements = new ArrayList<>();
StringBuilder sb = new StringBuilder();
boolean inLiteral = false;
char[] content = script.toCharArray();
for (int i = 0; i < script.length(); i++) {
if (content[i] == '\'') {
inLiteral = !inLiteral;
}
if (content[i] == delim && !inLiteral) {
if (sb.length() > 0) {
statements.add(sb.toString().trim());
sb = new StringBuilder();
}
} else {
sb.append(content[i]);
}
}
if (sb.length() > 0) {
statements.add(sb.toString().trim());
}
return statements;
}
}