/** * Odoo, Open Source Management Solution * Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero 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 Affero General Public License for more details * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http:www.gnu.org/licenses/> * * Created on 30/12/14 3:31 PM */ package com.odoo.core.orm; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Environment; import android.util.Log; import com.odoo.addons.crm.models.CRMCaseCateg; import com.odoo.addons.crm.models.CRMCaseStage; import com.odoo.App; import com.odoo.base.addons.BaseModels; import com.odoo.base.addons.mail.MailMessage; import com.odoo.base.addons.mail.MailMessageSubType; import com.odoo.config.Addons; import com.odoo.core.orm.fields.OColumn; import com.odoo.core.support.OUser; import com.odoo.core.support.addons.OAddon; import com.odoo.core.support.addons.fragment.IBaseFragment; import com.odoo.core.utils.OPreferenceManager; import java.util.ArrayList; import java.util.List; public class OSQLite extends SQLiteOpenHelper { public static final String TAG = OSQLite.class.getSimpleName(); public static final String KEY_MODEL_CLASS_REGISTER = "key_model_class_register"; public static final int DATABASE_VERSION = 2; private Context mContext; private OUser mUser = null; private Addons mAddons; private OPreferenceManager mPref; public OSQLite(Context context, OUser user) { super(context, (user != null) ? user.getDBName() : OUser.current(context).getDBName(), null , DATABASE_VERSION); mContext = context; mAddons = new Addons(); mUser = (user != null) ? user : OUser.current(context); mPref = new OPreferenceManager(mContext); synchronized (this) { if (!mPref.getBoolean(KEY_MODEL_CLASS_REGISTER, false)) { mPref.setBoolean(KEY_MODEL_CLASS_REGISTER, true); // Registering model class paths registerModelsClassPath(); } } } private List<OModel> getModels() { List<OModel> models = new ArrayList<>(); models.addAll(BaseModels.baseModels(mContext, mUser)); for (OAddon addon : mAddons.getAddons()) { IBaseFragment fragment = (IBaseFragment) addon.get(); try { Class<Object> model = fragment.database(); if (model != null) { OModel dbModel = (OModel) model.getConstructor(Context.class, OUser.class) .newInstance(mContext, mUser); models.add(dbModel); } } catch (Exception e) { Log.e(TAG, e.getMessage()); } } return models; } @Override public void onCreate(SQLiteDatabase db) { Log.i(TAG, "creating database."); OSQLHelper sqlHelper = new OSQLHelper(mContext); // Creating tables for (OModel model : getModels()) { sqlHelper.createStatements(model); } for (String key : sqlHelper.getStatements().keySet()) { String query = sqlHelper.getStatements().get(key); db.execSQL(query); Log.i(TAG, "Table Created : " + key); } registerModels(sqlHelper.getModels()); } private void registerModels(List<String> models) { OPreferenceManager mPref = new OPreferenceManager(mContext); if (mPref.putStringSet("models", models)) { Log.i(TAG, models.size() + " Models registered."); } else { Log.e(TAG, "Unable to register models"); } } private synchronized void registerModelsClassPath() { OSQLHelper sqlHelper = new OSQLHelper(mContext); List<OModel> modelsClassPath = sqlHelper.getAllModels(getModels()); for (OModel model : modelsClassPath) { String key = model.getModelName(); String path = model.getClass().getName(); // Setting class path mPref.putString(key, path); } Log.i(TAG, modelsClassPath.size() + " models path registered."); } private List<String> getColumns(String model_class, boolean server_columns) { List<String> cols = new ArrayList<String>(); try { OModel m = new OModel(mContext, null, null); Class<?> cls = Class.forName(model_class); OModel model = m.createInstance(cls); for (OColumn col : model.getColumns(!server_columns)) { cols.add(col.getName()); } } catch (Exception e) { e.printStackTrace(); } return cols; } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(TAG, "upgrading database."); // Updates in mail messages. added subtype_id MailMessageSubType subType = new MailMessageSubType(mContext, mUser); MailMessage mailMessage = new MailMessage(mContext, mUser); OSQLHelper osqlHelper; // Dropping mail message db.execSQL("DROP TABLE IF EXISTS mail_message "); // re-creating mail message and sub type osqlHelper = new OSQLHelper(mContext); osqlHelper.createStatements(subType); osqlHelper.createStatements(mailMessage); for (String key : osqlHelper.getStatements().keySet()) { String query = osqlHelper.getStatements().get(key); db.execSQL(query); } registerModelsClassPath(); registerModels(osqlHelper.getModels()); // Updating crm case stage model name for saas-6 if (mUser.getVersion_serie().equals("8.saas~6")) { osqlHelper = new OSQLHelper(mContext); CRMCaseCateg caseCateg = new CRMCaseCateg(mContext, mUser); CRMCaseStage caseStage = new CRMCaseStage(mContext, mUser); osqlHelper.createStatements(caseCateg); osqlHelper.createStatements(caseStage); registerModels(osqlHelper.getModels()); db.execSQL("ALTER TABLE crm_case_stage RENAME TO crm_stage"); db.execSQL("ALTER TABLE crm_case_categ RENAME TO crm_lead_tag"); } // OSQLHelper sqlHelper = new OSQLHelper(mContext); // for (OModel model : getModels()) { // sqlHelper.createDropStatements(model); // } // for (String key : sqlHelper.getStatements().keySet()) { // String query = sqlHelper.getStatements().get(key); // db.execSQL(query); // Log.i(TAG, "Table dropped " + key); // } // onCreate(db); } public void dropDatabase() { if (mContext.deleteDatabase(getDatabaseName())) { Log.i(TAG, getDatabaseName() + " database dropped."); } } public String databaseLocalPath() { App app = (App) mContext.getApplicationContext(); return Environment.getDataDirectory().getPath() + "/data/" + app.getPackageName() + "/databases/" + getDatabaseName(); } }