diff --git a/gulliver/js/ext/pmos-common.js b/gulliver/js/ext/pmos-common.js index 784f3ac7f..871ca01cc 100755 --- a/gulliver/js/ext/pmos-common.js +++ b/gulliver/js/ext/pmos-common.js @@ -347,3 +347,8 @@ String.prototype.trim = function() { return this.replace(/^\s+|\s+get/g,""); //return Ext.util.Format.trim(this); } + +String.prototype.nl2br = function () { + return this.replace(/\n/g,'
'); +} + diff --git a/workflow/engine/classes/class.pmTable.php b/workflow/engine/classes/class.pmTable.php index 704535cf0..011c24750 100755 --- a/workflow/engine/classes/class.pmTable.php +++ b/workflow/engine/classes/class.pmTable.php @@ -180,7 +180,7 @@ class PmTable $this->prepare($loadSchema); $this->phingbuildModel(); $this->phingbuildSql(); - $this->upgradeDatabaseFor($this->dataSource, $tablesList); + //$this->upgradeDatabaseFor($this->dataSource, $tablesList); } /** @@ -349,7 +349,12 @@ class PmTable $stmt = $con->createStatement(); if (is_object($con)) { - $stmt->executeQuery("DROP TABLE {$tableName}"); + try { + $stmt->executeQuery("DROP TABLE {$tableName}"); + } + catch (Exception $e) { + throw new Exception("Phisical table '$tableName' does not exist!"); + } } } @@ -467,12 +472,13 @@ class PmTable } - public function upgradeDatabaseFor($dataSource, $tablesList) + public function upgradeDatabaseFor($dataSource, $tablesList = array()) { $con = Propel::getConnection($dataSource); $stmt = $con->createStatement(); $lines = file($this->dataDir . $this->dbConfig->adapter . PATH_SEP . 'schema.sql'); $previous = NULL; + $errors = ''; foreach ($lines as $j => $line) { $line = trim($line); // Remove comments from the script @@ -509,17 +515,27 @@ class PmTable $line = substr($line, 0, strrpos($line, ";")); // execute - if (stripos($line, 'CREATE TABLE') !== false || stripos($line, 'DROP TABLE') !== false) { + $isCreate = stripos($line, 'CREATE TABLE') !== false; + $isDrop = stripos($line, 'DROP TABLE') !== false; + + if ($isCreate || $isDrop) { if (preg_match('/TABLE\s[\'\"\`]+(\w+)[\'\"\`]+/i', $line, $match)) { if (in_array($match[1], $tablesList)) { //error_log($line); - $stmt->executeQuery($line); + try { + $stmt->executeQuery($line); + } + catch(Exception $e) { + $errors .= $e->getMessage() . "\n"; + continue; + } + } } } - } - + + return $errors; } /** diff --git a/workflow/engine/classes/class.processMap.php b/workflow/engine/classes/class.processMap.php index f82dbe550..96786ec94 100755 --- a/workflow/engine/classes/class.processMap.php +++ b/workflow/engine/classes/class.processMap.php @@ -2273,6 +2273,7 @@ class processMap { $oCriteria->addSelectColumn(ReportTablePeer::PRO_UID); $oCriteria->addSelectColumn(ReportTablePeer::REP_TAB_NAME); $oCriteria->addSelectColumn(ReportTablePeer::REP_TAB_TYPE); + $oCriteria->addSelectColumn(ReportTablePeer::REP_TAB_CONNECTION); // $oCriteria->addAsColumn ( 'REP_TAB_TITLE', 'C.CON_VALUE' ); $oCriteria->addAsColumn('REP_TAB_TITLE', "CASE WHEN C.CON_VALUE IS NULL THEN (SELECT DISTINCT MAX(A.CON_VALUE) FROM CONTENT A WHERE A.CON_ID = REPORT_TABLE.REP_TAB_UID ) ELSE C.CON_VALUE END "); $oCriteria->addAlias('C', 'CONTENT'); diff --git a/workflow/engine/classes/model/AdditionalTables.php b/workflow/engine/classes/model/AdditionalTables.php index 1b934e888..91fad0d46 100755 --- a/workflow/engine/classes/model/AdditionalTables.php +++ b/workflow/engine/classes/model/AdditionalTables.php @@ -27,26 +27,22 @@ class AdditionalTables extends BaseAdditionalTables { * Function load * access public */ - public function load($sUID, $bFields = false) { - try { - $oAdditionalTables = AdditionalTablesPeer::retrieveByPK($sUID); - if (!is_null($oAdditionalTables)) { - $aFields = $oAdditionalTables->toArray(BasePeer::TYPE_FIELDNAME); - $this->fromArray($aFields, BasePeer::TYPE_FIELDNAME); + public function load($sUID, $bFields = false) + { + $oAdditionalTables = AdditionalTablesPeer::retrieveByPK($sUID); + + if (is_null($oAdditionalTables)) { + return null; + } - if ($bFields) { - $aFields['FIELDS'] = $this->getFields(); - } - - return $aFields; - } - else { - throw(new Exception('This row doesn\'t exist!')); - } - } - catch (Exception $oError) { - throw($oError); + $aFields = $oAdditionalTables->toArray(BasePeer::TYPE_FIELDNAME); + $this->fromArray($aFields, BasePeer::TYPE_FIELDNAME); + + if ($bFields) { + $aFields['FIELDS'] = $this->getFields(); } + + return $aFields; } public function getFields() @@ -709,6 +705,7 @@ class AdditionalTables extends BaseAdditionalTables { $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TYPE); $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TAG); $oCriteria->addSelectColumn(AdditionalTablesPeer::PRO_UID); + $oCriteria->addSelectColumn(AdditionalTablesPeer::DBS_UID); if (isset($process)) { foreach ($process as $key => $pro_uid) { diff --git a/workflow/engine/controllers/pmTablesProxy.php b/workflow/engine/controllers/pmTablesProxy.php index 6bf4a90d5..d2ac7bac5 100755 --- a/workflow/engine/controllers/pmTablesProxy.php +++ b/workflow/engine/controllers/pmTablesProxy.php @@ -54,6 +54,7 @@ class pmTablesProxy extends HttpProxyController $addTables['rows'][] = array( 'ADD_TAB_UID' => $oldRepTab['REP_TAB_UID'], 'PRO_UID' => $oldRepTab['PRO_UID'], + 'DBS_UID' => ($oldRepTab['REP_TAB_CONNECTION']=='wf'? 'workflow' : 'rp'), 'ADD_TAB_DESCRIPTION' => $oldRepTab['REP_TAB_TITLE'], 'ADD_TAB_NAME' => $oldRepTab['REP_TAB_NAME'], 'ADD_TAB_TYPE' => $oldRepTab['REP_TAB_TYPE'], @@ -64,6 +65,19 @@ class pmTablesProxy extends HttpProxyController else { $addTables = AdditionalTables::getAll($start, $limit, $filter); } + + foreach ($addTables['rows'] as $i => $table) { + $con = Propel::getConnection($table['DBS_UID']); + $stmt = $con->createStatement(); + $rs = $stmt->executeQuery('SELECT COUNT(*) AS NUM_ROWS from ' . $table['ADD_TAB_NAME']); + if ($rs->next()) { + $r = $rs->getRow(); + $addTables['rows'][$i]['NUM_ROWS'] = $r['NUM_ROWS']; + } + else { + $addTables['rows'][$i]['NUM_ROWS'] = 0; + } + } return $addTables; } @@ -223,6 +237,13 @@ class pmTablesProxy extends HttpProxyController case 'INT': $columns[$i]->field_type = 'INTEGER'; break; case 'TEXT': $columns[$i]->field_type = 'LONGVARCHAR'; break; } + + // VALIDATIONS + if ($columns[$i]->field_autoincrement) { + if ($columns[$i]->field_type !== 'INTEGER') { + $columns[$i]->field_autoincrement = false; + } + } } G::loadClass('pmTable'); @@ -291,7 +312,8 @@ class pmTablesProxy extends HttpProxyController $result->success = true; $result->message = $result->msg = $buildResult; - } catch (Exception $e) { + } + catch (Exception $e) { $buildResult = ob_get_contents(); ob_end_clean(); $result->success = false; @@ -319,24 +341,46 @@ class pmTablesProxy extends HttpProxyController public function delete($httpData) { $rows = G::json_decode(stripslashes($httpData->rows)); - - try { - foreach ($rows as $row ) { + $errors = ''; + $count = 0; + + foreach ($rows as $row ) { + try { + $at = new AdditionalTables(); + $table = $at->load($row->id); + + if (!isset($table)) { + throw new Exception("Table does not exist... skipped!\n"); + } + if($row->type == 'CLASSIC') { G::LoadClass('reportTables'); $rp = new reportTables(); $rp->deleteReportTable($row->id); - } else { - $at = new AdditionalTables(); + $count++; + } + else { $at->deleteAll($row->id); + $count++; } + } catch(Exception $e) { + $tableName = isset($table['ADD_TAB_NAME']) ? $table['ADD_TAB_NAME'] : $row->id; + $errors .= $e->getMessage() . "\n"; + continue; } - $result->success = true; - } catch(Exception $e) { - $result->success = true; // if the table does not exist just skip it and don't show messages for it - $result->msg = $e->getMessage(); } + if ($errors == '') { + $result->success = true; + $result->message = "$count tables removed Successfully."; + } + else { + $result->success = false; + $result->message = "$count tables removed but with errors.\n$errors" ; + } + + $result->errors = $errors; + return $result; } @@ -655,7 +699,7 @@ class pmTablesProxy extends HttpProxyController require_once 'classes/model/AdditionalTables.php'; try { $errors = ''; - ob_start(); + $overWrite = isset($_POST['form']['OVERWRITE'])? true: false; //save the file @@ -678,11 +722,12 @@ class pmTablesProxy extends HttpProxyController if(strpos($fileContent, '-----== ProcessMaker Open Source Private Tables ==-----') === false) { throw new Exception('ID_PMTABLE_INVALID_FILE'); } - - $fp = fopen($PUBLIC_ROOT_PATH.$filename, "rb"); - $fsData = intval(fread($fp, 9)); //reading the metadata - $sType = fread($fp, $fsData); //reading string $oData + $fp = fopen($PUBLIC_ROOT_PATH.$filename, "rb"); + $fsData = intval(fread($fp, 9)); //reading the metadata + $sType = fread($fp, $fsData); + + // first create the tables structures while (!feof($fp)) { switch($sType) { case '@META': @@ -696,13 +741,12 @@ class pmTablesProxy extends HttpProxyController $fsData = intval(fread($fp, 9)); $schema = fread($fp, $fsData); $contentSchema = unserialize($schema); - $additionalTable = new additionalTables(); $tableExists = $additionalTable->loadByName($contentSchema['ADD_TAB_NAME']); $tableNameMap[$contentSchema['ADD_TAB_NAME']] = $contentSchema['ADD_TAB_NAME']; if ($overWrite) { - if($tableExists !== false) { + if ($tableExists !== false) { $additionalTable->deleteAll($tableExists['ADD_TAB_UID']); } } @@ -754,19 +798,67 @@ class pmTablesProxy extends HttpProxyController //save the table $alterTable = false; - if (!isset($processQueue[$contentSchema['DBS_UID']])) { - $processQueue[$contentSchema['DBS_UID']] = array(); - } - $processQueueTables[] = $contentSchema['ADD_TAB_NAME']; - $result = $this->save($tableData, $alterTable); - if (!$result->success) { - $errors .= $result->message . "\n\n"; + if ($result->success) { + $processQueueTables[$contentSchema['DBS_UID']][] = $contentSchema['ADD_TAB_NAME']; + } + else { + $errors .= 'Error creating table: '.$tableData->REP_TAB_NAME.'-> '.$result->message . "\n\n"; } break; + case '@DATA': + $fstName = intval(fread($fp, 9)); + $tableName = fread($fp, $fstName); + $fsData = intval(fread($fp, 9)); + if ($fsData > 0) $data = fread($fp, $fsData); + break; + } + + $fsData = intval(fread($fp, 9)); //reading the metadata + if($fsData > 0){ // reading next block type + $sType = fread($fp, $fsData); + } + else { + break; + } + + } + + fclose($fp); + G::loadClass('pmTable'); + + foreach ($processQueueTables as $dbsUid => $tables) { + $pmTable = new pmTable(); + ob_start(); + $pmTable->buildModelFor($dbsUid, $tables); + $buildResult = ob_get_contents(); + ob_end_clean(); + $errors .= $pmTable->upgradeDatabaseFor($pmTable->getDataSource(), $tables); + } + + $fp = fopen($PUBLIC_ROOT_PATH.$filename, "rb"); + $fsData = intval(fread($fp, 9)); + $sType = fread($fp, $fsData); + // data processing + + while (!feof($fp)) { + + switch($sType) { + case '@META': + $fsData = intval(fread($fp, 9)); + $METADATA = fread($fp, $fsData); + break; + + case '@SCHEMA': + $fsUid = intval(fread($fp, 9)); + $uid = fread($fp, $fsUid); + $fsData = intval(fread($fp, 9)); + $schema = fread($fp, $fsData); + break; + case '@DATA': $fstName = intval(fread($fp, 9)); $tableName = fread($fp, $fstName); @@ -779,9 +871,24 @@ class pmTablesProxy extends HttpProxyController $oAdditionalTables = new AdditionalTables(); $table = $oAdditionalTables->loadByName($tableName); + $isReport = $table['PRO_UID'] !== '' ? true : false; if ($table !== false) { - $processQueue[$contentSchema['DBS_UID']][] = array('id'=>$table[0]['ADD_TAB_UID'], 'records'=>$contentData); + if (!$isReport) { + //////////data + if (count($contentData) > 0) { + foreach ($contentData as $row) { + $data = new StdClass(); + $data->id = $table['ADD_TAB_UID']; + $data->rows = base64_encode(serialize($row)); + $res = $this->dataCreate($data , 'base64'); + } + } + //////////// + } + else { // is a report table + $oAdditionalTables->populateReportTable($tablename, $table['DBS_UID'], $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID']); + } } } break; @@ -793,41 +900,11 @@ class pmTablesProxy extends HttpProxyController } else { break; - } + } } //////////// - G::loadClass('pmTable'); - - foreach ($processQueue as $dbsUid => $tableData) { - - $pmTable = new pmTable(); - $pmTable->buildModelFor($dbsUid, $processQueueTables); - $buildResult = ob_get_contents(); - ob_end_clean(); - - if (count($tableData) > 0) { - foreach ($tableData as $rows) { - foreach ($rows['records'] as $row) { - $data = new StdClass(); - $data->id = $rows['id']; - $data->rows = base64_encode(serialize($row)); - $this->dataCreate($data , 'base64'); - } - } - } - - $additionalTable = new AdditionalTables(); - - foreach ($processQueueTables as $tablename) { - $table = $additionalTable->loadByName($tablename); - $isReport = $table['PRO_UID'] !== '' ? true : false; - - if ($table && $isReport) { - $oAdditionalTables->populateReportTable($tablename, $table['DBS_UID'], $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID']); - } - } - } + if ($errors == '') { $result->success = true; diff --git a/workflow/engine/templates/pmTables/data.js b/workflow/engine/templates/pmTables/data.js index 86c23dfdc..b0834e1fb 100755 --- a/workflow/engine/templates/pmTables/data.js +++ b/workflow/engine/templates/pmTables/data.js @@ -122,7 +122,7 @@ Ext.onReady(function(){ header : tableDef.FIELDS[i].FLD_DESCRIPTION, dataIndex : tableDef.FIELDS[i].FLD_NAME, width : 40, - align : columnAlign, + align : 'right', renderer : columnRenderer }; if (tableDef.FIELDS[i].FLD_AUTO_INCREMENT != 1) { @@ -282,7 +282,7 @@ Ext.onReady(function(){ id: 'infoGrid', height:1000, autoWidth : true, - title : _('ID_PM_TABLE') + " : " + tableDef.ADD_TAB_NAME, + //title : _('ID_PM_TABLE') + " : " + tableDef.ADD_TAB_NAME, stateful : true, stateId : 'grid', enableColumnResize: true, @@ -296,15 +296,15 @@ Ext.onReady(function(){ loadMask: true, cm: cmodel, sm: smodel, - tbar:[ newButton, - '-', - editButton, - deleteButton, - '-', - importButton, - exportButton, - {xtype: 'tbfill'}, - backButton ], + tbar:[ + newButton, + '-', + editButton, + deleteButton, + '-', + importButton, + exportButton + ], bbar: bbarpaging } diff --git a/workflow/engine/templates/pmTables/list.js b/workflow/engine/templates/pmTables/list.js index 0e42c242b..5bb68407c 100755 --- a/workflow/engine/templates/pmTables/list.js +++ b/workflow/engine/templates/pmTables/list.js @@ -197,6 +197,7 @@ Ext.onReady(function(){ {name : 'ADD_TAB_TYPE'}, {name : 'ADD_TAB_TAG'}, {name : 'PRO_UID'}, + {name : 'NUM_ROWS'} ] }) }); @@ -216,7 +217,10 @@ Ext.onReady(function(){ editButton.enable(); deleteButton.enable(); exportButton.enable(); - dataButton.enable(); + row = sm.getSelected(); + if (row.data.NUM_ROWS > 0) { + dataButton.enable(); + } break; default: editButton.disable(); @@ -253,6 +257,8 @@ Ext.onReady(function(){ return ''+value+' '; }}); + cmodelColumns.push({header: 'Records', dataIndex: 'NUM_ROWS', width: 90, align:'left'}); + if (PRO_UID === false) { cmodelColumns.push({header: _('ID_PROCESS'), dataIndex: 'PRO_TITLE', width: 180, align:'left'}); } @@ -421,15 +427,16 @@ DeletePMTable = function() { }, success: function(resp){ result = Ext.util.JSON.decode(resp.responseText); + Ext.getCmp('infoGrid').getStore().reload(); if (result.success) { - Ext.getCmp('infoGrid').getStore().reload(); PMExt.notify(_("ID_DELETION_SUCCESSFULLY"), _("ID_ALL_RECORDS_DELETED_SUCESSFULLY")); } else { - Ext.Msg.alert( _('ID_ERROR'), result.msg); + PMExt.error( _('ID_ERROR'), result.message.nl2br()); } }, failure: function(obj, resp){ - Ext.Msg.alert( _('ID_ERROR'), resp.result.msg); + Ext.getCmp('infoGrid').getStore().reload(); + Ext.Msg.alert( _('ID_ERROR'), resp.result.message); } }); } @@ -573,9 +580,32 @@ ExportPMTable = function(){ }; //Load PM TAble Data -PMTableData = function(){ +PMTableData = function() +{ var row = Ext.getCmp('infoGrid').getSelectionModel().getSelected(); - location.href = 'pmTables/data?id='+row.get('ADD_TAB_UID'); + //location.href = 'pmTables/data?id='+row.get('ADD_TAB_UID'); + if (row.get('TYPE') != '') { + PMExt.info(_('ID_INFO'), _('ID_DATA_LIST_NOT_AVAILABLE_FOR_OLDVER')); + return; + } + + win = new Ext.Window({ + layout:'fit', + width:700, + title: _('ID_PM_TABLE') +': '+ row.get('ADD_TAB_NAME'), + height:500, + modal: true, + maximizable: true, + constrain: true, + //closeAction:'hide', + plain: true, + items: [{ + xtype:"iframepanel", + defaultSrc : 'pmTables/data?id='+row.get('ADD_TAB_UID')+'&type='+row.get('TYPE'), + loadMask:{msg: _('ID_LOADING')} + }] + }); + win.show(); }; //Gets UIDs from a array of rows