1. 程式人生 > >owncloud原始碼分析2--資料庫增刪改查

owncloud原始碼分析2--資料庫增刪改查

資料庫增刪改查方法

把到目前位置整理的一起放在這裡

以下都是在這個中進行的操作:E:\wamp\www\owncloud\lib\private\files\cache\cache.php

1、增加

put方法中的如下圖位置插入資料


插入正確返回最新一條的id即插入的資料的id。(實現在E:\wamp\www\owncloud\lib\private\db\adapter.php中)

在這裡用這個連結插入資料

E:\wamp\www\owncloud\3rdparty\doctrine\dbal\lib\Doctrine\DBAL\Connection.php

 

2、刪除

remove方法,從資料庫移除資料


上面只是移除方法,具體刪除會先呼叫put方法,插入一條標識為已經刪除的本地資料,之後再呼叫上面的刪除方法,如果是有縮圖也會一併刪除。刪除時已經把檔案放到本地附帶刪除標記。如果恢復,會將本地檔案再上傳到伺服器,需要把刪除並儲存本地功能去掉。待解決:

E:\wamp\www\owncloud\lib\private\preview.php中有一個addPathToDeleteFileMapper方法

其中刪除之前還有個prepare_delete方法

E:\wamp\www\owncloud\lib\private\files\view.php中的basicOperation中的runPostProxies方法

E:\wamp\www\owncloud\apps\activity\lib\hooksstatic.php中的fileDelete刪除檔案

 ↓↓↓

E:\wamp\www\owncloud\apps\activity\lib\hooks.php中的fileDelete方法

  ↓↓↓

E:\wamp\www\owncloud\apps\activity\lib\hooks.php中的addNotificationsForFileAction

 ↓↓↓

E:\wamp\www\owncloud\apps\files_trashbin\lib\storage.php中的unlink方法請求刪除"ccc"資料夾

  ↓↓↓

E:\wamp\www\owncloud\apps\files_trashbin\lib\storage.php的doDelete方法進行進一步刪除

  ↓↓↓

E:\wamp\www\owncloud\apps\files_trashbin\lib\trashbin.php中的move2trash方法呼叫將檔案複製移動到本地位置留著恢復

  ↓↓↓

E:\wamp\www\owncloud\owncloud\lib\private\files\view.php得rename方法用來重新命名或者移動檔案其中使用了檔案流複製到本地位置,之後刪除遠端檔案

加個判斷如果path1="/files/FTP/1.jpg"包含FTP(是否是自己命名的待定)那麼直接刪除


就是以上的複製到本地並刪除檔案(紅線部分)修改之後可用,但是會儲存到files_trash表中,檔案沒有,files_cache也沒有。已刪除檔案處也不會顯示。

3、更改

(1)以更新檔名字為例

E:\wamp\www\owncloud\apps\files\lib\app.php中的rename方法

  ↓↓↓

E:\wamp\www\owncloud\lib\private\files\view.php這裡的rename方法來重新命名檔案

  ↓↓↓

E:\wamp\www\owncloud\apps\files_trashbin\lib\storage.php中的rename呼叫

E:\wamp\www\owncloud\apps\files_external\lib\streamwrapper.php的rename方法重新命名ftp的檔案

  ↓↓↓

E:\wamp\www\owncloud\lib\private\files\cache\updater.php中的rename方法重新命名資料庫中資料

  ↓↓↓

E:\wamp\www\owncloud\lib\private\files\cache\cache.php中的move方法中的


這條sql執行更新命令,over!!!!!!!!!

 

更新完還會change一大堆資訊,fuck!

 

rename完了回到view的rename方法,從第二道紅線繼續執行

最後返回資料到

E:\wamp\www\owncloud\apps\files\lib\app.php中的rename方法

  ↓↓↓

這下真over了算是!!!!

(2)修改更新txt檔案

E:\wamp\www\owncloud\apps\files_texteditor\ajax\savefile.php中的


上面紅線中的方法,修改內容。

4、查詢

查詢列表list.php為例

E:\wamp\www\owncloud\lib\private\files\cache\cache.php的getFolderContentsById($fileId)方法從資料庫選取資料

以上,over

資料庫連線處

E:\wamp\www\owncloud\lib\private\db.php的prepare方法


E:\wamp\www\owncloud\lib\private\server.php中的getDatabaseConnection方法

判斷是否是寫操作但是沒卵用啊,和資料庫分離又沒關係

E:\wamp\www\owncloud\3rdparty\doctrine\dbal\lib\Doctrine\DBAL\Connection.php的prepare方法

  ↓↓↓

E:\wamp\www\owncloud\3rdparty\doctrine\dbal\lib\Doctrine\DBAL\Connection.php的connection方法

 ↓↓↓

還有個E:\wamp\www\owncloud\3rdparty\doctrine\dbal\lib\Doctrine\DBAL\Driver\PDOConnection.php類

另起,以下準備修改主從,只是一個想法,沒實現:


以上可見,通過register方法將物件註冊到server物件中

根據以上修改如下:

E:\wamp\www\owncloud\lib\private\db\connectionfactory.php中加入了一個

/**
 * 設定從資料庫伺服器
 * @param \OC\SystemConfig $config
 * @return array
 */
public function createFConnectionParams($config) {

方法用來生成從伺服器的連結

在server.php的註冊方法中加入瞭如下方法:

$this->registerService('FDatabaseConnection', function (Server $c) {
   $factory = new \OC\DB\ConnectionFactory();
   $systemConfig = $c->getSystemConfig();
   $type = $systemConfig->getValue('dbtype', 'sqlite');
   if (!$factory->isValidType($type)) {
      throw new \OC\DatabaseException('Invalid database type');
   }
   $connectionParams = $factory->createFConnectionParams($systemConfig);
   $connection = $factory->getConnection($type, $connectionParams);
   $connection->getConfiguration()->setSQLLogger($c->getQueryLogger());
   return $connection;
});

註冊了一個從伺服器連結

繼續加入了

/**
 * 返回從伺服器的連結session
 * @return \OCP\IDBConnection
 */
function getFDatabaseConnection() {
   return $this->query('FDatabaseConnection');
}

獲取連結方法

以及註冊Fdb方法