Example #1
0
 /// <exception cref="Couchbase.Lite.Storage.SQLException"></exception>
 public static byte[] ByteArrayResultForQuery(SQLiteStorageEngine database, string
      query, string[] args)
 {
     byte[] result = null;
     Cursor cursor = database.RawQuery(query, args);
     if (cursor.MoveToNext())
     {
         result = cursor.GetBlob(0);
     }
     return result;
 }
        public static SQLiteStorageEngine CreateStorageEngine()
        {
            string classname = string.Empty;
            string resource  = "services/com.couchbase.lite.storage.SQLiteStorageEngine";

            try
            {
                InputStream inputStream = Sharpen.Thread.CurrentThread().GetContextClassLoader().
                                          GetResourceAsStream(resource);
                byte[] bytes = TextUtils.Read(inputStream);
                classname = Sharpen.Runtime.GetStringForBytes(bytes);
                Log.D(Database.Tag, "Loading storage engine: %s", classname);
                Type clazz = Sharpen.Runtime.GetType(classname);
                SQLiteStorageEngine storageEngine = (SQLiteStorageEngine)System.Activator.CreateInstance
                                                        (clazz);
                return(storageEngine);
            }
            catch (Exception e)
            {
                throw new RuntimeException("Failed to load storage.  Resource: " + resource + " classname: "
                                           + classname, e);
            }
        }
Example #3
0
		public bool Open()
		{
			if (open)
			{
				return true;
			}
			// Create the storage engine.
			database = SQLiteStorageEngineFactory.CreateStorageEngine();
			// Try to open the storage engine and stop if we fail.
			if (database == null || !database.Open(path))
			{
				string msg = "Unable to create a storage engine, fatal error";
				Log.E(Database.Tag, msg);
				throw new InvalidOperationException(msg);
			}
			// Stuff we need to initialize every time the sqliteDb opens:
			if (!Initialize("PRAGMA foreign_keys = ON;"))
			{
				Log.E(Database.Tag, "Error turning on foreign keys");
				return false;
			}
			// Check the user_version number we last stored in the sqliteDb:
			int dbVersion = database.GetVersion();
			// Incompatible version changes increment the hundreds' place:
			if (dbVersion >= 100)
			{
				Log.W(Database.Tag, "Database: Database version (" + dbVersion + ") is newer than I know how to work with"
					);
				database.Close();
				return false;
			}
			if (dbVersion < 1)
			{
				// First-time initialization:
				// (Note: Declaring revs.sequence as AUTOINCREMENT means the values will always be
				// monotonically increasing, never reused. See <http://www.sqlite.org/autoinc.html>)
				if (!Initialize(Schema))
				{
					database.Close();
					return false;
				}
				dbVersion = 3;
			}
			if (dbVersion < 2)
			{
				// Version 2: added attachments.revpos
				string upgradeSql = "ALTER TABLE attachments ADD COLUMN revpos INTEGER DEFAULT 0; "
					 + "PRAGMA user_version = 2";
				if (!Initialize(upgradeSql))
				{
					database.Close();
					return false;
				}
				dbVersion = 2;
			}
			if (dbVersion < 3)
			{
				string upgradeSql = "CREATE TABLE localdocs ( " + "docid TEXT UNIQUE NOT NULL, " 
					+ "revid TEXT NOT NULL, " + "json BLOB); " + "CREATE INDEX localdocs_by_docid ON localdocs(docid); "
					 + "PRAGMA user_version = 3";
				if (!Initialize(upgradeSql))
				{
					database.Close();
					return false;
				}
				dbVersion = 3;
			}
			if (dbVersion < 4)
			{
				string upgradeSql = "CREATE TABLE info ( " + "key TEXT PRIMARY KEY, " + "value TEXT); "
					 + "INSERT INTO INFO (key, value) VALUES ('privateUUID', '" + Misc.TDCreateUUID(
					) + "'); " + "INSERT INTO INFO (key, value) VALUES ('publicUUID',  '" + Misc.TDCreateUUID
					() + "'); " + "PRAGMA user_version = 4";
				if (!Initialize(upgradeSql))
				{
					database.Close();
					return false;
				}
			}
			try
			{
				attachments = new BlobStore(GetAttachmentStorePath());
			}
			catch (ArgumentException e)
			{
				Log.E(Database.Tag, "Could not initialize attachment store", e);
				database.Close();
				return false;
			}
			open = true;
			return true;
		}