package com.wigwamlabs.utils.db;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import com.wigwamlabs.veckify.Debug;
public final class QueryBuilder {
private QueryBuilder() {
}
public static AlterQueryBuilder alterAddColumn(String tableName, String columnName) {
return new AlterQueryBuilder(tableName, columnName);
}
public static CreateQueryBuilder create(String tableName) {
return new CreateQueryBuilder(tableName, false);
}
public static CreateQueryBuilder createFts3(String tableName) {
return new CreateQueryBuilder(tableName, true);
}
public static String drop(String tableName) {
return "DROP TABLE IF EXISTS " + tableName;
}
public static ValuesBuilder values() {
return new ValuesBuilder();
}
public static class AlterQueryBuilder {
private final StringBuilder mQuery = new StringBuilder();
public AlterQueryBuilder(String tableName, String columnName) {
mQuery
.append("ALTER TABLE ")
.append(tableName)
.append(" ADD COLUMN ")
.append(columnName);
}
public void execute(SQLiteDatabase db) {
Debug.logSql(mQuery.toString());
db.execSQL(mQuery.toString());
}
public AlterQueryBuilder integer(Boolean nullable) {
type(" INTEGER", nullable);
return this;
}
public AlterQueryBuilder text(Boolean nullable) {
type(" TEXT", nullable);
return this;
}
private void type(String t, Boolean nullable) {
mQuery.append(t);
if (nullable != null) {
mQuery.append(" NOT NULL");
}
}
}
public static class CreateQueryBuilder {
private final StringBuilder mQuery = new StringBuilder();
private boolean mHasAddedColumns;
public CreateQueryBuilder(String tableName, boolean fts3) {
if (fts3) {
mQuery.append("CREATE VIRTUAL TABLE ");
mQuery.append(tableName);
mQuery.append(" USING fts3 (");
} else {
mQuery.append("CREATE TABLE ");
mQuery.append(tableName);
mQuery.append(" (");
}
}
public void execute(SQLiteDatabase db) {
mQuery.append(")");
Debug.logSql(mQuery.toString());
db.execSQL(mQuery.toString());
}
private void field(String columnName, String type, Boolean nullable) {
prepareForColumn();
mQuery.append(columnName);
mQuery.append(type);
if (nullable != null) {
mQuery.append(" NOT NULL");
}
}
public CreateQueryBuilder integer(String columnName) {
field(columnName, " INTEGER", Boolean.FALSE);
return this;
}
public CreateQueryBuilder integer(String columnName, Boolean nullable) {
field(columnName, " INTEGER", nullable);
return this;
}
private void prepareForColumn() {
if (mHasAddedColumns) {
mQuery.append(", ");
}
mHasAddedColumns = true;
}
public CreateQueryBuilder pk(String columnName) {
prepareForColumn();
mQuery.append(columnName);
mQuery.append(" INTEGER PRIMARY KEY AUTOINCREMENT");
return this;
}
public CreateQueryBuilder real(String columnName) {
field(columnName, " REAL", Boolean.FALSE);
return this;
}
public CreateQueryBuilder real(String columnName, Boolean nullable) {
field(columnName, " REAL", nullable);
return this;
}
public CreateQueryBuilder text(String columnName) {
field(columnName, " TEXT", Boolean.FALSE);
return this;
}
public CreateQueryBuilder text(String columnName, Boolean nullable) {
field(columnName, " TEXT", nullable);
return this;
}
}
public static class ValuesBuilder {
private final ContentValues mValues = new ContentValues();
public ContentValues end() {
return mValues;
}
public ValuesBuilder put(String key, Integer value) {
mValues.put(key, value);
return this;
}
public ValuesBuilder put(String key, Long value) {
mValues.put(key, value);
return this;
}
public ValuesBuilder put(String key, String value) {
mValues.put(key, value);
return this;
}
}
}