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方法