package com.getbase.android.db.fluentsqlite;
import static com.google.common.base.Preconditions.checkNotNull;
import com.getbase.android.db.fluentsqlite.Query.QueryBuilder;
import com.getbase.android.db.provider.Utils;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import java.util.Collections;
import java.util.List;
public class Insert implements InsertValuesBuilder {
final String mTable;
final ContentValues mValues;
private Insert(String table, ContentValues values) {
mTable = table;
mValues = values;
}
public static InsertTableSelector insert() {
return new InsertBuilder();
}
static class InsertBuilder implements InsertTableSelector, InsertFormSelector {
String mTable;
List<String> mQueryFormColumns = Lists.newArrayList();
@Override
public InsertFormSelector into(String table) {
mTable = checkNotNull(table);
return this;
}
@Override
public DefaultValuesInsert defaultValues(String nullColumnHack) {
return new DefaultValuesInsert(mTable, checkNotNull(nullColumnHack));
}
@Override
public InsertSubqueryForm columns(String... columns) {
Preconditions.checkArgument(columns != null, "Column list cannot be null");
Collections.addAll(mQueryFormColumns, columns);
return this;
}
@Override
public InsertWithSelect resultOf(Query query) {
checkNotNull(query);
return new InsertWithSelect(mTable, query.toRawQuery(), mQueryFormColumns);
}
@Override
public InsertWithSelect resultOf(QueryBuilder queryBuilder) {
checkNotNull(queryBuilder);
return resultOf(queryBuilder.build());
}
@Override
public Insert values(ContentValues values) {
return new Insert(mTable, new ContentValues(values));
}
@Override
public Insert value(String column, Object value) {
ContentValues values = new ContentValues();
Utils.addToContentValues(column, value, values);
return new Insert(mTable, values);
}
}
public long perform(SQLiteDatabase db) {
return db.insert(mTable, null, mValues);
}
public long performOrThrow(SQLiteDatabase db) {
return db.insertOrThrow(mTable, null, mValues);
}
public static class InsertWithSelect {
private final String mTable;
private final RawQuery mQuery;
private final List<String> mQueryFormColumns;
InsertWithSelect(String table, RawQuery query, List<String> queryFormColumns) {
mTable = table;
mQuery = query;
mQueryFormColumns = queryFormColumns;
}
public long perform(SQLiteDatabase db) {
StringBuilder builder = new StringBuilder();
builder.append("INSERT INTO ").append(mTable).append(" ");
if (!mQueryFormColumns.isEmpty()) {
builder
.append("(")
.append(Joiner.on(", ").join(mQueryFormColumns))
.append(") ");
}
builder.append(mQuery.mRawQuery);
SQLiteStatement statement = db.compileStatement(builder.toString());
try {
int argIndex = 1;
for (String arg : mQuery.mRawQueryArgs) {
Utils.bindContentValueArg(statement, argIndex++, arg);
}
return statement.executeInsert();
} finally {
statement.close();
}
}
public long performOrThrow(SQLiteDatabase db) {
long result = perform(db);
if (result == -1) {
throw new RuntimeException("Insert failed");
}
return result;
}
}
public static class DefaultValuesInsert {
final String mTable;
final String mNullColumnHack;
private DefaultValuesInsert(String table, String nullColumnHack) {
mTable = table;
mNullColumnHack = nullColumnHack;
}
public long perform(SQLiteDatabase db) {
return db.insert(mTable, mNullColumnHack, null);
}
public long performOrThrow(SQLiteDatabase db) {
return db.insertOrThrow(mTable, mNullColumnHack, null);
}
}
@Override
public Insert values(ContentValues values) {
mValues.putAll(values);
return this;
}
@Override
public Insert value(String column, Object value) {
Utils.addToContentValues(column, value, mValues);
return this;
}
}