/** * processUsDollarColumns * * automatically update *_usdollar fields for backward compatibility * with modules that still use this field. The *_usdollar fields use * the base_rate field for the rate calculations. * * @access protected * @param string $currencyId * @return boolean true on success */ protected function processUsDollarColumns($currencyId) { // loop through all the tables foreach ($this->usDollarColumnDefinitions as $tableName => $tableDefs) { $columns = $this->db->get_columns($tableName); if (empty($columns)) { continue; } foreach ($tableDefs as $amountColumn => $usDollarColumn) { if (empty($columns[$amountColumn]) || empty($columns[$usDollarColumn]) || empty($columns['base_rate'])) { continue; } if (!$this->doCustomUpdateUsDollarRate($tableName, $usDollarColumn, $amountColumn, $currencyId)) { if (!$this->doUpdateUsDollarRate($tableName, $usDollarColumn, $amountColumn, $currencyId)) { return false; } } } } return true; }
public function testRepairTableParamsAddIndex() { $tableName = 'test1_' . mt_rand(); $params = array('foo' => array('name' => 'foo', 'type' => 'varchar', 'len' => '255'), 'bar' => array('name' => 'bar', 'type' => 'int')); $index = array('name' => 'test_index', 'type' => 'index', 'fields' => array('foo', 'bar', 'bazz')); if ($this->_db->tableExists($tableName)) { $this->_db->dropTableName($tableName); } $this->createTableParams($tableName, $params, array()); $params['bazz'] = array('name' => 'bazz', 'type' => 'int'); $repair = $this->_db->repairTableParams($tableName, $params, array($index), false); $this->assertRegExp('#MISSING IN DATABASE.*bazz#i', $repair); $this->assertRegExp('#MISSING INDEX IN DATABASE.*test_index#i', $repair); $repair = $this->_db->repairTableParams($tableName, $params, array($index), true); $idx = $this->_db->get_indices($tableName); $this->assertArrayHasKey('test_index', $idx); $this->assertContains('foo', $idx['test_index']['fields']); $this->assertContains('bazz', $idx['test_index']['fields']); $cols = $this->_db->get_columns($tableName); $this->assertArrayHasKey('bazz', $cols); $this->assertEquals('bazz', $cols['bazz']['name']); $this->assertEquals($this->_db->getColumnType('int'), $cols['bazz']['type']); $this->dropTableName($tableName); }
function create_select($key = 'display_columns', $field_list_name = 'select_fields') { $this->layout_manager->setAttribute('context', 'Select'); $got_count = 0; $got_join = array(); foreach ($this->report_def[$key] as $index => $display_column) { if ($display_column['name'] == 'count') { if ('self' != $display_column['table_key']) { // use table name itself, not it's alias $table_name = $this->alias_lookup[$display_column['table_key']]; } else { // use table alias if (isset($this->full_table_list['self']['params']['join_table_alias'])) { $table_name = $this->full_table_list['self']['params']['join_table_alias']; } else { $table_name = $this->full_bean_list['self']->table_name; } } $select_piece = "COUNT({$table_name}.id) {$table_name}__allcount, COUNT(DISTINCT {$table_name}.id) {$table_name}__count "; $got_count = 1; } else { if ($field_list_name == 'total_select_fields' && empty($display_column['group_function'])) { continue; } $this->register_field_for_query($display_column); // this hack is so that the id field for every table is always selected if (empty($display_column['table_key'])) { $this->handleException('table_key doesnt exist for ' . $display_column['name']); } if ($display_column['type'] == 'fullname') { $name = "{$key}_{$display_column['name']}"; $this->report_def[$name] = $this->createNameList($display_column['table_key']); $this->create_select($name, $field_list_name); continue; } if (empty($got_join[$display_column['table_key']])) { $id_column = array(); $got_join[$display_column['table_key']] = 1; if (!empty($display_column['column_key']) && !empty($this->all_fields[$display_column['column_key']]) && !empty($this->all_fields[$display_column['column_key']]['custom_type'])) { $do_id = 0; } else { $do_id = 1; } // Bug 45019: don't add ID column if this column is the ID column // PAT-1008: add id column to select for summation query to make name column linkable if ($field_list_name != 'total_select_fields' && ($field_list_name != 'summary_select_fields' || $display_column['type'] == 'name') && $do_id) { $id_column['name'] = 'id'; $id_column['type'] = 'id'; $id_column['table_key'] = $display_column['table_key']; if (preg_match('/_cstm/', $display_column['table_alias']) > 0) { // bug #49475 $id_column['table_alias'] = $this->focus->table_name; } else { $id_column['table_alias'] = $display_column['table_alias']; } $id_column['column_key'] = $id_column['table_key'] . ':' . $id_column['name']; $select_piece = $this->layout_manager->widgetQuery($id_column); if (!$this->select_already_defined($select_piece, $field_list_name)) { array_push($this->{$field_list_name}, $select_piece); // PAT-1008: add id column to group by since it's added to select for summation query. Required by non-mysql dbs if ($field_list_name == 'summary_select_fields') { $this->layout_manager->setAttribute('context', 'GroupBy'); $this->group_by_arr[] = $this->layout_manager->widgetQuery($id_column); $this->layout_manager->setAttribute('context', 'Select'); } } } } // specify "currency_alias" parameter for fields of currency type if (!empty($display_column['column_key']) && !empty($this->all_fields[$display_column['column_key']]) && $display_column['type'] == 'currency') { $field_def = $this->all_fields[$display_column['column_key']]; if (strpos($field_def['name'], '_usdoll') === false) { $display_column['currency_alias'] = $display_column['table_alias'] . '_currencies'; } } $select_piece = $this->layout_manager->widgetQuery($display_column); } // Bug 40573: addon field for "day" "select" field if (isset($display_column['column_function']) && $display_column['column_function'] == 'day') { $addon_dispay_column = $display_column; $addon_dispay_column['column_function'] = 'dayreal'; $addon_select_piece = $this->layout_manager->widgetQuery($addon_dispay_column); if (!$this->select_already_defined($addon_select_piece, $field_list_name)) { array_push($this->{$field_list_name}, $addon_select_piece); } } if (!$this->select_already_defined($select_piece, $field_list_name)) { array_push($this->{$field_list_name}, $select_piece); } if (!empty($display_column['column_key']) && !empty($this->all_fields[$display_column['column_key']])) { $field_def = $this->all_fields[$display_column['column_key']]; if (!empty($field_def['ext2'])) { $select_piece = $this->getExt2FieldDefSelectPiece($field_def); array_push($this->{$field_list_name}, $select_piece); } } // for SUM currency fields add params to join 'currencies' table if (!empty($display_column['column_key']) && !empty($this->all_fields[$display_column['column_key']]) && !empty($display_column['group_function']) && isset($display_column['field_type']) && $display_column['field_type'] == 'currency' && strpos($display_column['name'], '_usdoll') === false && isset($display_column['currency_alias']) && !isset($this->currency_join[$key][$display_column['currency_alias']])) { $table_key = $this->full_bean_list[$display_column['table_key']]->table_name; $bean_table_alias = $display_column['table_key'] === 'self' ? $table_key : $this->getRelatedAliasName($display_column['table_key']); // by default, currency table is joined to the alias of primary table $table_alias = $bean_table_alias; // but if the field is contained in a custom table, use it's alias for join $field_def = $this->all_fields[$display_column['column_key']]; if ($field_def['real_table'] != $table_key) { $columns = $this->db->get_columns($field_def['real_table']); if (isset($columns['currency_id'])) { $table_alias = $display_column['table_alias']; } } // create additional join of currency table for each module containing currency fields $this->currency_join[$key][$display_column['currency_alias']] = $table_alias; } } // 'register' the joins for the other column defs since we need to join all for summary to work.. else the count and maybe other group functions won't work. if ($key == 'display_columns') { $key = 'summary_columns'; } else { $key = 'display_columns'; } if ($got_count == 0 && $field_list_name == 'summary_select_fields') { array_push($this->{$field_list_name}, 'count(*) count'); } }