[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Fmsystem-commits] [11620] Merge 11614:11619 from trunk
From: |
Sigurd Nes |
Subject: |
[Fmsystem-commits] [11620] Merge 11614:11619 from trunk |
Date: |
Wed, 22 Jan 2014 17:26:10 +0000 |
Revision: 11620
http://svn.sv.gnu.org/viewvc/?view=rev&root=fmsystem&revision=11620
Author: sigurdne
Date: 2014-01-22 17:26:09 +0000 (Wed, 22 Jan 2014)
Log Message:
-----------
Merge 11614:11619 from trunk
Modified Paths:
--------------
branches/Version-1_0-branch/phpgwapi/setup/setup.inc.php
branches/Version-1_0-branch/phpgwapi/setup/tables_current.inc.php
branches/Version-1_0-branch/phpgwapi/setup/tables_update.inc.php
branches/Version-1_0-branch/property/inc/export/default/Agresso_X114
Added Paths:
-----------
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_braArkiv.inc.php
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php
Property Changed:
----------------
branches/Version-1_0-branch/
Property changes on: branches/Version-1_0-branch
___________________________________________________________________
Modified: svn:mergeinfo
-
/trunk:6439-6441,6443,6445-6447,6449-6464,6466-6468,6470-6474,6476-6477,6479-6480,6483-6488,6490-6491,6493-6494,6496-6501,6503-6504,6506,6508,6510-6511,6513,6515-6516,6518,6520-6524,6526-6528,6533-6534,6536-6541,6543-6565,6567,6569,6571-6576,6578,6580-6586,6588-6596,6598-6600,6602-6604,6606-6607,6609-6611,6613-6625,6629-6639,6641-6643,6645-6646,6648,6650-6654,6656-6659,6661-6663,6665-6666,6668-6669,6672-6673,6675,6677-6678,6680,6682-6686,6688-6717,6719,6721-6722,6724-6728,6730,6732-6734,6736-6739,6741,6743,6745-6746,6748-6756,6758-6762,6764,6766-6788,6790,6792-6798,6800-6814,6816-6819,6821-6822,6824-6826,6828-6837,6839,6841,6843-6849,6851,6853-6869,6871-6874,6876-6877,6879,6881,6883,6885-6886,6888-6893,6895-6897,6899-6901,6903,6905-6907,6909,6911-6929,6931-6936,6938-6947,6949,6951,6953,6955-6956,6958-6959,6961-6968,6970-6971,6973-6974,6976-6978,6980,6982-7017,7019-7025,7027-7035,7037-7039,7041-7045,7047-7055,7057,7059-7065,7067-7069,7071,7073,7075-7076,7078,7080-7081,7083,7085,7087,7089-7097,7099-7102,7104-7105,7107-7111,7113-7120,7122-7124,7126-7129,7131,7133-7141,7143,7145-7146,7148-7150,7152-7153,7155-7158,7160-7164,7166-7167,7169-7170,7172,7174,7176,7178,7180-7181,7183,7185,7187-7188,7190,7192-7196,7198-7199,7201-7203,7205,7207,7209-7210,7212,7214,7216-7217,7219-7222,7224-7226,7228-7229,7231,7233-7234,7236-7238,7240-7241,7243-7244,7246,7248,7250,7252-7256,7258-7259,7261-7264,7266-7273,7275-7279,7281-7332,7334-7338,7340-7348,7350,7352-7353,7355-7361,7363-7366,7368-7370,7372,7374,7376,7378,7380-7386,7388-7400,7402,7404-7433,7435-7439,7441-7446,7448-7458,7460-7469,7471-7483,7485-7487,7489-7490,7492,7494,7496-7497,7499,7501-7502,7504,7506-7507,7509-7511,7513-7517,7519-7521,7523,7525,7527-7529,7531,7533,7535-7538,7540-7542,7544-7549,7551-7552,7554-7561,7563,7565,7567-7573,7575-7578,7580-7584,7586-7591,7593-7624,7627-7636,7638-7656,7658-7718,7720-7732,7734,7736,7738-7750,7754-7759,7761-7767,7769-7780,7782,7784-7809,7811-7812,7814-7835,7837-7847,7849-7887,7889-7895,7897,7899,7901,7903-7905,7907-7921,7923-7925,7927-7933,7935,7937-7952,7954-7968,7970-7974,7976,7978-7979,7981-7982,7984-7988,7990-7992,7994-8041,8043-8066,8068-8087,8089,8091-8108,8110-8124,8126-8129,8131,8133-8150,8152-8154,8156-8162,8164-8167,8169-8170,8172-8179,8181,8183-8196,8198-8207,8209-8211,8213-8214,8216-8217,8219-8220,8222,8224-8225,8227-8247,8249,8251,8253-8282,8284-8352,8354-8368,8370-8396,8398-8430,8432,8434-8440,8442-8445,8447-8453,8455-8456,8458,8460,8462-8464,8466-8473,8475-8479,8481,8483-8501,8503-8523,8525,8527-8531,8533,8535-8536,8538-8550,8552-8554,8556-8557,8559-8579,8581-8587,8589,8591-8592,8594-8595,8597-8601,8603-8610,8612-8613,8615,8617,8619-8645,8647-8650,8652-8661,8663-8666,8668-8669,8671-8683,8685-8691,8693-8730,8732-8737,8739,8741-8767,8769,8771-8772,8774,8776-8797,8799-8812,8814-8819,8821,8823-8833,8835-8837,8839,8841,8843-8849,8852-8858,8860-8867,8869-8870,8872,8874-8877,8879,8881,8883-8888,8890,8892-8901,8903-8911,8913-8917,8920-8923,8925-8933,8935-8938,8940-8943,8945,8947-8948,8950,8952-8953,8955-8962,8964,8966,8968-8970,8972-8975,8977-8983,8985-8993,8995-9001,9003,9005,9007,9009,9011-9019,9021-9023,9025,9027-9028,9030-9044,9046-9047,9049-9050,9052-9056,9058-9059,9061,9063-9064,9066-9068,9071-9092,9094-9112,9114-9117,9119,9121-9160,9162-9166,9169-9207,9209-9211,9213-9215,9217,9219,9221-9253,9255,9257,9259-9260,9262,9264-9269,9271-9273,9275,9277-9278,9280,9282-9283,9285-9289,9291-9299,9301-9310,9312-9313,9315-9320,9322-9324,9326-9338,9340-9342,9344,9346-9348,9350-9358,9360-9362,9364-9366,9368-9374,9376-9382,9384,9386,9388-9390,9392-9396,9398-9402,9404-9410,9412,9414,9416-9417,9419-9425,9427,9429-9430,9432,9434-9463,9465-9502,9504-9506,9508-9521,9523-9526,9528,9530-9537,9539,9541-9551,9553,9555-9556,9558-9578,9580-9581,9583,9585,9587,9589,9591-9624,9626-9655,9657-9700,9702-9726,9728-9729,9731-9749,9751,9753-9754,9756-9832,9834-9836,9838-9839,9841-9846,9848-9850,9852-9858,9860-9863,9865,9867,9869-9871,9873-9893,9895,9897-9912,9914-9919,9921-9928,9930-9952,9954,9956,9958-9963,9965-9993,9995-9997,9999-10001,10003-10004,10006-10007,10009-10012,10014-10031,10033-10073,10075-10107,10109-10165,10167-10210,10222-10226,10228-10311,10313-10378,10380,10382,10384-10393,10395-10478,10480-10482,10484-10494,10496-10503,10505,10507,10509-10521,10523,10525-10528,10530-10540,10542-10543,10545-10568,10570-10584,10586-10590,10592-10594,10596,10598-10599,10601-10611,10613,10615,10617-10626,10628-10636,10638,10640-10654,10656-10658,10660,10662-10672,10674,10676-10682,10684,10686,10688-10690,10692-10694,10696-10697,10699-10701,10703,10705-10706,10708-10724,10726-10731,10734,10736-10748,10750-10796,10798-10939,10941,10943,10945,10947-10953,10955,10957-10961,10963,10965-10966,10968-11001,11003-11030,11032-11034,11036,11038,11040,11042-11053,11055-11059,11061-11062,11064-11068,11070-11073,11075-11077,11079-11083,11085,11087-11088,11090-11093,11095-11108,11110-11111,11113,11115-11116,11118-11120,11122,11124-11129,11131-11132,11134,11136,11138,11140-11151,11153-11161,11163-11185,11187-11189,11191-11229,11231,11233,11235-11264,11266-11267,11269-11278,11280-11282,11284-11291,11293-11295,11297,11299-11302,11304,11306,11309,11311,11313-11316,11318-11323,11325-11332,11334,11336-11344,11346,11348-11354,11356,11358-11360,11363-11386,11388-11389,11391-11392,11394,11396-11403,11405-11406,11408,11410,11412,11415,11417,11419-11420,11422,11424-11429,11431-11442,11444-11445,11447-11460,11462-11464,11466-11470,11472-11475,11477-11478,11480-11487,11489-11492,11494,11496,11498,11500-11502,11504-11506,11508,11510-11511,11513,11515,11517-11523,11525-11526,11528-11531,11533,11535-11538,11540-11546,11548-11560,11563-11572,11574,11576,11578,11580-11581,11583,11585,11587,11589-11592,11594-11595,11597,11599,11601,11603,11605-11607,11609-11611,11613
+
/trunk:6439-6441,6443,6445-6447,6449-6464,6466-6468,6470-6474,6476-6477,6479-6480,6483-6488,6490-6491,6493-6494,6496-6501,6503-6504,6506,6508,6510-6511,6513,6515-6516,6518,6520-6524,6526-6528,6533-6534,6536-6541,6543-6565,6567,6569,6571-6576,6578,6580-6586,6588-6596,6598-6600,6602-6604,6606-6607,6609-6611,6613-6625,6629-6639,6641-6643,6645-6646,6648,6650-6654,6656-6659,6661-6663,6665-6666,6668-6669,6672-6673,6675,6677-6678,6680,6682-6686,6688-6717,6719,6721-6722,6724-6728,6730,6732-6734,6736-6739,6741,6743,6745-6746,6748-6756,6758-6762,6764,6766-6788,6790,6792-6798,6800-6814,6816-6819,6821-6822,6824-6826,6828-6837,6839,6841,6843-6849,6851,6853-6869,6871-6874,6876-6877,6879,6881,6883,6885-6886,6888-6893,6895-6897,6899-6901,6903,6905-6907,6909,6911-6929,6931-6936,6938-6947,6949,6951,6953,6955-6956,6958-6959,6961-6968,6970-6971,6973-6974,6976-6978,6980,6982-7017,7019-7025,7027-7035,7037-7039,7041-7045,7047-7055,7057,7059-7065,7067-7069,7071,7073,7075-7076,7078,7080-7081,7083,7085,7087,7089-7097,7099-7102,7104-7105,7107-7111,7113-7120,7122-7124,7126-7129,7131,7133-7141,7143,7145-7146,7148-7150,7152-7153,7155-7158,7160-7164,7166-7167,7169-7170,7172,7174,7176,7178,7180-7181,7183,7185,7187-7188,7190,7192-7196,7198-7199,7201-7203,7205,7207,7209-7210,7212,7214,7216-7217,7219-7222,7224-7226,7228-7229,7231,7233-7234,7236-7238,7240-7241,7243-7244,7246,7248,7250,7252-7256,7258-7259,7261-7264,7266-7273,7275-7279,7281-7332,7334-7338,7340-7348,7350,7352-7353,7355-7361,7363-7366,7368-7370,7372,7374,7376,7378,7380-7386,7388-7400,7402,7404-7433,7435-7439,7441-7446,7448-7458,7460-7469,7471-7483,7485-7487,7489-7490,7492,7494,7496-7497,7499,7501-7502,7504,7506-7507,7509-7511,7513-7517,7519-7521,7523,7525,7527-7529,7531,7533,7535-7538,7540-7542,7544-7549,7551-7552,7554-7561,7563,7565,7567-7573,7575-7578,7580-7584,7586-7591,7593-7624,7627-7636,7638-7656,7658-7718,7720-7732,7734,7736,7738-7750,7754-7759,7761-7767,7769-7780,7782,7784-7809,7811-7812,7814-7835,7837-7847,7849-7887,7889-7895,7897,7899,7901,7903-7905,7907-7921,7923-7925,7927-7933,7935,7937-7952,7954-7968,7970-7974,7976,7978-7979,7981-7982,7984-7988,7990-7992,7994-8041,8043-8066,8068-8087,8089,8091-8108,8110-8124,8126-8129,8131,8133-8150,8152-8154,8156-8162,8164-8167,8169-8170,8172-8179,8181,8183-8196,8198-8207,8209-8211,8213-8214,8216-8217,8219-8220,8222,8224-8225,8227-8247,8249,8251,8253-8282,8284-8352,8354-8368,8370-8396,8398-8430,8432,8434-8440,8442-8445,8447-8453,8455-8456,8458,8460,8462-8464,8466-8473,8475-8479,8481,8483-8501,8503-8523,8525,8527-8531,8533,8535-8536,8538-8550,8552-8554,8556-8557,8559-8579,8581-8587,8589,8591-8592,8594-8595,8597-8601,8603-8610,8612-8613,8615,8617,8619-8645,8647-8650,8652-8661,8663-8666,8668-8669,8671-8683,8685-8691,8693-8730,8732-8737,8739,8741-8767,8769,8771-8772,8774,8776-8797,8799-8812,8814-8819,8821,8823-8833,8835-8837,8839,8841,8843-8849,8852-8858,8860-8867,8869-8870,8872,8874-8877,8879,8881,8883-8888,8890,8892-8901,8903-8911,8913-8917,8920-8923,8925-8933,8935-8938,8940-8943,8945,8947-8948,8950,8952-8953,8955-8962,8964,8966,8968-8970,8972-8975,8977-8983,8985-8993,8995-9001,9003,9005,9007,9009,9011-9019,9021-9023,9025,9027-9028,9030-9044,9046-9047,9049-9050,9052-9056,9058-9059,9061,9063-9064,9066-9068,9071-9092,9094-9112,9114-9117,9119,9121-9160,9162-9166,9169-9207,9209-9211,9213-9215,9217,9219,9221-9253,9255,9257,9259-9260,9262,9264-9269,9271-9273,9275,9277-9278,9280,9282-9283,9285-9289,9291-9299,9301-9310,9312-9313,9315-9320,9322-9324,9326-9338,9340-9342,9344,9346-9348,9350-9358,9360-9362,9364-9366,9368-9374,9376-9382,9384,9386,9388-9390,9392-9396,9398-9402,9404-9410,9412,9414,9416-9417,9419-9425,9427,9429-9430,9432,9434-9463,9465-9502,9504-9506,9508-9521,9523-9526,9528,9530-9537,9539,9541-9551,9553,9555-9556,9558-9578,9580-9581,9583,9585,9587,9589,9591-9624,9626-9655,9657-9700,9702-9726,9728-9729,9731-9749,9751,9753-9754,9756-9832,9834-9836,9838-9839,9841-9846,9848-9850,9852-9858,9860-9863,9865,9867,9869-9871,9873-9893,9895,9897-9912,9914-9919,9921-9928,9930-9952,9954,9956,9958-9963,9965-9993,9995-9997,9999-10001,10003-10004,10006-10007,10009-10012,10014-10031,10033-10073,10075-10107,10109-10165,10167-10210,10222-10226,10228-10311,10313-10378,10380,10382,10384-10393,10395-10478,10480-10482,10484-10494,10496-10503,10505,10507,10509-10521,10523,10525-10528,10530-10540,10542-10543,10545-10568,10570-10584,10586-10590,10592-10594,10596,10598-10599,10601-10611,10613,10615,10617-10626,10628-10636,10638,10640-10654,10656-10658,10660,10662-10672,10674,10676-10682,10684,10686,10688-10690,10692-10694,10696-10697,10699-10701,10703,10705-10706,10708-10724,10726-10731,10734,10736-10748,10750-10796,10798-10939,10941,10943,10945,10947-10953,10955,10957-10961,10963,10965-10966,10968-11001,11003-11030,11032-11034,11036,11038,11040,11042-11053,11055-11059,11061-11062,11064-11068,11070-11073,11075-11077,11079-11083,11085,11087-11088,11090-11093,11095-11108,11110-11111,11113,11115-11116,11118-11120,11122,11124-11129,11131-11132,11134,11136,11138,11140-11151,11153-11161,11163-11185,11187-11189,11191-11229,11231,11233,11235-11264,11266-11267,11269-11278,11280-11282,11284-11291,11293-11295,11297,11299-11302,11304,11306,11309,11311,11313-11316,11318-11323,11325-11332,11334,11336-11344,11346,11348-11354,11356,11358-11360,11363-11386,11388-11389,11391-11392,11394,11396-11403,11405-11406,11408,11410,11412,11415,11417,11419-11420,11422,11424-11429,11431-11442,11444-11445,11447-11460,11462-11464,11466-11470,11472-11475,11477-11478,11480-11487,11489-11492,11494,11496,11498,11500-11502,11504-11506,11508,11510-11511,11513,11515,11517-11523,11525-11526,11528-11531,11533,11535-11538,11540-11546,11548-11560,11563-11572,11574,11576,11578,11580-11581,11583,11585,11587,11589-11592,11594-11595,11597,11599,11601,11603,11605-11607,11609-11611,11613,11615-11619
Copied: branches/Version-1_0-branch/phpgwapi/inc/class.vfs_braArkiv.inc.php
(from rev 11619, trunk/phpgwapi/inc/class.vfs_braArkiv.inc.php)
===================================================================
--- branches/Version-1_0-branch/phpgwapi/inc/class.vfs_braArkiv.inc.php
(rev 0)
+++ branches/Version-1_0-branch/phpgwapi/inc/class.vfs_braArkiv.inc.php
2014-01-22 17:26:09 UTC (rev 11620)
@@ -0,0 +1,2846 @@
+<?php
+ /**
+ * Virtual File System with SQL backend
+ * @author Jason Wies <address@hidden>
+ * @author Giancarlo Susin
+ * @copyright Copyright(C) 2001 Jason Wies
+ * @copyright Copyright(C) 2004 Free Software Foundation, Inc.
http://www.fsf.org/
+ * @license http://www.fsf.org/licenses/lgpl.html GNU Lesser General
Public License
+ * @package phpgwapi
+ * @subpackage vfs
+ * @version $Id: class.vfs_sql.inc.php 11334 2013-09-26 18:13:25Z
sigurdne $
+ */
+
+ /**
+ * VFS SQL select
+ * @see extra_sql()
+ */
+ define('VFS_SQL_SELECT', 1);
+ /**
+ * VFS SQL delete
+ * @see extra_sql()
+ */
+ define('VFS_SQL_DELETE', 2);
+ /**
+ * VFS SQL update
+ * @see extra_sql()
+ */
+ define('VFS_SQL_UPDATE', 4);
+
+
+ /**
+ * Virtual File System with SQL backend
+ *
+ * @package phpgwapi
+ * @subpackage vfs
+ * @ignore
+ */
+ class phpgwapi_vfs extends phpgwapi_vfs_shared
+ {
+ var $file_actions;
+ var $acl_default;
+
+ /**
+ * constructor, sets up variables
+ *
+ */
+ function __construct()
+ {
+ parent::__construct();
+ /*
+ File/dir attributes, each corresponding to a
database field. Useful for use in loops
+ If an attribute was added to the table, add it here
and possibly add it to
+ set_attributes()
+
+ set_attributes now uses this array(). 07-Dec-01
skeeter
+ */
+
+ $this->attributes[] = 'deleteable';
+ $this->attributes[] = 'content';
+
+ /*
+ Decide whether to use any actual filesystem
calls(fopen(), fread(),
+ unlink(), rmdir(), touch(), etc.). If not, then
we're working completely
+ in the database.
+ */
+ $conf = CreateObject('phpgwapi.config', 'phpgwapi');
+ $conf->read();
+ if($conf->config_data['file_store_contents'] ==
'filesystem' || !$conf->config_data['file_store_contents'])
+ {
+ $this->file_actions = 1;
+ }
+ else
+ {
+ $this->file_actions = 0;
+ }
+
+ $this->acl_default = $conf->config_data['acl_default'];
+
+ // test if the files-dir is inside the document-root,
and refuse working if so
+ //
+ if($this->file_actions &&
$this->in_docroot($this->basedir))
+ {
+ $GLOBALS['phpgw']->common->phpgw_header();
+ if($GLOBALS['phpgw_info']['flags']['noheader'])
+ {
+ echo parse_navbar();
+ }
+ echo '<p align="center"><font
color="red"><b>'.lang('Path to user and group files HAS TO BE OUTSIDE of the
webservers document-root!!!')."</b></font></p>\n";
+ $GLOBALS['phpgw']->common->phpgw_exit();
+ }
+
+ /* We store the linked directories in an array now, so
we don't have to make the SQL call again */
+ if($GLOBALS['phpgw_info']['server']['db_type']=='mssql'
+ ||
$GLOBALS['phpgw_info']['server']['db_type']=='sybase')
+ {
+ $query = $GLOBALS['phpgw']->db->query("SELECT
directory, name, link_directory, link_name"
+ . " FROM phpgw_vfs WHERE
CONVERT(varchar,link_directory) != ''"
+ . " AND CONVERT(varchar,link_name) != ''" .
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__,__FILE__);
+ }
+ else
+ {
+ $query = $GLOBALS['phpgw']->db->query("SELECT
directory, name, link_directory, link_name"
+ . " FROM phpgw_vfs WHERE(link_directory IS NOT
NULL or link_directory != '')"
+ . " AND(link_name IS NOT NULL or link_name !=
'')" . $this->extra_sql(array('query_type' => VFS_SQL_SELECT)),
__LINE__,__FILE__);
+ }
+
+ $this->linked_dirs = array();
+ while($GLOBALS['phpgw']->db->next_record())
+ {
+ $this->linked_dirs[] = $this->Record();
+ }
+
+ $this->fileoperation =
CreateObject('phpgwapi.vfs_fileoperation_braArkiv');
+
+ }
+
+ /**
+ * test if $path lies within the webservers document-root
+ *
+ */
+ function in_docroot($path)
+ {
+ //$docroots = array(PHPGW_SERVER_ROOT,
$_SERVER['DOCUMENT_ROOT']);
+ $docroots = array(PHPGW_SERVER_ROOT);
+ //in case vfs is called from cli(cron-job)
+
+ if($_SERVER['DOCUMENT_ROOT'])
+ {
+ $docroots[] = $_SERVER['DOCUMENT_ROOT'];
+ }
+
+ foreach($docroots as $docroot)
+ {
+ $len = strlen($docroot);
+
+ if($docroot == substr($path,0,$len))
+ {
+ $rest = substr($path,$len);
+
+ if(!strlen($rest) || $rest[0] ==
DIRECTORY_SEPARATOR)
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Return extra SQL code that should be appended to certain
queries
+ *
+ * @param query_type The type of query to get extra SQL code
for, in the form of a VFS_SQL define
+ * @return Extra SQL code
+ */
+ function extra_sql($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array('query_type' => VFS_SQL_SELECT);
+ }
+
+ if($data['query_type'] == VFS_SQL_SELECT ||
$data['query_type'] == VFS_SQL_DELETE || $data['query_type'] = VFS_SQL_UPDATE)
+ {
+ $sql = ' AND((';
+
+ reset($this->meta_types);
+ while(list($num, $type) =
each($this->meta_types))
+ {
+ if($num)
+ {
+ $sql .= ' AND ';
+ }
+
+ $sql .= "mime_type != '{$type}'";
+ }
+ $sql .= ') OR mime_type IS NULL)';
+ }
+
+ return($sql);
+ }
+
+ /**
+ * Add a journal entry after(or before) completing an operation,
+ *
+ * and increment the version number. This function
should be used internally only
+ * Note that state_one and state_two are ignored for some
VFS_OPERATION's, for others
+ * * they are required. They are ignored for any
"custom" operation
+ * * The two operations that require state_two:
+ * * operation * state_two
+ * * VFS_OPERATION_COPIED fake_full_path of
copied to
+ * * VFS_OPERATION_MOVED *
fake_full_path of moved to
+
+ * * If deleting, you must call add_journal()
before you delete the entry from the database
+ * @param string File or directory to add entry for
+ * @param relatives Relativity array
+ * @param operation The operation that was performed. Either a
VFS_OPERATION define or
+ * * a non-integer descriptive text string
+ * @param state_one The first "state" of the file or directory.
Can be a file name, size,
+ * * location, whatever is appropriate for the
specific operation
+ * @param state_two The second "state" of the file or directory
+ * @param incversion Boolean True/False. Increment the version
for the file? Note that this is
+ * * handled automatically for the
VFS_OPERATION defines.
+ * * i.e. VFS_OPERATION_EDITED would increment
the version, VFS_OPERATION_COPIED
+ * * would not
+ * @return Boolean True/False
+ */
+ function add_journal($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT),
+ 'state_one' => false,
+ 'state_two' => false,
+ 'incversion' => true
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $account_id =
$GLOBALS['phpgw_info']['user']['account_id'];
+
+ $p = $this->path_parts(array('string' =>
$data['string'], 'relatives' => array($data['relatives'][0])));
+
+ /* We check that they have some sort of access to the
file other than read */
+ if(!$this->acl_check(array('string' =>
$p->fake_full_path, 'relatives' => array($p->mask), 'operation' =>
PHPGW_ACL_ADD)) &&
+ !$this->acl_check(array('string' =>
$p->fake_full_path, 'relatives' => array($p->mask), 'operation' =>
PHPGW_ACL_EDIT)) &&
+ !$this->acl_check(array('string' =>
$p->fake_full_path, 'relatives' => array($p->mask), 'operation' =>
PHPGW_ACL_DELETE)))
+ {
+ return false;
+ }
+
+ if(!$this->file_exists(array('string' =>
$p->fake_full_path, 'relatives' => array($p->mask))))
+ {
+ return false;
+ }
+
+ $ls_array = $this->ls(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'checksubdirs' => false,
+ 'mime_type' => false,
+ 'nofiles' => true
+ )
+ );
+ $file_array = $ls_array[0];
+
+ $sql = 'INSERT INTO phpgw_vfs(';
+ $sql2 = ' VALUES(';
+ $morethanone = false;
+ $modified = false;
+
+ for($i = 0; list($attribute, $value) =
each($file_array); $i++)
+ {
+ if($attribute == 'file_id' || $attribute ==
'content')
+ {
+ continue;
+ }
+
+ if($attribute == 'owner_id')
+ {
+ $value = $account_id;
+ }
+
+ if($attribute == 'created')
+ {
+ $value = $this->now;
+ }
+
+ if($attribute == 'modified' && !$modified)
+ {
+ unset($value);
+ }
+
+ if($attribute == 'mime_type')
+ {
+ $value = 'journal';
+ }
+
+ if($attribute == 'comment')
+ {
+ switch($data['operation'])
+ {
+ case VFS_OPERATION_CREATED:
+ $value = 'Created';
+ $data['incversion'] =
true;
+ break;
+ case VFS_OPERATION_EDITED:
+ $value = 'Edited';
+ $data['incversion'] =
true;
+ break;
+ case
VFS_OPERATION_EDITED_COMMENT:
+ $value = 'Edited
comment';
+ $data['incversion'] =
false;
+ break;
+ case VFS_OPERATION_COPIED:
+ if(!$data['state_one'])
+ {
+
$data['state_one'] = $p->fake_full_path;
+ }
+ if(!$data['state_two'])
+ {
+ return false;
+ }
+ $value = "Copied
{$data['state_one']} to {$data['state_two']}";
+ $data['incversion'] =
false;
+ break;
+ case VFS_OPERATION_MOVED:
+ if(!$data['state_one'])
+ {
+
$data['state_one'] = $p->fake_full_path;
+ }
+ if(!$data['state_two'])
+ {
+ return false;
+ }
+ $value = "Moved
{$data['state_one']} to {$data['state_two']}";
+ $data['incversion'] =
false;
+ break;
+ case VFS_OPERATION_DELETED:
+ $value = 'Deleted';
+ $data['incversion'] =
false;
+ break;
+ default:
+ $value =
$data['operation'];
+ break;
+ }
+ }
+
+ /*
+ Let's increment the version for the file
itself. We keep the current
+ version when making the journal entry,
because that was the version that
+ was operated on. The maximum numbers for
each part in the version string:
+ none.99.9.9
+ */
+ if($attribute == 'version' &&
$data['incversion'])
+ {
+ $version_parts = explode(".", $value);
+ $newnumofparts = $numofparts =
count($version_parts);
+
+ if($version_parts[3] >= 9)
+ {
+ $version_parts[3] = 0;
+ $version_parts[2]++;
+ $version_parts_3_update = 1;
+ }
+ else if(isset($version_parts[3]))
+ {
+ $version_parts[3]++;
+ }
+
+ if($version_parts[2] >= 9 &&
$version_parts[3] == 0 && $version_parts_3_update)
+ {
+ $version_parts[2] = 0;
+ $version_parts[1]++;
+ }
+
+ if($version_parts[1] > 99)
+ {
+ $version_parts[1] = 0;
+ $version_parts[0]++;
+ }
+ $newversion = '';
+ for($j = 0; $j < $newnumofparts; $j++)
+ {
+ if(!isset($version_parts[$j]))
+ {
+ break;
+ }
+
+ if($j)
+ {
+ $newversion .= '.';
+ }
+
+ $newversion .=
$version_parts[$j];
+ }
+
+ $this->set_attributes(array(
+ 'string'
=> $p->fake_full_path,
+ 'relatives'
=> array($p->mask),
+ 'attributes' =>
array(
+
'version' => $newversion
+ )
+ )
+ );
+ }
+ if(isset($value) && !empty($value))
+ {
+ if($morethanone)
+ {
+ $sql .= ', ';
+ $sql2 .= ', ';
+ }
+ else
+ {
+ $morethanone = true;
+ }
+ $sql .= "$attribute";
+ $sql2 .= "'" .
$this->clean_string(array('string' => $value)) . "'";
+ }
+ }
+ unset($morethanone);
+ $sql .= ')';
+ $sql2 .= ')';
+
+ $sql .= $sql2;
+
+ /*
+ These are some special situations where we need to
flush the journal entries
+ or move the 'journal' entries to 'journal-deleted'.
Kind of hackish, but they
+ provide a consistent feel to the system
+ */
+ $flush_path = '';
+ if($data['operation'] == VFS_OPERATION_CREATED)
+ {
+ $flush_path = $p->fake_full_path;
+ $deleteall = true;
+ }
+
+ if($data['operation'] == VFS_OPERATION_COPIED ||
$data['operation'] == VFS_OPERATION_MOVED)
+ {
+ $flush_path = $data['state_two'];
+ $deleteall = false;
+ }
+
+ if($flush_path)
+ {
+ $flush_path_parts = $this->path_parts(array(
+ 'string' => $flush_path,
+ 'relatives' =>
array(RELATIVE_NONE)
+ )
+ );
+
+ $this->flush_journal(array(
+ 'string' =>
$flush_path_parts->fake_full_path,
+ 'relatives' =>
array($flush_path_parts->mask),
+ 'deleteall' => $deleteall
+ )
+ );
+ }
+
+ if($data['operation'] == VFS_OPERATION_COPIED)
+ {
+ /*
+ We copy it going the other way as well, so
both files show the operation.
+ The code is a bad hack to prevent recursion.
Ideally it would use VFS_OPERATION_COPIED
+ */
+ $this->add_journal(array(
+ 'string' =>
$data['state_two'],
+ 'relatives' =>
array(RELATIVE_NONE),
+ 'operation' => "Copied
{$data['state_one']} to {$data['state_two']}",
+ 'state_one' => null,
+ 'state_two' => null,
+ 'incversion' => false
+ )
+ );
+ }
+
+ if($data['operation'] == VFS_OPERATION_MOVED)
+ {
+ $state_one_path_parts = $this->path_parts(array(
+ 'string' =>
$data['state_one'],
+ 'relatives' =>
array(RELATIVE_NONE)
+ )
+ );
+
+ $query = $GLOBALS['phpgw']->db->query("UPDATE
phpgw_vfs SET mime_type='journal-deleted'"
+ . " WHERE
directory='{$state_one_path_parts->fake_leading_dirs_clean}'"
+ . " AND
name='{$state_one_path_parts->fake_name_clean}' AND mime_type='journal'");
+
+ /*
+ We create the file in addition to logging
the MOVED operation. This is an
+ advantage because we can now search for
'Create' to see when a file was created
+ */
+ $this->add_journal(array(
+ 'string' =>
$data['state_two'],
+ 'relatives' =>
array(RELATIVE_NONE),
+ 'operation' =>
VFS_OPERATION_CREATED
+ )
+ );
+ }
+
+ /* This is the SQL query we made for THIS request,
remember that one? */
+ $query = $GLOBALS['phpgw']->db->query($sql, __LINE__,
__FILE__);
+
+ /*
+ If we were to add an option of whether to keep
journal entries for deleted files
+ or not, it would go in the if here
+ */
+ if($data['operation'] == VFS_OPERATION_DELETED)
+ {
+ $query = $GLOBALS['phpgw']->db->query("UPDATE
phpgw_vfs SET mime_type='journal-deleted'"
+ . " WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}' AND
mime_type='journal'");
+ }
+
+ return true;
+ }
+
+ /**
+ * Flush journal entries for $string. Used before adding
$string
+ *
+ * flush_journal() is an internal function and should be called
from add_journal() only
+ * @param string File/directory to flush journal entries of
+ * @param relatives Realtivity array
+ * @param deleteall Delete all types of journal entries,
including the active Create entry.
+ * * Normally you only want to delete the
Create entry when replacing the file
+ * * Note that this option does not effect
$deleteonly
+ * @param deletedonly Only flush 'journal-deleted'
entries(created when $string was deleted)
+ * @return Boolean True/False
+ */
+ function flush_journal($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT),
+ 'deleteall' => false,
+ 'deletedonly' => false
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ $sql = "DELETE FROM phpgw_vfs WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'";
+
+ if(!$data['deleteall'])
+ {
+ $sql .= " AND(mime_type != 'journal' AND
comment != 'Created')";
+ }
+
+ $sql .= " AND(mime_type='journal-deleted'";
+
+ if(!$data['deletedonly'])
+ {
+ $sql .= " OR mime_type='journal'";
+ }
+
+ $sql .= ")";
+
+ $query = $GLOBALS['phpgw']->db->query($sql, __LINE__,
__FILE__);
+
+ if($query)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function get_journal($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT),
+ 'type' => false
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if(!$this->acl_check(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask)
+ )))
+ {
+ return false;
+ }
+
+ $sql = "SELECT * FROM phpgw_vfs WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'";
+
+ if($data['type'] == 1)
+ {
+ $sql .= " AND mime_type='journal'";
+ }
+ elseif($data['type'] == 2)
+ {
+ $sql .= " AND mime_type='journal-deleted'";
+ }
+ else
+ {
+ $sql .= " AND(mime_type='journal' OR
mime_type='journal-deleted')";
+ }
+
+ $query = $GLOBALS['phpgw']->db->query($sql, __LINE__,
__FILE__);
+
+ while($GLOBALS['phpgw']->db->next_record())
+ {
+ $rarray[] = $this->Record();
+ }
+
+ return $rarray;
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function acl_check($data)
+ {
+ //echo 'checking vfs_sql::acl_check(' . print_r($data,
true) . '</pre>';
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT),
+ 'operation' => PHPGW_ACL_READ,
+ 'must_exist' => false
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ /* Accommodate special situations */
+ if($this->override_acl || $data['relatives'][0] ==
RELATIVE_USER_APP)
+ {
+ return true;
+ }
+
+ if(!isset($data['owner_id']) || !$data['owner_id'])
+ {
+ $p = $this->path_parts(array(
+ 'string' =>
$data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ /* Temporary, until we get symlink type files
set up */
+ if($p->outside)
+ {
+ return true;
+ }
+
+ /* Read access is always allowed here, but
nothing else is */
+ if($data['string'] == '/' || $data['string'] ==
$this->fakebase)
+ {
+ if($data['operation'] == PHPGW_ACL_READ)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /* If the file doesn't exist, we get ownership
from the parent directory */
+ if(!$this->file_exists(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask)
+ ))
+ )
+ {
+ if($data['must_exist'])
+ {
+ return false;
+ }
+
+ $data['string'] = $p->fake_leading_dirs;
+ $p2 = $this->path_parts(array(
+ 'string' =>
$data['string'],
+ 'relatives' =>
array($p->mask)
+ )
+ );
+
+ if(!$this->file_exists(array(
+ 'string' =>
$data['string'],
+ 'relatives' =>
array($p->mask)
+ ))
+ )
+ {
+ return false;
+ }
+ }
+ else
+ {
+ $p2 = $p;
+ }
+
+ /*
+ We don't use ls() to get owner_id as we
normally would,
+ because ls() calls acl_check(), which would
create an infinite loop
+ */
+ $query = $GLOBALS['phpgw']->db->query("SELECT
owner_id FROM phpgw_vfs WHERE directory='{$p2->fake_leading_dirs_clean}'"
+ . " AND name='{$p2->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+ $GLOBALS['phpgw']->db->next_record();
+
+ $record = $this->Record();
+ $owner_id = $record['owner_id'];
+ }
+ else
+ {
+ $owner_id = $data['owner_id'];
+ }
+
+ /* This is correct. The ACL currently doesn't handle
undefined values correctly */
+ if(!$owner_id)
+ {
+ $owner_id = 0;
+ }
+
+ $user_id = $GLOBALS['phpgw_info']['user']['account_id'];
+
+ /* They always have access to their own files */
+ if($owner_id == $user_id)
+ {
+ return true;
+ }
+
+ /* Check if they're in the group */
+ $memberships =
$GLOBALS['phpgw']->accounts->membership($user_id);
+
+ if(is_array($memberships))
+ {
+ reset($memberships);
+ while(list($num, $group_array) =
each($memberships))
+ {
+ if($owner_id == $group_array->id)
+ {
+ $group_ok = 1;
+ break;
+ }
+ }
+ }
+
+throw new Exception('vfs::acl_check() - not implemented correctly');
+ $acl = CreateObject('phpgwapi.acl', $owner_id);
+ $acl->set_account_id($owner_id, true);
+
+ $rights = $acl->get_rights($user_id);
+
+ /* Add privileges from the groups this user belongs to
*/
+ if(is_array($memberships))
+ {
+ reset($memberships);
+ while(list($num, $group_array) =
each($memberships))
+ {
+ $rights |=
$acl->get_rights($group_array->id);
+ }
+ }
+
+ if($rights & $data['operation'])
+ {
+ return true;
+ }
+ elseif(!$rights && $group_ok)
+ {
+ if($this->acl_default == 'grant')
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function read($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if(!$this->acl_check(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask),
+ 'operation' => PHPGW_ACL_READ
+ ))
+ )
+ {
+ return false;
+ }
+
+ if($this->file_actions || $p->outside)
+ {
+ $contents = $this->fileoperation->read($p);
+ }
+ else
+ {
+ $ls_array = $this->ls(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask)
+ )
+ );
+
+ $contents = $ls_array[0]['content'];
+ }
+
+ return $contents;
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function write($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT),
+ 'content' => ''
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if($this->file_exists(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask)
+ ))
+ )
+ {
+ $acl_operation = PHPGW_ACL_EDIT;
+ $journal_operation = VFS_OPERATION_EDITED;
+ }
+ else
+ {
+ $acl_operation = PHPGW_ACL_ADD;
+ }
+
+ if(!$this->acl_check(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask),
+ 'operation' => $acl_operation
+ ))
+ )
+ {
+ return false;
+ }
+
+ umask(000);
+
+ /*
+ If 'string' doesn't exist, touch() creates both the
file and the database entry
+ If 'string' does exist, touch() sets the
modification time and modified by
+ */
+ $this->touch(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask)
+ )
+ );
+
+ if($this->file_actions)
+ {
+ $write_ok = $this->fileoperation->write($p,
$data['content']);
+ }
+
+ if($write_ok || !$this->file_actions)
+ {
+ if($this->file_actions)
+ {
+ $set_attributes_array = array(
+ // 'size' =>
$this->fileoperation->filesize($p)
+ 'size' =>
strlen($data['content']),
+ );
+ }
+ else
+ {
+ $set_attributes_array = array(
+ 'size' =>
strlen($data['content']),
+ 'content' =>
$data['content']
+ );
+ }
+
+ $this->set_attributes(array
+ (
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'attributes' =>
$set_attributes_array
+ )
+ );
+
+ if($journal_operation)
+ {
+ $this->add_journal(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'operation' =>
$journal_operation
+ )
+ );
+ }
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function touch($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $account_id =
$GLOBALS['phpgw_info']['user']['account_id'];
+ $currentapp =
$GLOBALS['phpgw_info']['flags']['currentapp'];
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ umask(000);
+
+ if($this->file_actions)
+ {
+ /*
+ PHP's touch function will automatically
decide whether to
+ create the file or set the modification time
+ */
+
+ $rr = $this->fileoperation->touch($p);
+
+ if($p->outside)
+ {
+ return $rr;
+ }
+ }
+
+ /* We, however, have to decide this ourselves */
+ if($this->file_exists(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask)
+ ))
+ )
+ {
+ if(!$this->acl_check(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'operation' =>
PHPGW_ACL_EDIT
+ )))
+ {
+ return false;
+ }
+
+ $vr = $this->set_attributes(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'attributes' => array(
+
'modifiedby_id' => $account_id,
+
'modified' => $this->now
+ )
+ )
+ );
+ }
+ else
+ {
+ if(!$this->acl_check(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'operation' => PHPGW_ACL_ADD
+ ))
+ )
+ {
+ return false;
+ }
+
+ $query = $GLOBALS['phpgw']->db->query("INSERT
INTO phpgw_vfs (owner_id, directory, name)"
+ . "
VALUES({$this->working_id},'{$p->fake_leading_dirs_clean}',
'{$p->fake_name_clean}')", __LINE__, __FILE__);
+
+ $this->set_attributes(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'attributes' => array(
+ 'createdby_id'
=> $account_id,
+ 'created'
=> $this->now,
+ 'size'
=> 0,
+ 'deleteable'
=> 'Y',
+ 'app'
=> $currentapp
+ )
+ )
+ );
+ $this->correct_attributes(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask)
+ )
+ );
+
+ $this->add_journal(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'operation' =>
VFS_OPERATION_CREATED
+ )
+ );
+ }
+
+ if($rr || $vr || $query)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function cp($data)
+ {
+ if(!$data['from'])
+ {
+ throw new Exception('nothing to copy from');
+ }
+
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT,
RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $account_id =
$GLOBALS['phpgw_info']['user']['account_id'];
+
+ $f = $this->path_parts(array(
+ 'string' => $data['from'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ $t = $this->path_parts(array(
+ 'string' => $data['to'],
+ 'relatives' =>
array($data['relatives'][1])
+ )
+ );
+
+ if(!$this->fileoperation->check_target_directory($t))
+ {
+ $GLOBALS['phpgw']->log->error(array(
+ 'text' => 'vfs::cp() : missing target
directory %1',
+ 'p1' => $t->real_leading_dirs,
+ 'p2' => '',
+ 'line' => __LINE__,
+ 'file' => __FILE__
+ ));
+
+ return false;
+ }
+
+ if(!$this->acl_check(array(
+ 'string' => $f->fake_full_path,
+ 'relatives' => array($f->mask),
+ 'operation' => PHPGW_ACL_READ
+ ))
+ )
+ {
+ return false;
+ }
+
+ if($this->file_exists(array(
+ 'string' => $t->fake_full_path,
+ 'relatives' => array($t->mask)
+ ))
+ )
+ {
+ if(!$this->acl_check(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'operation' =>
PHPGW_ACL_EDIT
+ ))
+ )
+ {
+ return false;
+ }
+ }
+ else
+ {
+ if(!$this->acl_check(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'operation' => PHPGW_ACL_ADD
+ ))
+ )
+ {
+ return false;
+ }
+
+ }
+
+ umask(000);
+
+ if($this->file_type(array(
+ 'string' => $f->fake_full_path,
+ 'relatives' => array($f->mask)
+ )) != 'Directory'
+ )
+ {
+ if($this->file_actions)
+ {
+ if(!$this->fileoperation->copy($f, $t))
+ {
+ return false;
+ }
+
+ $size =
$this->fileoperation->filesize($t);
+ }
+ else
+ {
+ $content = $this->read(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask)
+ )
+ );
+
+ $size = strlen($content);
+ }
+
+ if($t->outside)
+ {
+ return true;
+ }
+
+ $ls_array = $this->ls(array(
+ 'string' =>
$f->real_full_path, // Sigurd: seems to work better with real - old: 'string'
=> $f->fake_full_path,
+ 'relatives' =>
array($f->mask),
+ 'checksubdirs' => false,
+ 'mime_type' => false,
+ 'nofiles' => true
+ )
+ );
+ $record = $ls_array[0];
+
+ if($this->file_exists(array(
+ 'string' => $data['to'],
+ 'relatives' =>
array($data['relatives'][1])
+ ))
+ )
+ {
+ $query =
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET
owner_id='{$this->working_id}',"
+ . "
directory='{$t->fake_leading_dirs_clean}',"
+ . " name='{$t->fake_name_clean}'"
+ . " WHERE
owner_id='{$this->working_id}' AND directory='{$t->fake_leading_dirs_clean}'"
+ . " AND name='{$t->fake_name_clean}'" .
$this->extra_sql(VFS_SQL_UPDATE), __LINE__, __FILE__);
+
+ $set_attributes_array = array
+ (
+ 'createdby_id' => $account_id,
+ 'created' =>
$this->now,
+ 'size' =>
$size,
+ 'mime_type' =>
$record['mime_type'],
+ 'deleteable' =>
$record['deleteable'],
+ 'comment' =>
$record['comment'],
+ 'app' =>
$record['app']
+ );
+
+ if(!$this->file_actions)
+ {
+
$set_attributes_array['content'] = $content;
+ }
+
+ $this->set_attributes(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'attributes' =>
$set_attributes_array
+ )
+ );
+
+ $this->add_journal(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'operation' =>
VFS_OPERATION_EDITED
+ )
+ );
+ }
+ else
+ {
+ $this->touch(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask)
+ )
+ );
+
+ $set_attributes_array = array
+ (
+ 'createdby_id' => $account_id,
+ 'created' =>
$this->now,
+ 'size' =>
$size,
+ 'mime_type' =>
$record['mime_type'],
+ 'deleteable' =>
$record['deleteable'],
+ 'comment' =>
$record['comment'],
+ 'app' =>
$record['app']
+ );
+
+ if(!$this->file_actions)
+ {
+
$set_attributes_array['content'] = $content;
+ }
+
+ $this->set_attributes(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'attributes' =>
$set_attributes_array
+ )
+ );
+ }
+ $this->correct_attributes(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask)
+ )
+ );
+ }
+ else /* It's a directory */
+ {
+ /* First, make the initial directory */
+ if($this->mkdir(array(
+ 'string' => $data['to'],
+ 'relatives' =>
array($data['relatives'][1])
+ )) === false
+ )
+ {
+ return false;
+ }
+
+ /* Next, we create all the directories below
the initial directory */
+ $ls = $this->ls(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask),
+ 'checksubdirs' => true,
+ 'mime_type' => 'Directory'
+ )
+ );
+
+ while(list($num, $entry) = each($ls))
+ {
+ $newdir =
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path,
$entry['directory']);
+ if($this->mkdir(array(
+ 'string' =>
"{$newdir}/{$entry['name']}",
+ 'relatives' =>
array($t->mask)
+ )) === false
+ )
+ {
+ return false;
+ }
+ }
+
+ /* Lastly, we copy the files over */
+ $ls = $this->ls(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask)
+ )
+ );
+
+ while(list($num, $entry) = each($ls))
+ {
+ if($entry['mime_type'] == 'Directory')
+ {
+ continue;
+ }
+
+ $newdir =
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path,
$entry['directory']);
+ $this->cp(array(
+ 'from' =>
"{$entry[directory]}/{$entry[name]}",
+ 'to' =>
"{$newdir}/{$entry[name]}",
+ 'relatives' =>
array($f->mask, $t->mask)
+ )
+ );
+ }
+ }
+
+ if(!$f->outside)
+ {
+ $this->add_journal(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask),
+ 'operation' =>
VFS_OPERATION_COPIED,
+ 'state_one' => NULL,
+ 'state_two' =>
$t->fake_full_path
+ )
+ );
+ }
+
+ return true;
+ }
+ /*
+ * Same as cp function, except an exception is thrown if there
is a failure
+ * errors have also been expanded
+ */
+ function cp2($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT,
RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $account_id =
$GLOBALS['phpgw_info']['user']['account_id'];
+
+ $f = $this->path_parts(array(
+ 'string' => $data['from'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ $t = $this->path_parts(array(
+ 'string' => $data['to'],
+ 'relatives' =>
array($data['relatives'][1])
+ )
+ );
+
+ if(!$this->acl_check(array(
+ 'string' => $f->fake_full_path,
+ 'relatives' => array($f->mask),
+ 'operation' => PHPGW_ACL_READ
+ ))
+ )
+ {
+ throw new Exception('ACL(READ) check failed!');
+ }
+
+ if($this->file_exists(array(
+ 'string' => $t->fake_full_path,
+ 'relatives' => array($t->mask)
+ ))
+ )
+ {
+ if(!$this->acl_check(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'operation' =>
PHPGW_ACL_EDIT
+ ))
+ )
+ {
+ throw new Exception('ACL(EDIT) check
failed!');
+ }
+ }
+ else
+ {
+ if(!$this->acl_check(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'operation' => PHPGW_ACL_ADD
+ ))
+ )
+ {
+ throw new Exception('ACL(ADD) check
failed!');
+ }
+
+ }
+
+ umask(000);
+
+ if($this->file_type(array(
+ 'string' => $f->fake_full_path,
+ 'relatives' => array($f->mask)
+ )) != 'Directory'
+ )
+ {
+ if($this->file_actions)
+ {
+ if(!$this->fileoperation->copy($f, $t))
+ {
+ $error = "Copy failed!\n";
+ $error = $error.
"f->real_full_path: $f->real_full_path \n";
+ $error = $error.
"t->real_full_path: $t->real_full_path \n";
+ throw new Exception($error);
+ }
+ $size =
$this->fileoperation->filesize($t);
+ }
+ else
+ {
+ $content = $this->read(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask)
+ )
+ );
+
+ $size = strlen($content);
+ }
+
+ if($t->outside)
+ {
+ return true;
+ }
+
+ $ls_array = $this->ls(array(
+ 'string' =>
$f->real_full_path, // Sigurd: seems to work better with real - old: 'string'
=> $f->fake_full_path,
+ 'relatives' =>
array($f->mask),
+ 'checksubdirs' => false,
+ 'mime_type' =>
false,
+ 'nofiles' => true
+ )
+ );
+ $record = $ls_array[0];
+
+ if($this->file_exists(array(
+ 'string' => $data['to'],
+ 'relatives' =>
array($data['relatives'][1])
+ ))
+ )
+ {
+ $query =
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET
owner_id='{$this->working_id}',"
+ . "
directory='{$t->fake_leading_dirs_clean}',"
+ . " name='{$t->fake_name_clean}'"
+ . " WHERE
owner_id='{$this->working_id}' AND directory='{$t->fake_leading_dirs_clean}'"
+ . " AND name='$t->fake_name_clean'" .
$this->extra_sql(VFS_SQL_UPDATE), __LINE__, __FILE__);
+
+ $set_attributes_array = array
+ (
+ 'createdby_id' =>
$account_id,
+ 'created'
=> $this->now,
+ 'size'
=> $size,
+ 'mime_type'
=> $record['mime_type'],
+ 'deleteable' =>
$record['deleteable'],
+ 'comment'
=> $record['comment'],
+ 'app'
=> $record['app']
+ );
+
+ if(!$this->file_actions)
+ {
+
$set_attributes_array['content'] = $content;
+ }
+
+ $this->set_attributes(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'attributes' =>
$set_attributes_array
+ )
+ );
+
+ $this->add_journal(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'operation' =>
VFS_OPERATION_EDITED
+ )
+ );
+ }
+ else
+ {
+ $this->touch(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask)
+ )
+ );
+
+ $set_attributes_array = array
+ (
+ 'createdby_id' =>
$account_id,
+ 'created'
=> $this->now,
+ 'size'
=> $size,
+ 'mime_type'
=> $record['mime_type'],
+ 'deleteable' =>
$record['deleteable'],
+ 'comment'
=> $record['comment'],
+ 'app'
=> $record['app']
+ );
+
+ if(!$this->file_actions)
+ {
+
$set_attributes_array['content'] = $content;
+ }
+
+ $this->set_attributes(array(
+ 'string'
=> $t->fake_full_path,
+ 'relatives'
=> array($t->mask),
+ 'attributes' =>
$set_attributes_array
+ )
+ );
+ }
+ $this->correct_attributes(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask)
+ )
+ );
+ }
+ else /* It's a directory */
+ {
+ /* First, make the initial directory */
+ if($this->mkdir(array(
+ 'string' => $data['to'],
+ 'relatives' =>
array($data['relatives'][1])
+ )) === false
+ )
+ {
+ throw new Exception('Error, it is a
directory');
+ }
+
+ /* Next, we create all the directories below
the initial directory */
+ $ls = $this->ls(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask),
+ 'checksubdirs' => true,
+ 'mime_type' =>
'Directory'
+ )
+ );
+
+ while(list($num, $entry) = each($ls))
+ {
+ $newdir =
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path,
$entry['directory']);
+ if($this->mkdir(array(
+ 'string' =>
"{$newdir}/{$entry['name']}",
+ 'relatives' =>
array($t->mask)
+ )) === false
+ )
+ {
+ throw new Exception('While loop
error!');
+ }
+ }
+
+ /* Lastly, we copy the files over */
+ $ls = $this->ls(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask)
+ )
+ );
+
+ while(list($num, $entry) = each($ls))
+ {
+ if($entry['mime_type'] == 'Directory')
+ {
+ continue;
+ }
+
+ $newdir =
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path,
$entry['directory']);
+ $this->cp(array(
+ 'from' =>
"{$entry[directory]}/{$entry[name]}",
+ 'to' =>
"{$newdir}/{$entry[name]}",
+ 'relatives' =>
array($f->mask, $t->mask)
+ )
+ );
+ }
+ }
+
+ if(!$f->outside)
+ {
+ $this->add_journal(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask),
+ 'operation' =>
VFS_OPERATION_COPIED,
+ 'state_one' => NULL,
+ 'state_two' =>
$t->fake_full_path
+ )
+ );
+ }
+
+ return true;
+ }
+ /*
+ * See vfs_shared
+ */
+ function mv($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT,
RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $account_id =
$GLOBALS['phpgw_info']['user']['account_id'];
+ $f = $this->path_parts(array(
+ 'string' => $data['from'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ $t = $this->path_parts(array(
+ 'string' => $data['to'],
+ 'relatives' =>
array($data['relatives'][1])
+ )
+ );
+ if(!$this->acl_check(array(
+ 'string' => $f->fake_full_path,
+ 'relatives' => array($f->mask),
+ 'operation' => PHPGW_ACL_READ
+ ))
+ || !$this->acl_check(array(
+ 'string' => $f->fake_full_path,
+ 'relatives' => array($f->mask),
+ 'operation' => PHPGW_ACL_DELETE
+ ))
+ )
+ {
+ return false;
+ }
+
+ if(!$this->acl_check(array(
+ 'string' => $t->fake_full_path,
+ 'relatives' => array($t->mask),
+ 'operation' => PHPGW_ACL_ADD
+ ))
+ )
+ {
+ return false;
+ }
+
+ if($this->file_exists(array(
+ 'string' => $t->fake_full_path,
+ 'relatives' => array($t->mask)
+ ))
+ )
+ {
+ if(!$this->acl_check(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'operation' =>
PHPGW_ACL_EDIT
+ ))
+ )
+ {
+ return false;
+ }
+ }
+
+ umask(000);
+
+ /* We can't move directories into themselves */
+ if(($this->file_type(array(
+ 'string' => $f->fake_full_path,
+ 'relatives' => array($f->mask)
+ ) == 'Directory'))
+ && preg_match("/^{$f->fake_full_path}/",
$t->fake_full_path)
+ )
+ {
+ if(($t->fake_full_path == $f->fake_full_path)
|| substr($t->fake_full_path, strlen($f->fake_full_path), 1) == '/')
+ {
+ return false;
+ }
+ }
+ if($this->file_exists(array(
+ 'string' => $f->fake_full_path,
+ 'relatives' => array($f->mask)
+ ))
+ )
+ {
+ /* We get the listing now, because it will
change after we update the database */
+ $ls = $this->ls(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask)
+ )
+ );
+
+ if($this->file_exists(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask)
+ ))
+ )
+ {
+ $this->rm(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask)
+ )
+ );
+ }
+
+ /*
+ We add the journal entry now, before we
delete. This way the mime_type
+ field will be updated to 'journal-deleted'
when the file is actually deleted
+ */
+ if(!$f->outside)
+ {
+ $this->add_journal(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
array($f->mask),
+ 'operation' =>
VFS_OPERATION_MOVED,
+ 'state_one' =>
$f->fake_full_path,
+ 'state_two' =>
$t->fake_full_path
+ )
+ );
+ }
+
+ /*
+ If the from file is outside, it won't have a
database entry,
+ so we have to touch it and find the size
+ */
+ if($f->outside)
+ {
+ $size =
$this->fileoperation->filesize($f);
+ if( $size === false )
+ {
+ _debug_array($f);
+ $size = 1;
+ }
+ $this->touch(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask)
+ )
+ );
+ $query =
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET size={$size}"
+ . " WHERE
directory='{$t->fake_leading_dirs_clean}'"
+ . " AND name='{$t->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_UPDATE)), __LINE__, __FILE__);
+ }
+ elseif(!$t->outside)
+ {
+ $query =
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET
name='{$t->fake_name_clean}', directory='{$t->fake_leading_dirs_clean}'"
+ . " WHERE
directory='{$f->fake_leading_dirs_clean}'"
+ . " AND name='{$f->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_UPDATE)), __LINE__, __FILE__);
+ }
+
+ $this->set_attributes(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask),
+ 'attributes' => array(
+
'modifiedby_id' => $account_id,
+
'modified' => $this->now
+ )
+ )
+ );
+
+ $this->correct_attributes(array(
+ 'string' =>
$t->fake_full_path,
+ 'relatives' =>
array($t->mask)
+ )
+ );
+
+ if($this->file_actions)
+ {
+ $rr = $this->fileoperation->rename($f,
$t);
+ }
+
+ /*
+ This removes the original entry from the
database
+ The actual file is already deleted because
of the rename() above
+ */
+ if($t->outside)
+ {
+ $this->rm(array(
+ 'string' =>
$f->fake_full_path,
+ 'relatives' =>
$f->mask
+ )
+ );
+ }
+ }
+ else
+ {
+ return false;
+ }
+
+ if($this->file_type(array(
+ 'string' => $t->fake_full_path,
+ 'relatives' => array($t->mask)
+ )) == 'Directory'
+ )
+ {
+ /* We got $ls from above, before we renamed the
directory */
+ while(list($num, $entry) = each($ls))
+ {
+ $newdir =
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path,
$entry['directory']);
+ $newdir_clean =
$this->clean_string(array('string' => $newdir));
+
+ $query =
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET directory='{$newdir_clean}'"
+ . " WHERE file_id='{$entry[file_id]}'"
. $this->extra_sql(array('query_type' => VFS_SQL_UPDATE)), __LINE__, __FILE__);
+
+ $this->correct_attributes(array(
+ 'string' =>
"{$newdir}/{$entry[name]}",
+ 'relatives' =>
array($t->mask)
+ )
+ );
+ }
+ }
+
+ $this->add_journal(array(
+ 'string' => $t->fake_full_path,
+ 'relatives' => array($t->mask),
+ 'operation' => VFS_OPERATION_MOVED,
+ 'state_one' => $f->fake_full_path,
+ 'state_two' => $t->fake_full_path
+ )
+ );
+
+ return true;
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function rm($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if(!$this->acl_check(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask),
+ 'operation' => PHPGW_ACL_DELETE
+ ))
+ )
+ {
+ return false;
+ }
+
+ if(!$this->file_exists(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ ))
+ )
+ {
+ if($this->file_actions)
+ {
+ $rr = $this->fileoperation->unlink($p);
+ }
+ else
+ {
+ $rr = true;
+ }
+
+ if($rr)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ if($this->file_type(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )) != 'Directory'
+ )
+ {
+ $this->add_journal(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'operation' =>
VFS_OPERATION_DELETED
+ )
+ );
+
+ $query = $GLOBALS['phpgw']->db->query("DELETE
FROM phpgw_vfs"
+ . " WHERE
directory='{$p->fake_leading_dirs_clean}'"
+ . " AND name='{$p->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_DELETE)), __LINE__, __FILE__);
+
+ if($this->file_actions)
+ {
+ $rr = $this->fileoperation->unlink($p);
+ }
+ else
+ {
+ $rr = true;
+ }
+
+ if($query || $rr)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ $ls = $this->ls(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask)
+ )
+ );
+
+ /* First, we cycle through the entries and
delete the files */
+ while(list($num, $entry) = each($ls))
+ {
+ if($entry['mime_type'] == 'Directory')
+ {
+ continue;
+ }
+
+ $this->rm(array(
+ 'string' =>
"{$entry['directory']}/{$entry['name']}",
+ 'relatives' =>
array($p->mask)
+ )
+ );
+ }
+
+ /* Now we cycle through again and delete the
directories */
+ reset($ls);
+ while(list($num, $entry) = each($ls))
+ {
+ if($entry['mime_type'] != 'Directory')
+ {
+ continue;
+ }
+
+ /* Only the best in confusing recursion
*/
+ $this->rm(array(
+ 'string' =>
"{$entry['directory']}/{$entry['name']}",
+ 'relatives' =>
array($p->mask)
+ )
+ );
+ }
+
+ /* If the directory is linked, we delete the
placeholder directory */
+ $ls_array = $this->ls(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'checksubdirs' => false,
+ 'mime_type' =>
false,
+ 'nofiles' => true
+ )
+ );
+ $link_info = $ls_array[0];
+
+ if($link_info['link_directory'] &&
$link_info['link_name'])
+ {
+ $path = $this->path_parts(array(
+ 'string' =>
"{$link_info['directory']}/{$link_info['name']}",
+ 'relatives' =>
array($p->mask),
+ 'nolinks' => true
+ )
+ );
+
+ if($this->file_actions)
+ {
+
$this->fileoperation->rmdir($path);
+ }
+ }
+
+ /* Last, we delete the directory itself */
+ $this->add_journal(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'operaton' =>
VFS_OPERATION_DELETED
+ )
+ );
+
+ $query = $GLOBALS['phpgw']->db->query("DELETE
FROM phpgw_vfs"
+ . " WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_DELETE)), __LINE__, __FILE__);
+
+ if($this->file_actions)
+ {
+ $this->fileoperation->rmdir($p);
+ }
+
+ return true;
+ }
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function mkdir($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $account_id =
$GLOBALS['phpgw_info']['user']['account_id'];
+ $currentapp =
$GLOBALS['phpgw_info']['flags']['currentapp'];
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if(!$this->acl_check(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask),
+ 'operation' => PHPGW_ACL_ADD)
+ )
+ )
+ {
+ return false;
+ }
+
+ /* We don't allow /'s in dir names, of course */
+ if(preg_match('/\//', $p->fake_name))
+ {
+ return false;
+ }
+
+ umask(000);
+
+ if($this->file_actions)
+ {
+
if(!$this->fileoperation->check_target_directory($p))
+ {
+ $GLOBALS['phpgw']->log->error(array(
+ 'text' => 'vfs::mkdir() :
missing leading directory %1 when attempting to create %2',
+ 'p1' => $p->real_leading_dirs,
+ 'p2' => $p->real_full_path,
+ 'line' => __LINE__,
+ 'file' => __FILE__
+ ));
+
+ return false;
+ }
+
+ /* Auto create home */
+
+
$this->fileoperation->auto_create_home($this->basedir);
+
+ if($this->fileoperation->file_exists($p))
+ {
+ if(!$this->fileoperation->is_dir($p))
+ {
+ return false;
+ }
+ }
+ else if(!$this->fileoperation->mkdir($p))
+ {
+ $GLOBALS['phpgw']->log->error(array(
+ 'text' => 'vfs::mkdir() :
failed to create directory %1',
+ 'p1' => $p->real_full_path,
+ 'p2' => '',
+ 'line' => __LINE__,
+ 'file' => __FILE__
+ ));
+
+ return false;
+ }
+
+ }
+
+ if(!$this->file_exists(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask)
+ ))
+ )
+ {
+ $query = $GLOBALS['phpgw']->db->query("INSERT
INTO phpgw_vfs(owner_id, name, directory)"
+ . " VALUES({$this->working_id},
'{$p->fake_name_clean}', '{$p->fake_leading_dirs_clean}')", __LINE__, __FILE__);
+ $this->set_attributes(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'attributes' => array(
+ 'createdby_id'
=> $account_id,
+ 'size'
=> 4096,
+ 'mime_type'
=> 'Directory',
+ 'created'
=> $this->now,
+ 'deleteable'
=> 'Y',
+ 'app'
=> $currentapp
+ )
+ )
+ );
+
+ $this->correct_attributes(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask)
+ )
+ );
+
+ $this->add_journal(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask),
+ 'operation' =>
VFS_OPERATION_CREATED
+ )
+ );
+ }
+ else
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function make_link($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT, RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $account_id =
$GLOBALS['phpgw_info']['user']['account_id'];
+ $currentapp =
$GLOBALS['phpgw_info']['flags']['currentapp'];
+
+ $vp = $this->path_parts(array(
+ 'string' => $data['vdir'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ $rp = $this->path_parts(array(
+ 'string' => $data['rdir'],
+ 'relatives' =>
array($data['relatives'][1])
+ )
+ );
+
+ if(!$this->acl_check(array(
+ 'string' => $vp->fake_full_path,
+ 'relatives' => array($vp->mask),
+ 'operation' => PHPGW_ACL_ADD
+ ))
+ )
+ {
+ return false;
+ }
+
+ if($this->file_exists(array(
+ 'string' => $rp->real_full_path,
+ 'relatives' => array($rp->mask)
+ ))
+ )
+ {
+ if(!$this->fileoperation->is_dir($rp))
+ {
+ return false;
+ }
+ }
+ elseif(!$this->fileoperation->mkdir($rp))
+ {
+ return false;
+ }
+
+ if(!$this->mkdir(array(
+ 'string' => $vp->fake_full_path,
+ 'relatives' => array($vp->mask)
+ ))
+ )
+ {
+ return false;
+ }
+
+ //FIXME
+ $size = $this->get_size(array(
+ 'string' => $rp->real_full_path,
+ 'relatives' => array($rp->mask)
+ )
+ );
+
+ $this->set_attributes(array(
+ 'string' => $vp->fake_full_path,
+ 'relatives' => array($vp->mask),
+ 'attributes' => array(
+
'link_directory' => $rp->real_leading_dirs,
+ 'link_name' =>
$rp->real_name,
+ 'size' => $size
+ )
+ )
+ );
+
+ $this->correct_attributes(array(
+ 'string' => $vp->fake_full_path,
+ 'relatives' => array($vp->mask)
+ )
+ );
+
+ return true;
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function set_attributes($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT),
+ 'attributes' => array()
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ /*
+ This is kind of trivial, given that set_attributes()
can change owner_id,
+ size, etc.
+ */
+ if(!$this->acl_check(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask),
+ 'operation' => PHPGW_ACL_EDIT
+ ))
+ )
+ {
+ return false;
+ }
+
+ if(!$this->file_exists(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ ))
+ )
+ {
+ return false;
+ }
+
+ /*
+ All this voodoo just decides which attributes to
update
+ depending on if the attribute was supplied in the
'attributes' array
+ */
+
+ $ls_array = $this->ls(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask),
+ 'checksubdirs' => false,
+ 'nofiles' => true
+ )
+ );
+ $record = $ls_array[0];
+
+ $sql = 'UPDATE phpgw_vfs SET ';
+
+ $change_attributes = 0;
+ $edited_comment = false;
+
+ reset($this->attributes);
+ $value_set = array();
+// while(list($num, $attribute) = each($this->attributes))
+ foreach($this->attributes as $num => $attribute)
+ {
+ if(isset($data['attributes'][$attribute]))
+ {
+ $$attribute =
$data['attributes'][$attribute];
+
+ /*
+ Indicate that the EDITED_COMMENT
operation needs to be journaled,
+ but only if the comment changed
+ */
+ if($attribute == 'comment' &&
$data['attributes'][$attribute] != $record[$attribute])
+ {
+ $edited_comment = true;
+ }
+
+ if($attribute == 'owner_id' &&
!$$attribute)
+ {
+ $$attribute =
$GLOBALS['phpgw_info']['user']['account_id'];
+ }
+
+ $$attribute =
$this->clean_string(array('string' => $$attribute));
+
+/*
+ if($change_attributes > 0)
+ {
+ $sql .= ', ';
+ }
+
+ $sql .= "$attribute='" . $$attribute .
"'";
+*/
+ $value_set[$attribute] = $$attribute;
+
+ $change_attributes++;
+ }
+ }
+
+ if( $change_attributes )
+ {
+ $value_set =
$GLOBALS['phpgw']->db->validate_update($value_set);
+ $sql .= " {$value_set} WHERE file_id="
.(int)$record['file_id'];
+ $sql .= $this->extra_sql(array('query_type' =>
VFS_SQL_UPDATE));
+
+ //echo 'sql: ' . $sql;
+
+ $query = $GLOBALS['phpgw']->db->query($sql,
__LINE__, __FILE__);
+ if($query)
+ {
+ if($edited_comment)
+ {
+ $this->add_journal(array(
+ 'string'
=> $p->fake_full_path,
+ 'relatives'
=> array($p->mask),
+ 'operation'
=> VFS_OPERATION_EDITED_COMMENT
+ )
+ );
+ }
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ //Nothing was done, because nothing required !
+ //This is a kind of bug isn't it ?
+ //So I let people choose to debug here :/
+ //FIXME : decide what we are doing here !
+ return true;
+ }
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function file_type($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if(!$this->acl_check(array(
+ 'string' => $p->fake_full_path,
+ 'relatives' => array($p->mask),
+ 'operation' => PHPGW_ACL_READ,
+ 'must_exist' => true
+ ))
+ )
+ {
+ return false;
+ }
+
+ if($p->outside)
+ {
+ if(is_dir($p->real_full_path))
+ {
+ return('Directory');
+ }
+
+ /*
+ We don't return an empty string here,
because it may still match with a database query
+ because of linked directories
+ */
+ }
+
+ /*
+ We don't use ls() because it calls file_type() to
determine if it has been
+ passed a directory
+ */
+ $db2 = clone($GLOBALS['phpgw']->db);
+ $db2->query("SELECT mime_type FROM phpgw_vfs WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+ $db2->next_record();
+ $mime_type = $db2->f('mime_type');
+ if(!$mime_type)
+ {
+ $mime_type =
$this->get_ext_mime_type(array('string' => $data['string']));
+ {
+ $db2->query("UPDATE phpgw_vfs SET
mime_type='{$mime_type}' WHERE directory='{$p->fake_leading_dirs_clean}' AND
name='{$p->fake_name_clean}'" . $this->extra_sql(array('query_type' =>
VFS_SQL_SELECT)), __LINE__, __FILE__);
+ }
+ }
+
+ return $mime_type;
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function file_exists($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if($p->outside)
+ {
+ $rr = file_exists($p->real_full_path);
+
+ return $rr;
+ }
+
+ $db2 = clone($GLOBALS['phpgw']->db);
+ $db2->query("SELECT name FROM phpgw_vfs WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+
+ if($db2->next_record())
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function get_size($data)
+ {
+ $size = parent::get_size($data);
+ /*XXX Caeies : Not sure about this, but ... */
+ /* If the virtual size is always 4096, we don't need
this ... */
+/* if($data['checksubdirs'])
+ {
+ $query = $GLOBALS['phpgw']->db->query("SELECT
size FROM phpgw_vfs WHERE directory='".$p->fake_leading_dirs_clean."' AND
name='".$p->fake_name_clean."'" . $this->extra_sql(array('query_text' =>
VFS_SQL_SELECT)));
+ $GLOBALS['phpgw']->db->next_record();
+ $size += $GLOBALS['phpgw']->db->Record[0];
+ }
+*/
+ return $size;
+ }
+
+ /* temporary wrapper function for not working Record function
in adodb layer(ceb)*/
+ function Record()
+ {
+ $values = array();
+ foreach($this->attributes as $attribute)
+ {
+ $values[$attribute] =
$GLOBALS['phpgw']->db->f($attribute);
+ }
+ return $values;
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function ls($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' => array(RELATIVE_CURRENT),
+ 'checksubdirs' => true,
+ 'mime_type' => false,
+ 'nofiles' => false,
+ 'orderby' => 'directory'
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+ //_debug_array($data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ //_debug_array($p);
+
+ $ftype = $this->file_type( array('string' =>
$p->fake_full_path, 'relatives' => array($p->mask) ) );
+ /* If they pass us a file or 'nofiles' is set, return
the info for $dir only */
+ if(($ftype != 'Directory' || $data['nofiles'] ) &&
!$p->outside)
+ {
+ /* SELECT all, the, attributes */
+ $sql = 'SELECT ' . implode(', ',
$this->attributes)
+ . " FROM phpgw_vfs WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}' "
+ .
$this->extra_sql(array('query_type' => VFS_SQL_SELECT));
+
+ $query = $GLOBALS['phpgw']->db->query($sql,
__LINE__, __FILE__);
+ if($GLOBALS['phpgw']->db->num_rows() == 0)
+ {
+ return array();
+ }
+ $GLOBALS['phpgw']->db->next_record();
+ $record = $this->Record();
+ //echo 'record: ' . _debug_array($record);
+
+ /* We return an array of one array to maintain
the standard */
+ $rarray = array();
+ reset($this->attributes);
+ while(list($num, $attribute) =
each($this->attributes))
+ {
+ if($attribute == 'mime_type' &&
!$record[$attribute])
+ {
+ $db2 =
clone($GLOBALS['phpgw']->db);
+ $record[$attribute] =
$this->get_ext_mime_type(array(
+ 'string' =>
$p->fake_name_clean
+ )
+ );
+
+ if($record[$attribute])
+ {
+ $db2->query("UPDATE
phpgw_vfs SET mime_type='{$record[$attribute]}' WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+ }
+ }
+
+ $rarray[0][$attribute] =
$record[$attribute];
+ }
+
+ return $rarray;
+ }
+
+ //WIP - this should recurse using the same options the
virtual part of ls() does
+ /* If $dir is outside the virutal root, we have to
check the file system manually */
+ if($p->outside)
+ {
+ if($this->file_type(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array($p->mask)
+ )) == 'Directory'
+ && !$data['nofiles']
+ )
+ {
+ $dir_handle =
opendir($p->real_full_path);
+ while($filename = readdir($dir_handle))
+ {
+ if($filename == '.' ||
$filename == '..')
+ {
+ continue;
+ }
+ $rarray[] =
$this->get_real_info(array(
+ 'string'
=> "{$p->real_full_path}/{$filename}",
+ 'relatives'
=> array($p->mask)
+ )
+ );
+ }
+ }
+ else
+ {
+ $rarray[] = $this->get_real_info(array(
+ 'string' =>
$p->real_full_path,
+ 'relatives' =>
array($p->mask)
+ )
+ );
+ }
+
+ return $rarray;
+ }
+
+ /* $dir's not a file, is inside the virtual root, and
they want to check subdirs */
+ /* SELECT all, the, attributes FROM phpgw_vfs WHERE
file=$dir */
+ $sql = 'SELECT ' . implode(',', $this->attributes);
+
+ $dir_clean = $this->clean_string(array('string' =>
$p->fake_full_path));
+ $sql .= " FROM phpgw_vfs WHERE directory LIKE
'$dir_clean%'";
+ $sql .= $this->extra_sql(array('query_type' =>
VFS_SQL_SELECT));
+
+ if($data['mime_type'])
+ {
+ $sql .= " AND
mime_type='".$data['mime_type']."'";
+ }
+
+ $sql .= ' ORDER BY '.$data['orderby'];
+
+ $query = $GLOBALS['phpgw']->db->query($sql, __LINE__,
__FILE__);
+
+ $rarray = array();
+ while( $GLOBALS['phpgw']->db->next_record() )
+ {
+ $record = $this->Record();
+
+ //_debug_array($record);
+ /* Further checking on the directory. This
makes sure /home/user/test won't match /home/user/test22 */
+ if(address@hidden("^{$p->fake_full_path}(/|$)",
$record['directory']))
+ {
+ continue;
+ }
+
+ /* If they want only this directory, then $dir
should end without a trailing / */
+ if(!$data['checksubdirs'] &&
ereg("^{$p->fake_full_path}/", $record['directory']))
+ {
+ continue;
+ }
+
+ $db2 = clone($GLOBALS['phpgw']->db);
+ if( isset($this->attributes['mime_type']) &&
!isset($record['mime_type']) )
+ {
+ $record['mime_type'] ==
$this->get_ext_mime_type(array('string' => $p->fake_name_clean));
+
+ if( $record['mime_type'] )
+ {
+ $db2->query("UPDATE phpgw_vfs
SET mime_type='{$record[$attribute]}' WHERE
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" .
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+
+ }
+ }
+ $rarray[] = $record;
+ }
+ return $rarray;
+ }
+
+ /*
+ * See vfs_shared
+ */
+ function update_real($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if(file_exists($p->real_full_path))
+ {
+ if(is_dir($p->real_full_path))
+ {
+ $dir_handle =
opendir($p->real_full_path);
+ while($filename = readdir($dir_handle))
+ {
+ if($filename == '.' ||
$filename == '..')
+ {
+ continue;
+ }
+
+ $rarray[] =
$this->get_real_info(array(
+ 'string'
=> $p->fake_full_path . '/' . $filename,
+ 'relatives'
=> array(RELATIVE_NONE)
+ )
+ );
+ }
+ }
+ else
+ {
+ $rarray[] = $this->get_real_info(array(
+ 'string' =>
$p->fake_full_path,
+ 'relatives' =>
array(RELATIVE_NONE)
+ )
+ );
+ }
+
+ if(!is_array($rarray))
+ {
+ $rarray = array();
+ }
+
+ while(list($num, $file_array) = each($rarray))
+ {
+ $p2 = $this->path_parts(array(
+ 'string' =>
$file_array['directory'] . '/' . $file_array['name'],
+ 'relatives' =>
array(RELATIVE_NONE)
+ )
+ );
+
+ /* Note the mime_type. This can be
"Directory", which is how we create directories */
+ $set_attributes_array = Array(
+ 'size' => $file_array['size'],
+ 'mime_type' =>
$file_array['mime_type']
+ );
+
+ if(!$this->file_exists(array(
+ 'string' =>
$p2->fake_full_path,
+ 'relatives' =>
array(RELATIVE_NONE)
+ ))
+ )
+ {
+ $this->touch(array(
+ 'string'
=> $p2->fake_full_path,
+ 'relatives'
=> array(RELATIVE_NONE)
+ )
+ );
+
+ $this->set_attributes(array(
+ 'string'
=> $p2->fake_full_path,
+ 'relatives'
=> array(RELATIVE_NONE),
+ 'attributes'
=> $set_attributes_array
+ )
+ );
+ }
+ else
+ {
+ $this->set_attributes(array(
+ 'string'
=> $p2->fake_full_path,
+ 'relatives'
=> array(RELATIVE_NONE),
+ 'attributes'
=> $set_attributes_array
+ )
+ );
+ }
+ }
+ }
+ }
+
+ /* Helper functions */
+
+ /* This fetchs all available file system information for
string(not using the database) */
+ function get_real_info($data)
+ {
+ if(!is_array($data))
+ {
+ $data = array();
+ }
+
+ $default_values = array
+ (
+ 'relatives' =>
array(RELATIVE_CURRENT)
+ );
+
+ $data = array_merge($this->default_values($data,
$default_values), $data);
+
+ $p = $this->path_parts(array(
+ 'string' => $data['string'],
+ 'relatives' =>
array($data['relatives'][0])
+ )
+ );
+
+ if(is_dir($p->real_full_path))
+ {
+ $mime_type = 'Directory';
+ }
+ else
+ {
+ $mime_type = $this->get_ext_mime_type(array(
+ 'string' => $p->fake_name
+ )
+ );
+
+ if($mime_type)
+ {
+ $GLOBALS['phpgw']->db->query("UPDATE
phpgw_vfs SET mime_type='".$mime_type."' WHERE
directory='".$p->fake_leading_dirs_clean."' AND name='".$p->fake_name_clean."'"
. $this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+ }
+ }
+
+ $size = filesize($p->real_full_path);
+ $rarray = array(
+ 'directory' => $p->fake_leading_dirs,
+ 'name' => $p->fake_name,
+ 'size' => $size,
+ 'mime_type' => $mime_type
+ );
+
+ return($rarray);
+ }
+ }
Copied:
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php
(from rev 11619, trunk/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php)
===================================================================
---
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php
(rev 0)
+++
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php
2014-01-22 17:26:09 UTC (rev 11620)
@@ -0,0 +1,128 @@
+<?php
+ /**
+ * Fileoperation
+ * @author Sigurd Nes <address@hidden>
+ * @copyright Copyright (C) 2014 Free Software Foundation, Inc.
http://www.fsf.org/
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General
Public License v2 or later
+ * @package phpgwapi
+ * @subpackage vfs
+ * @version $Id: class.acl.inc.php 11567 2013-12-23 12:49:00Z sigurdne $
+ */
+
+ /*
+ This program is free software: you can redistribute it and/or
modify
+ it under the terms of the GNU Lesser General Public License as
published by
+ the Free Software Foundation, either version 2 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General
Public License
+ along with this program. If not, see
<http://www.gnu.org/licenses/>.
+ */
+
+ class phpgwapi_vfs_fileoperation_braArkiv
+ {
+ public function __construct()
+ {
+
+ }
+
+ public function filesize($path_parts)
+ {
+ $path = $path_parts->real_full_path;
+ return filesize($path);
+ }
+
+ public function read($path_parts)
+ {
+ $path = $path_parts->real_full_path;
+ $contents = null;
+ if( $filesize = $this->filesize($path) > 0 && $fp =
fopen($path, 'rb'))
+ {
+ $contents = fread($fp, $filesize);
+ fclose ($fp);
+ }
+ return $contents;
+ }
+
+ //not relevant to braArkiv
+ public function copy($from, $to)
+ {
+ return copy($from->real_full_path, $to->real_full_path);
+ }
+
+
+ public function write($path_parts, $content)
+ {
+ $write_ok = false;
+ if($fp = fopen($path_parts->real_full_path, 'wb'))
+ {
+ fwrite($fp, $content, strlen($content));
+ fclose($fp);
+ $write_ok = true;
+ }
+ return $write_ok;
+ }
+
+
+ public function touch($path_parts)
+ {
+ return @touch($path_parts->real_full_path);
+ }
+
+ public function rename($from, $to)
+ {
+ return rename($from->real_full_path,
$to->real_full_path);
+ }
+
+ /*
+ *Deletes a file
+ */
+ public function unlink($path_parts)
+ {
+ return unlink($path_parts->real_full_path);
+ }
+
+ /*
+ *Removes directory
+ */
+ public function rmdir($path_parts)
+ {
+ return rmdir($path_parts->real_full_path);
+ }
+
+ public function check_target_directory($path_parts)
+ {
+ return file_exists($path_parts->real_leading_dirs);
+ }
+
+ public function auto_create_home($basedir)
+ {
+ if(!file_exists($basedir.'/home'))
+ {
+ @mkdir($basedir.'/home', 0770);
+ }
+ }
+
+ public function file_exists($path_parts)
+ {
+ return file_exists($path_parts->real_full_path);
+ }
+
+ public function is_dir($path_parts)
+ {
+ return is_dir($path_parts->real_full_path);
+ }
+
+ public function mkdir($path_parts)
+ {
+ return mkdir($path_parts->real_full_path, 0770);
+ }
+
+
+
+ }
Modified: branches/Version-1_0-branch/phpgwapi/setup/setup.inc.php
===================================================================
--- branches/Version-1_0-branch/phpgwapi/setup/setup.inc.php 2014-01-22
16:34:43 UTC (rev 11619)
+++ branches/Version-1_0-branch/phpgwapi/setup/setup.inc.php 2014-01-22
17:26:09 UTC (rev 11620)
@@ -12,7 +12,7 @@
// Basic information about this app
$setup_info['phpgwapi']['name'] = 'phpgwapi';
$setup_info['phpgwapi']['title'] = 'phpgwapi';
- $setup_info['phpgwapi']['version'] = '0.9.17.542';
+ $setup_info['phpgwapi']['version'] = '0.9.17.543';
$setup_info['phpgwapi']['versions']['current_header'] = '1.31';
$setup_info['phpgwapi']['versions']['system'] = '1.0';
$setup_info['phpgwapi']['enable'] = 3;
Modified: branches/Version-1_0-branch/phpgwapi/setup/tables_current.inc.php
===================================================================
--- branches/Version-1_0-branch/phpgwapi/setup/tables_current.inc.php
2014-01-22 16:34:43 UTC (rev 11619)
+++ branches/Version-1_0-branch/phpgwapi/setup/tables_current.inc.php
2014-01-22 17:26:09 UTC (rev 11620)
@@ -289,7 +289,8 @@
'link_directory' => array('type' =>
'text','nullable' => True),
'link_name' => array('type' =>
'text','nullable' => True),
'version' => array('type' =>
'varchar','precision' => 30,'nullable' => False,'default' => '0.0.0.0'),
- 'content' => array('type' => 'text','nullable'
=> True)
+ 'content' => array('type' => 'text','nullable'
=> True),
+ 'external_id' => array('type' =>
'int','precision' => 8,'nullable' => True),
),
'pk' => array('file_id'),
'fk' => array(),
Modified: branches/Version-1_0-branch/phpgwapi/setup/tables_update.inc.php
===================================================================
--- branches/Version-1_0-branch/phpgwapi/setup/tables_update.inc.php
2014-01-22 16:34:43 UTC (rev 11619)
+++ branches/Version-1_0-branch/phpgwapi/setup/tables_update.inc.php
2014-01-22 17:26:09 UTC (rev 11620)
@@ -3155,36 +3155,26 @@
}
}
-/*
+
$test[] = '0.9.17.542';
+ /**
+ * Enable external integration with vfs
+ *
+ * @return string the new version number
+ */
function phpgwapi_upgrade0_9_17_542()
{
$GLOBALS['phpgw_setup']->oProc->m_odb->transaction_begin();
-
$GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cust_attribute','location_id',array(
+
$GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_vfs','external_id', array(
'type' => 'int',
- 'precision' => 4,
- 'nullable' => false,
+ 'precision' => 8,
+ 'nullable' => true
));
-
$GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cust_attribute','id',array(
- 'type' => 'int',
- 'precision' => 4,
- 'nullable' => false,
- ));
-
$GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cust_attribute','group_id',array(
- 'type' => 'int',
- 'precision' => 4,
- 'nullable' => true,
- 'default' => 0
- ));
-
if($GLOBALS['phpgw_setup']->oProc->m_odb->transaction_commit())
{
$GLOBALS['setup_info']['phpgwapi']['currentver'] =
'0.9.17.543';
return $GLOBALS['setup_info']['phpgwapi']['currentver'];
}
}
-
-*/
-
Modified: branches/Version-1_0-branch/property/inc/export/default/Agresso_X114
===================================================================
--- branches/Version-1_0-branch/property/inc/export/default/Agresso_X114
2014-01-22 16:34:43 UTC (rev 11619)
+++ branches/Version-1_0-branch/property/inc/export/default/Agresso_X114
2014-01-22 17:26:09 UTC (rev 11620)
@@ -930,10 +930,14 @@
if($accountline)
{
+ $this->db->query('SELECT category FROM
fm_vendor WHERE id=' . (int) $oRsBilag[0]['spvend_code']);
+ $this->db->next_record();
+ $_vendor_category = $this->db->f('category');
+
$accountline[] = array
(
'TRANSACTIONTYPE' =>
'R114',
- 'ACCOUNTLINK.CODE' => 2400,
+ 'ACCOUNTLINK.CODE' =>
$_vendor_category == 1 ? 2400 : 2460,
'CURRENCY'
=> $oRsBilag[0]['currency'],
'AMOUNT'
=> (-1 * $sum_amount),
'TAXCODE'
=> $oRsBilag[0]['mvakode'],
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Fmsystem-commits] [11620] Merge 11614:11619 from trunk,
Sigurd Nes <=