package com.openerp.orm;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;
public class SQLHelper {
public List<String> createTable(OEDBHelper db) {
List<String> queries = new ArrayList<String>();
StringBuffer sql = new StringBuffer();
sql.append("CREATE TABLE IF NOT EXISTS ");
sql.append(modelToTable(db.getModelName()));
sql.append(" (");
for (OEColumn col : db.getModelColumns()) {
if (col.getName().equals("id") || col.getName().equals("oea_name")) {
continue;
}
if (col.getType() instanceof String) {
sql.append(col.getName());
sql.append(" ");
sql.append(col.getType());
sql.append(", ");
}
if (col.getType() instanceof OEManyToOne) {
OEManyToOne manyToOne = (OEManyToOne) col.getType();
List<String> many2one = createTable(manyToOne.getDBHelper());
for (String query : many2one) {
queries.add(query);
}
sql.append(col.getName());
sql.append(" ");
sql.append(OEFields.integer());
sql.append(", ");
}
if (col.getType() instanceof OEManyToMany) {
OEManyToMany manyTomany = (OEManyToMany) col.getType();
List<String> many2many = createTable(manyTomany.getDBHelper());
for (String query : many2many) {
queries.add(query);
queries.add(createMany2ManyRel(db.getModelName(),
manyTomany.getDBHelper().getModelName()));
}
}
//one to many字段处理
if (col.getType() instanceof OEOneToMany) {
OEOneToMany oneTomany = (OEOneToMany) col.getType();
List<String> one2many = createTable(oneTomany.getDBHelper());
for (String query : one2many) {
queries.add(query);
}
}
}
sql.append(defaultColumns());
sql.deleteCharAt(sql.lastIndexOf(","));
sql.append(");");
queries.add(sql.toString());
Log.d("SQLHelper", "Table created : " + modelToTable(db.getModelName()));
return queries;
}
public String createMany2ManyRel(String model_first, String model_second) {
String column_first = modelToTable(model_first);
String column_second = modelToTable(model_second);
String rel_table = column_first + "_" + column_second + "_rel";
StringBuffer sql = new StringBuffer();
sql.append("CREATE TABLE IF NOT EXISTS ");
sql.append(rel_table);
sql.append("(");
sql.append(column_first + "_id ");
sql.append(OEFields.integer());
sql.append(", ");
sql.append(column_second + "_id ");
sql.append(OEFields.integer());
sql.append(defaultRelColumns());
sql.append(");");
Log.d("SQLHelper", "Table created : " + rel_table);
return sql.toString();
}
public String dropMany2ManyRel(String model_first, String model_second) {
String column_first = modelToTable(model_first);
String column_second = modelToTable(model_second);
String rel_table = column_first + "_" + column_second + "_rel";
StringBuffer sql = new StringBuffer();
sql.append("DROP TABLE IF EXISTS ");
sql.append(rel_table + ";");
Log.d("SQLHelper", "Table dropped : " + rel_table);
return sql.toString();
}
public List<String> dropTable(OEDBHelper db) {
List<String> queries = new ArrayList<String>();
StringBuffer sql = new StringBuffer();
String table = modelToTable(db.getModelName());
sql.append("DROP TABLE IF EXISTS " + table + ";");
Log.d("SQHelper", "Table droped : " + table);
queries.add(sql.toString());
for (OEColumn col : db.getModelColumns()) {
if (col.getType() instanceof OEManyToMany) {
OEManyToMany m2mDb = (OEManyToMany) col.getType();
for (String que : dropTable(m2mDb.getDBHelper())) {
queries.add(que);
}
queries.add(dropMany2ManyRel(table, modelToTable(m2mDb
.getDBHelper().getModelName())));
}
if (col.getType() instanceof OEManyToOne) {
sql = new StringBuffer();
OEManyToOne m2oDb = (OEManyToOne) col.getType();
for (String que : dropTable(m2oDb.getDBHelper())) {
queries.add(que);
}
}
//处理one to many字段
if (col.getType() instanceof OEOneToMany) {
OEOneToMany o2mDb = (OEOneToMany) col.getType();
for (String que : dropTable(o2mDb.getDBHelper())) {
queries.add(que);
}
}
}
return queries;
}
private String defaultColumns() {
StringBuffer defaultCols = new StringBuffer();
defaultCols.append("id ");
defaultCols.append(OEFields.integer());
defaultCols.append(", ");
defaultCols.append("oea_name ");
defaultCols.append(OEFields.varchar(50));
defaultCols.append(", ");
return defaultCols.toString();
}
private String defaultRelColumns() {
StringBuffer defaultCols = new StringBuffer();
defaultCols.append(", ");
defaultCols.append("oea_name ");
defaultCols.append(OEFields.varchar(50));
return defaultCols.toString();
}
public String modelToTable(String model) {
return model.replaceAll("\\.", "_");
}
}