123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742 |
- /* ownCloud Android client application
- * Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package com.owncloud.android.providers;
- import java.util.ArrayList;
- import java.util.HashMap;
- import com.owncloud.android.R;
- import com.owncloud.android.db.ProviderMeta;
- import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
- import com.owncloud.android.lib.resources.files.FileUtils;
- import com.owncloud.android.lib.resources.shares.ShareType;
- import com.owncloud.android.utils.Log_OC;
- import android.content.ContentProvider;
- import android.content.ContentProviderOperation;
- import android.content.ContentProviderResult;
- import android.content.ContentUris;
- import android.content.ContentValues;
- import android.content.Context;
- import android.content.OperationApplicationException;
- import android.content.UriMatcher;
- import android.database.Cursor;
- import android.database.SQLException;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- import android.database.sqlite.SQLiteQueryBuilder;
- import android.net.Uri;
- import android.text.TextUtils;
- /**
- * The ContentProvider for the ownCloud App.
- *
- * @author Bartek Przybylski
- * @author David A. Velasco
- *
- */
- public class FileContentProvider extends ContentProvider {
- private DataBaseHelper mDbHelper;
- // Projection for filelist table
- private static HashMap<String, String> mFileProjectionMap;
- static {
- mFileProjectionMap = new HashMap<String, String>();
- mFileProjectionMap.put(ProviderTableMeta._ID, ProviderTableMeta._ID);
- mFileProjectionMap.put(ProviderTableMeta.FILE_PARENT,
- ProviderTableMeta.FILE_PARENT);
- mFileProjectionMap.put(ProviderTableMeta.FILE_PATH,
- ProviderTableMeta.FILE_PATH);
- mFileProjectionMap.put(ProviderTableMeta.FILE_NAME,
- ProviderTableMeta.FILE_NAME);
- mFileProjectionMap.put(ProviderTableMeta.FILE_CREATION,
- ProviderTableMeta.FILE_CREATION);
- mFileProjectionMap.put(ProviderTableMeta.FILE_MODIFIED,
- ProviderTableMeta.FILE_MODIFIED);
- mFileProjectionMap.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA,
- ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA);
- mFileProjectionMap.put(ProviderTableMeta.FILE_CONTENT_LENGTH,
- ProviderTableMeta.FILE_CONTENT_LENGTH);
- mFileProjectionMap.put(ProviderTableMeta.FILE_CONTENT_TYPE,
- ProviderTableMeta.FILE_CONTENT_TYPE);
- mFileProjectionMap.put(ProviderTableMeta.FILE_STORAGE_PATH,
- ProviderTableMeta.FILE_STORAGE_PATH);
- mFileProjectionMap.put(ProviderTableMeta.FILE_LAST_SYNC_DATE,
- ProviderTableMeta.FILE_LAST_SYNC_DATE);
- mFileProjectionMap.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA,
- ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA);
- mFileProjectionMap.put(ProviderTableMeta.FILE_KEEP_IN_SYNC,
- ProviderTableMeta.FILE_KEEP_IN_SYNC);
- mFileProjectionMap.put(ProviderTableMeta.FILE_ACCOUNT_OWNER,
- ProviderTableMeta.FILE_ACCOUNT_OWNER);
- mFileProjectionMap.put(ProviderTableMeta.FILE_ETAG,
- ProviderTableMeta.FILE_ETAG);
- mFileProjectionMap.put(ProviderTableMeta.FILE_SHARE_BY_LINK,
- ProviderTableMeta.FILE_SHARE_BY_LINK);
- mFileProjectionMap.put(ProviderTableMeta.FILE_PUBLIC_LINK,
- ProviderTableMeta.FILE_PUBLIC_LINK);
- }
- private static final int SINGLE_FILE = 1;
- private static final int DIRECTORY = 2;
- private static final int ROOT_DIRECTORY = 3;
- private static final int SHARES = 4;
- private static final String TAG = FileContentProvider.class.getSimpleName();
-
- // Projection for ocshares table
- private static HashMap<String, String> mOCSharesProjectionMap;
- static {
- mOCSharesProjectionMap = new HashMap<String, String>();
- mOCSharesProjectionMap.put(ProviderTableMeta._ID, ProviderTableMeta._ID);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_FILE_SOURCE,
- ProviderTableMeta.OCSHARES_FILE_SOURCE);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ITEM_SOURCE,
- ProviderTableMeta.OCSHARES_ITEM_SOURCE);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_SHARE_TYPE,
- ProviderTableMeta.OCSHARES_SHARE_TYPE);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_SHARE_WITH,
- ProviderTableMeta.OCSHARES_SHARE_WITH);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_PATH,
- ProviderTableMeta.OCSHARES_PATH);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_PERMISSIONS,
- ProviderTableMeta.OCSHARES_PERMISSIONS);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_SHARED_DATE,
- ProviderTableMeta.OCSHARES_SHARED_DATE);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE,
- ProviderTableMeta.OCSHARES_EXPIRATION_DATE);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_TOKEN,
- ProviderTableMeta.OCSHARES_TOKEN);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME,
- ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY,
- ProviderTableMeta.OCSHARES_IS_DIRECTORY);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_USER_ID,
- ProviderTableMeta.OCSHARES_USER_ID);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED,
- ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED);
- mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER,
- ProviderTableMeta.OCSHARES_ACCOUNT_OWNER);
- }
-
- private UriMatcher mUriMatcher;
-
- @Override
- public int delete(Uri uri, String where, String[] whereArgs) {
- Log_OC.d(TAG, "Deleting " + uri + " at provider " + this);
- int count = 0;
- SQLiteDatabase db = mDbHelper.getWritableDatabase();
- db.beginTransaction();
-
- // Get parentId to notify the change
- long parentId = getParentId(uri);
-
- // Delete action
- try {
- count = delete(db, uri, where, whereArgs);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- Log_OC.d(TAG, "Uri " + uri);
- getContext().getContentResolver().notifyChange(uri, null);
-
- // Notify the change to the parent folder
- notifyChangeToParentUri(parentId);
- return count;
- }
-
- private long getParentId(Uri uri) {
- long parentId = -1;
-
- if (mUriMatcher.match(uri) == SINGLE_FILE || mUriMatcher.match(uri) == DIRECTORY) {
- String fileId = uri.toString().substring(uri.toString().lastIndexOf(FileUtils.PATH_SEPARATOR) + 1);
- Uri selectFileUri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, fileId);
- String[] fileProjection = new String[] { ProviderTableMeta.FILE_PARENT };
- Cursor fileCursor = query(selectFileUri, fileProjection, null, null, null);
-
- if (fileCursor != null && fileCursor.moveToFirst()) {
- parentId = fileCursor.getLong(fileCursor.getColumnIndex(ProviderTableMeta.FILE_PARENT));
- }
- fileCursor.close();
- }
- Log_OC.d(TAG, "getParentId = " + parentId);
- return parentId;
- }
-
- private void notifyChangeToParentUri(long parentId) {
- if (parentId != -1) {
- Uri parentUri = Uri.withAppendedPath(
- ProviderTableMeta.CONTENT_URI_DIR,
- String.valueOf(parentId));
- Log_OC.d(TAG, "ParentUri " + parentUri);
- getContext().getContentResolver().notifyChange(parentUri, null);
- }
- }
-
- private int delete(SQLiteDatabase db, Uri uri, String where, String[] whereArgs) {
- int count = 0;
- switch (mUriMatcher.match(uri)) {
- case SINGLE_FILE:
- /*Cursor c = query(db, uri, null, where, whereArgs, null);
- String remotePath = "(unexisting)";
- if (c != null && c.moveToFirst()) {
- remotePath = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PATH));
- }
- Log_OC.d(TAG, "Removing FILE " + remotePath);
- */
- count = db.delete(ProviderTableMeta.FILE_TABLE_NAME,
- ProviderTableMeta._ID
- + "="
- + uri.getPathSegments().get(1)
- + (!TextUtils.isEmpty(where) ? " AND (" + where
- + ")" : ""), whereArgs);
- /* just for log
- if (c!=null) {
- c.close();
- }
- */
- break;
- case DIRECTORY:
- // deletion of folder is recursive
- /*
- Uri folderUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, Long.parseLong(uri.getPathSegments().get(1)));
- Cursor folder = query(db, folderUri, null, null, null, null);
- String folderName = "(unknown)";
- if (folder != null && folder.moveToFirst()) {
- folderName = folder.getString(folder.getColumnIndex(ProviderTableMeta.FILE_PATH));
- }
- */
- Cursor children = query(uri, null, null, null, null);
- if (children != null && children.moveToFirst()) {
- long childId;
- boolean isDir;
- //String remotePath;
- while (!children.isAfterLast()) {
- childId = children.getLong(children.getColumnIndex(ProviderTableMeta._ID));
- isDir = "DIR".equals(children.getString(children.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)));
- //remotePath = children.getString(children.getColumnIndex(ProviderTableMeta.FILE_PATH));
- if (isDir) {
- count += delete(db, ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_DIR, childId), null, null);
- } else {
- count += delete(db, ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, childId), null, null);
- }
- children.moveToNext();
- }
- children.close();
- } /*else {
- Log_OC.d(TAG, "No child to remove in DIRECTORY " + folderName);
- }
- Log_OC.d(TAG, "Removing DIRECTORY " + folderName + " (or maybe not) ");
- */
- count += db.delete(ProviderTableMeta.FILE_TABLE_NAME,
- ProviderTableMeta._ID
- + "="
- + uri.getPathSegments().get(1)
- + (!TextUtils.isEmpty(where) ? " AND (" + where
- + ")" : ""), whereArgs);
- /* Just for log
- if (folder != null) {
- folder.close();
- }*/
- break;
- case ROOT_DIRECTORY:
- //Log_OC.d(TAG, "Removing ROOT!");
- count = db.delete(ProviderTableMeta.FILE_TABLE_NAME, where, whereArgs);
- break;
- case SHARES:
- count = db.delete(ProviderTableMeta.OCSHARES_TABLE_NAME, where, whereArgs);
- break;
- default:
- //Log_OC.e(TAG, "Unknown uri " + uri);
- throw new IllegalArgumentException("Unknown uri: " + uri.toString());
- }
- return count;
- }
-
- @Override
- public String getType(Uri uri) {
- switch (mUriMatcher.match(uri)) {
- case ROOT_DIRECTORY:
- return ProviderTableMeta.CONTENT_TYPE;
- case SINGLE_FILE:
- return ProviderTableMeta.CONTENT_TYPE_ITEM;
- default:
- throw new IllegalArgumentException("Unknown Uri id."
- + uri.toString());
- }
- }
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- //Log_OC.d(TAG, "Inserting " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this);
- Log_OC.d(TAG, "Uri " + uri);
- Uri newUri = null;
- SQLiteDatabase db = mDbHelper.getWritableDatabase();
- db.beginTransaction();
-
- // Insert action
- try {
- newUri = insert(db, uri, values);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- getContext().getContentResolver().notifyChange(newUri, null);
-
- // Get parentId to notify the change
- long parentId = getParentId(newUri);
- // Notify the change to the parent folder
- notifyChangeToParentUri(parentId);
-
- return newUri;
- }
-
- private Uri insert(SQLiteDatabase db, Uri uri, ContentValues values) {
- switch (mUriMatcher.match(uri)){
- case ROOT_DIRECTORY:
- case SINGLE_FILE:
- String remotePath = values.getAsString(ProviderTableMeta.FILE_PATH);
- String accountName = values.getAsString(ProviderTableMeta.FILE_ACCOUNT_OWNER);
- String[] projection = new String[] {ProviderTableMeta._ID, ProviderTableMeta.FILE_PATH, ProviderTableMeta.FILE_ACCOUNT_OWNER };
- String where = ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?";
- String[] whereArgs = new String[] {remotePath, accountName};
- Cursor doubleCheck = query(db, uri, projection, where, whereArgs, null);
- if (doubleCheck == null || !doubleCheck.moveToFirst()) { // ugly patch; serious refactorization is needed to reduce work in FileDataStorageManager and bring it to FileContentProvider
- long rowId = db.insert(ProviderTableMeta.FILE_TABLE_NAME, null, values);
- if (rowId > 0) {
- Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId);
- //Log_OC.d(TAG, "Inserted " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this);
- return insertedFileUri;
- } else {
- //Log_OC.d(TAG, "Error while inserting " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this);
- throw new SQLException("ERROR " + uri);
- }
- } else {
- // file is already inserted; race condition, let's avoid a duplicated entry
- Uri insertedFileUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, doubleCheck.getLong(doubleCheck.getColumnIndex(ProviderTableMeta._ID)));
- doubleCheck.close();
- return insertedFileUri;
- }
-
- case SHARES:
- String path = values.getAsString(ProviderTableMeta.OCSHARES_PATH);
- String accountNameShare= values.getAsString(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER);
- String[] projectionShare = new String[] {ProviderTableMeta._ID, ProviderTableMeta.OCSHARES_PATH, ProviderTableMeta.OCSHARES_ACCOUNT_OWNER };
- String whereShare = ProviderTableMeta.OCSHARES_PATH + "=? AND " + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
- String[] whereArgsShare = new String[] {path, accountNameShare};
- Uri insertedShareUri = null;
- Cursor doubleCheckShare = query(db, uri, projectionShare, whereShare, whereArgsShare, null);
- if (doubleCheckShare == null || !doubleCheckShare.moveToFirst()) { // ugly patch; serious refactorization is needed to reduce work in FileDataStorageManager and bring it to FileContentProvider
- long rowId = db.insert(ProviderTableMeta.OCSHARES_TABLE_NAME, null, values);
- if (rowId >0) {
- insertedShareUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_SHARE, rowId);
- } else {
- throw new SQLException("ERROR " + uri);
- }
- } else {
- // file is already inserted; race condition, let's avoid a duplicated entry
- insertedShareUri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_SHARE, doubleCheckShare.getLong(doubleCheckShare.getColumnIndex(ProviderTableMeta._ID)));
- doubleCheckShare.close();
- }
- updateFilesTableAccordingToShareInsertion(db, uri, values);
- return insertedShareUri;
-
- default:
- throw new IllegalArgumentException("Unknown uri id: " + uri);
- }
-
- }
-
- private void updateFilesTableAccordingToShareInsertion(SQLiteDatabase db, Uri uri, ContentValues shareValues) {
- ContentValues fileValues = new ContentValues();
- fileValues.put(ProviderTableMeta.FILE_SHARE_BY_LINK,
- ShareType.PUBLIC_LINK.getValue() == shareValues.getAsInteger(ProviderTableMeta.OCSHARES_SHARE_TYPE)? 1 : 0);
- String whereShare = ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?";
- String[] whereArgsShare = new String[] {
- shareValues.getAsString(ProviderTableMeta.OCSHARES_PATH),
- shareValues.getAsString(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER)
- };
- db.update(ProviderTableMeta.FILE_TABLE_NAME, fileValues, whereShare, whereArgsShare);
- }
-
- @Override
- public boolean onCreate() {
- mDbHelper = new DataBaseHelper(getContext());
-
- String authority = getContext().getResources().getString(R.string.authority);
- mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- mUriMatcher.addURI(authority, null, ROOT_DIRECTORY);
- mUriMatcher.addURI(authority, "file/", SINGLE_FILE);
- mUriMatcher.addURI(authority, "file/#", SINGLE_FILE);
- mUriMatcher.addURI(authority, "dir/", DIRECTORY);
- mUriMatcher.addURI(authority, "dir/#", DIRECTORY);
- mUriMatcher.addURI(authority, "shares/", SHARES);
- mUriMatcher.addURI(authority, "shares/#", SHARES);
-
- return true;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
- Cursor result = null;
- SQLiteDatabase db = mDbHelper.getReadableDatabase();
- db.beginTransaction();
- try {
- result = query(db, uri, projection, selection, selectionArgs, sortOrder);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- return result;
- }
-
- private Cursor query(SQLiteDatabase db, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
- SQLiteQueryBuilder sqlQuery = new SQLiteQueryBuilder();
- sqlQuery.setTables(ProviderTableMeta.FILE_TABLE_NAME);
- sqlQuery.setProjectionMap(mFileProjectionMap);
- switch (mUriMatcher.match(uri)) {
- case ROOT_DIRECTORY:
- break;
- case DIRECTORY:
- String folderId = uri.getPathSegments().get(1);
- sqlQuery.appendWhere(ProviderTableMeta.FILE_PARENT + "="
- + folderId);
- break;
- case SINGLE_FILE:
- if (uri.getPathSegments().size() > 1) {
- sqlQuery.appendWhere(ProviderTableMeta._ID + "="
- + uri.getPathSegments().get(1));
- }
- break;
- case SHARES:
- sqlQuery.setTables(ProviderTableMeta.OCSHARES_TABLE_NAME);
- sqlQuery.setProjectionMap(mOCSharesProjectionMap);
- if (uri.getPathSegments().size() > 1) {
- sqlQuery.appendWhere(ProviderTableMeta._ID + "="
- + uri.getPathSegments().get(1));
- }
- break;
- default:
- throw new IllegalArgumentException("Unknown uri id: " + uri);
- }
- String order;
- if (TextUtils.isEmpty(sortOrder)) {
- if (mUriMatcher.match(uri) == SHARES) {
- order = ProviderTableMeta.OCSHARES_DEFAULT_SORT_ORDER;
- } else {
- order = ProviderTableMeta.FILE_DEFAULT_SORT_ORDER;
- }
- } else {
- order = sortOrder;
- }
- // DB case_sensitive
- db.execSQL("PRAGMA case_sensitive_like = true");
- Cursor c = sqlQuery.query(db, projection, selection, selectionArgs, null, null, order);
- Log_OC.d(TAG, "setting notification URI: " + uri);
- c.setNotificationUri(getContext().getContentResolver(), uri);
- return c;
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-
- Log_OC.d(TAG, "Updating " + values.getAsString(ProviderTableMeta.FILE_PATH) + " at provider " + this);
- Log_OC.d(TAG, "Uri " + uri);
- int count = 0;
- SQLiteDatabase db = mDbHelper.getWritableDatabase();
- db.beginTransaction();
- try {
- count = update(db, uri, values, selection, selectionArgs);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- getContext().getContentResolver().notifyChange(uri, null);
-
- // Get parentId to notify the change
- long parentId = getParentId(uri);
- // Notify the change to the parent folder
- notifyChangeToParentUri(parentId);
-
- return count;
- }
-
-
- private int update(SQLiteDatabase db, Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- switch (mUriMatcher.match(uri)) {
- case DIRECTORY:
- return 0; //updateFolderSize(db, selectionArgs[0]);
- case SHARES:
- return db.update(ProviderTableMeta.OCSHARES_TABLE_NAME, values, selection, selectionArgs);
- default:
- return db.update(ProviderTableMeta.FILE_TABLE_NAME, values, selection, selectionArgs);
- }
- }
- /*
- private int updateFolderSize(SQLiteDatabase db, String folderId) {
- int count = 0;
- String [] whereArgs = new String[] { folderId };
-
- // read current size saved for the folder
- long folderSize = 0;
- long folderParentId = -1;
- Uri selectFolderUri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, folderId);
- String[] folderProjection = new String[] { ProviderTableMeta.FILE_CONTENT_LENGTH, ProviderTableMeta.FILE_PARENT};
- String folderWhere = ProviderTableMeta._ID + "=?";
- Cursor folderCursor = query(db, selectFolderUri, folderProjection, folderWhere, whereArgs, null);
- if (folderCursor != null && folderCursor.moveToFirst()) {
- folderSize = folderCursor.getLong(folderCursor.getColumnIndex(ProviderTableMeta.FILE_CONTENT_LENGTH));;
- folderParentId = folderCursor.getLong(folderCursor.getColumnIndex(ProviderTableMeta.FILE_PARENT));;
- }
- folderCursor.close();
-
- // read and sum sizes of children
- long childrenSize = 0;
- Uri selectChildrenUri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, folderId);
- String[] childrenProjection = new String[] { ProviderTableMeta.FILE_CONTENT_LENGTH, ProviderTableMeta.FILE_PARENT};
- String childrenWhere = ProviderTableMeta.FILE_PARENT + "=?";
- Cursor childrenCursor = query(db, selectChildrenUri, childrenProjection, childrenWhere, whereArgs, null);
- if (childrenCursor != null && childrenCursor.moveToFirst()) {
- while (!childrenCursor.isAfterLast()) {
- childrenSize += childrenCursor.getLong(childrenCursor.getColumnIndex(ProviderTableMeta.FILE_CONTENT_LENGTH));
- childrenCursor.moveToNext();
- }
- }
- childrenCursor.close();
-
- // update if needed
- if (folderSize != childrenSize) {
- Log_OC.d("FileContentProvider", "Updating " + folderSize + " to " + childrenSize);
- ContentValues cv = new ContentValues();
- cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, childrenSize);
- count = db.update(ProviderTableMeta.FILE_TABLE_NAME, cv, folderWhere, whereArgs);
-
- // propagate update until root
- if (folderParentId > FileDataStorageManager.ROOT_PARENT_ID) {
- Log_OC.d("FileContentProvider", "Propagating update to " + folderParentId);
- updateFolderSize(db, String.valueOf(folderParentId));
- } else {
- Log_OC.d("FileContentProvider", "NOT propagating to " + folderParentId);
- }
- } else {
- Log_OC.d("FileContentProvider", "NOT updating, sizes are " + folderSize + " and " + childrenSize);
- }
- return count;
- }
- */
-
- @Override
- public ContentProviderResult[] applyBatch (ArrayList<ContentProviderOperation> operations) throws OperationApplicationException {
- Log_OC.d("FileContentProvider", "applying batch in provider " + this + " (temporary: " + isTemporary() + ")" );
- ContentProviderResult[] results = new ContentProviderResult[operations.size()];
- int i=0;
-
- SQLiteDatabase db = mDbHelper.getWritableDatabase();
- db.beginTransaction(); // it's supposed that transactions can be nested
- try {
- for (ContentProviderOperation operation : operations) {
- results[i] = operation.apply(this, results, i);
- i++;
- }
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- Log_OC.d("FileContentProvider", "applied batch in provider " + this);
- return results;
- }
- class DataBaseHelper extends SQLiteOpenHelper {
- public DataBaseHelper(Context context) {
- super(context, ProviderMeta.DB_NAME, null, ProviderMeta.DB_VERSION);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- // files table
- Log_OC.i("SQL", "Entering in onCreate");
- db.execSQL("CREATE TABLE " + ProviderTableMeta.FILE_TABLE_NAME + "("
- + ProviderTableMeta._ID + " INTEGER PRIMARY KEY, "
- + ProviderTableMeta.FILE_NAME + " TEXT, "
- + ProviderTableMeta.FILE_PATH + " TEXT, "
- + ProviderTableMeta.FILE_PARENT + " INTEGER, "
- + ProviderTableMeta.FILE_CREATION + " INTEGER, "
- + ProviderTableMeta.FILE_MODIFIED + " INTEGER, "
- + ProviderTableMeta.FILE_CONTENT_TYPE + " TEXT, "
- + ProviderTableMeta.FILE_CONTENT_LENGTH + " INTEGER, "
- + ProviderTableMeta.FILE_STORAGE_PATH + " TEXT, "
- + ProviderTableMeta.FILE_ACCOUNT_OWNER + " TEXT, "
- + ProviderTableMeta.FILE_LAST_SYNC_DATE + " INTEGER, "
- + ProviderTableMeta.FILE_KEEP_IN_SYNC + " INTEGER, "
- + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " INTEGER, "
- + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " INTEGER, "
- + ProviderTableMeta.FILE_ETAG + " TEXT, "
- + ProviderTableMeta.FILE_SHARE_BY_LINK + " INTEGER, "
- + ProviderTableMeta.FILE_PUBLIC_LINK + " TEXT );"
- );
-
- // Create table ocshares
- db.execSQL("CREATE TABLE " + ProviderTableMeta.OCSHARES_TABLE_NAME + "("
- + ProviderTableMeta._ID + " INTEGER PRIMARY KEY, "
- + ProviderTableMeta.OCSHARES_FILE_SOURCE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_ITEM_SOURCE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_SHARE_TYPE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_SHARE_WITH + " TEXT, "
- + ProviderTableMeta.OCSHARES_PATH + " TEXT, "
- + ProviderTableMeta.OCSHARES_PERMISSIONS+ " INTEGER, "
- + ProviderTableMeta.OCSHARES_SHARED_DATE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_EXPIRATION_DATE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_TOKEN + " TEXT, "
- + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME + " TEXT, "
- + ProviderTableMeta.OCSHARES_IS_DIRECTORY + " INTEGER, " // boolean
- + ProviderTableMeta.OCSHARES_USER_ID + " INTEGER, "
- + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER,"
- + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );" );
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- Log_OC.i("SQL", "Entering in onUpgrade");
- boolean upgraded = false;
- if (oldVersion == 1 && newVersion >= 2) {
- Log_OC.i("SQL", "Entering in the #1 ADD in onUpgrade");
- db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
- " ADD COLUMN " + ProviderTableMeta.FILE_KEEP_IN_SYNC + " INTEGER " +
- " DEFAULT 0");
- upgraded = true;
- }
- if (oldVersion < 3 && newVersion >= 3) {
- Log_OC.i("SQL", "Entering in the #2 ADD in onUpgrade");
- db.beginTransaction();
- try {
- db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
- " ADD COLUMN " + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " INTEGER " +
- " DEFAULT 0");
-
- // assume there are not local changes pending to upload
- db.execSQL("UPDATE " + ProviderTableMeta.FILE_TABLE_NAME +
- " SET " + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " = " + System.currentTimeMillis() +
- " WHERE " + ProviderTableMeta.FILE_STORAGE_PATH + " IS NOT NULL");
-
- upgraded = true;
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- }
- if (oldVersion < 4 && newVersion >= 4) {
- Log_OC.i("SQL", "Entering in the #3 ADD in onUpgrade");
- db.beginTransaction();
- try {
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
- " ADD COLUMN " + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " INTEGER " +
- " DEFAULT 0");
-
- db.execSQL("UPDATE " + ProviderTableMeta.FILE_TABLE_NAME +
- " SET " + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " = " + ProviderTableMeta.FILE_MODIFIED +
- " WHERE " + ProviderTableMeta.FILE_STORAGE_PATH + " IS NOT NULL");
-
- upgraded = true;
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- }
- if (!upgraded)
- Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + ", newVersion == " + newVersion);
-
- if (oldVersion < 5 && newVersion >= 5) {
- Log_OC.i("SQL", "Entering in the #4 ADD in onUpgrade");
- db.beginTransaction();
- try {
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
- " ADD COLUMN " + ProviderTableMeta.FILE_ETAG + " TEXT " +
- " DEFAULT NULL");
-
- upgraded = true;
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- }
- if (!upgraded)
- Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + ", newVersion == " + newVersion);
-
- if (oldVersion < 6 && newVersion >= 6) {
- Log_OC.i("SQL", "Entering in the #5 ADD in onUpgrade");
- db.beginTransaction();
- try {
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
- " ADD COLUMN " + ProviderTableMeta.FILE_SHARE_BY_LINK + " INTEGER " +
- " DEFAULT 0");
-
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
- " ADD COLUMN " + ProviderTableMeta.FILE_PUBLIC_LINK + " TEXT " +
- " DEFAULT NULL");
-
- // Create table ocshares
- db.execSQL("CREATE TABLE " + ProviderTableMeta.OCSHARES_TABLE_NAME + "("
- + ProviderTableMeta._ID + " INTEGER PRIMARY KEY, "
- + ProviderTableMeta.OCSHARES_FILE_SOURCE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_ITEM_SOURCE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_SHARE_TYPE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_SHARE_WITH + " TEXT, "
- + ProviderTableMeta.OCSHARES_PATH + " TEXT, "
- + ProviderTableMeta.OCSHARES_PERMISSIONS+ " INTEGER, "
- + ProviderTableMeta.OCSHARES_SHARED_DATE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_EXPIRATION_DATE + " INTEGER, "
- + ProviderTableMeta.OCSHARES_TOKEN + " TEXT, "
- + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME + " TEXT, "
- + ProviderTableMeta.OCSHARES_IS_DIRECTORY + " INTEGER, " // boolean
- + ProviderTableMeta.OCSHARES_USER_ID + " INTEGER, "
- + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER,"
- + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );" );
-
- upgraded = true;
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- }
- if (!upgraded)
- Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + ", newVersion == " + newVersion);
- }
- }
- }
|