/** * Returns an array of indices for the current module * * @return array */ private function _getIndexVardefs() { $indexes = $this->_focus->getIndices(); //grab any custom indexes if they exist if ($this->_focus->hasCustomFields()) { $custmIndexes = $this->_focus->db->helper->get_indices($this->_focus->table_name . '_cstm'); $indexes = array_merge($custmIndexes, $indexes); } // remove any that are datetime or time field as we can't dupe check them correctly since we don't export // seconds $fields = $this->_focus->getFieldDefinitions(); foreach ($indexes as $key => $index) { foreach ($index['fields'] as $field) { if (isset($fields[$field]) && ($fields[$field]['type'] == 'datetime' || $fields[$field]['type'] == 'datetimecombo' || $fields[$field]['type'] == 'time')) { unset($indexes[$key]); break 1; } } } if ($this->_focus->getFieldDefinition('email1')) { $indexes[] = array('name' => 'special_idx_email1', 'type' => 'index', 'fields' => array('email1')); } if ($this->_focus->getFieldDefinition('email2')) { $indexes[] = array('name' => 'special_idx_email2', 'type' => 'index', 'fields' => array('email2')); } return $indexes; }
/** * @see DBHelper::createTableSQL() */ public function createTableSQL(SugarBean $bean) { $tablename = $bean->getTableName(); $fieldDefs = $bean->getFieldDefinitions(); $indices = $bean->getIndices(); $engine = $this->getEngine($bean); return $this->createTableSQLParams($tablename, $fieldDefs, $indices, $engine); }
/** * Generates SQL for update statement. * * @param SugarBean $bean SugarBean instance * @param array $where Optional, where conditions in an array * @return string SQL Create Table statement */ public function updateSQL(SugarBean $bean, array $where = array()) { $primaryField = $bean->getPrimaryFieldDefinition(); $columns = array(); $fields = $bean->getFieldDefinitions(); // get column names and values foreach ($fields as $field => $fieldDef) { if (isset($fieldDef['source']) && $fieldDef['source'] != 'db') { continue; } // Do not write out the id field on the update statement. // We are not allowed to change ids. if ($fieldDef['name'] == $primaryField['name']) { continue; } // If the field is an auto_increment field, then we shouldn't be setting it. This was added // specially for Bugs and Cases which have a number associated with them. if (!empty($bean->field_name_map[$field]['auto_increment'])) { continue; } //custom fields handle their save separately if (isset($bean->field_name_map) && !empty($bean->field_name_map[$field]['custom_type'])) { continue; } // no need to clear deleted since we only update not deleted records anyway if ($fieldDef['name'] == 'deleted' && empty($bean->deleted)) { continue; } if (isset($bean->{$field})) { $val = from_html($bean->{$field}); } else { continue; } if (!empty($fieldDef['type']) && $fieldDef['type'] == 'bool') { $val = $bean->getFieldValue($field); } if (strlen($val) == 0) { if (isset($fieldDef['default']) && strlen($fieldDef['default']) > 0) { $val = $fieldDef['default']; } else { $val = null; } } if (!empty($val) && !empty($fieldDef['len']) && strlen($val) > $fieldDef['len']) { $val = $this->truncate($val, $fieldDef['len']); } if (!is_null($val) || !empty($fieldDef['required'])) { $columns[] = "{$fieldDef['name']}=" . $this->massageValue($val, $fieldDef); } elseif ($this->isNullable($fieldDef)) { $columns[] = "{$fieldDef['name']}=NULL"; } else { $columns[] = "{$fieldDef['name']}=" . $this->emptyValue($fieldDef['type']); } } if (sizeof($columns) == 0) { return ""; } // no columns set // build where clause $where = $this->getWhereClause($bean, $this->updateWhereArray($bean, $where)); if (isset($fields['deleted'])) { $where .= " AND deleted=0"; } return "UPDATE " . $bean->getTableName() . "\n\t\t\t\t\tSET " . implode(",", $columns) . "\n\t\t\t\t\t{$where}"; }
/** * Generates SQL for update statement. * * @param object $bean SugarBean instance * @param array $where Optional, where conditions in an array * @return string SQL Create Table statement */ public function updateSQL(SugarBean $bean, array $where = array()) { $primaryField = $bean->getPrimaryFieldDefinition(); $columns = array(); // get column names and values foreach ($bean->getFieldDefinitions() as $field => $fieldDef) { // Do not write out the id field on the update statement. // We are not allowed to change ids. if ($fieldDef['name'] == $primaryField['name']) { continue; } // If the field is an auto_increment field, then we shouldn't be setting it. This was added // specially for Bugs and Cases which have a number associated with them. if (isset($bean->field_name_map[$field]['auto_increment']) && $bean->field_name_map[$field]['auto_increment'] == true) { continue; } //custom fields handle their save seperatley if (isset($bean->field_name_map) && !empty($bean->field_name_map[$field]['custom_type'])) { continue; } if (isset($bean->{$fieldDef}['name']) && (!isset($fieldDef['source']) || $fieldDef['source'] == 'db')) { $val = $bean->getFieldValue($fieldDef['name']); // clean the incoming value.. $val = from_html($val); // need to do some thing about types of values if (strlen($val) <= 0) { $columns[] = "{$fieldDef['name']}=null"; } else { $columns[] = "{$fieldDef['name']}=" . $this->massageValue($val, $fieldDef); } } } if (sizeof($columns) == 0) { return ""; } // no columns set // build where clause $where = $this->updateWhereArray($bean, $where); $where = $this->getWhereClause($bean, $where); return "update " . $bean->getTableName() . "\n set " . implode(",", $columns) . "\n {$where} and deleted=0"; }
/** * Generate a set of Insert statements based on the bean given * * @deprecated * * @param object $bean the bean from which table we will generate insert stmts * @param string $select_query the query which will give us the set of objects we want to place into our insert statement * @param int $start the first row to query * @param int $count the number of rows to query * @param string $table the table to query from * @param string $db_type the client db type * @return string SQL insert statement */ public function generateInsertSQL(SugarBean $bean, $select_query, $start, $count = -1, $table, $db_type, $is_related_query = false) { $GLOBALS['log']->info('call to DBManager::generateInsertSQL() is deprecated'); global $sugar_config; $count_query = $bean->create_list_count_query($select_query); if (!empty($count_query)) { // We have a count query. Run it and get the results. $result = $this->query($count_query, true, "Error running count query for {$this->object_name} List: "); $assoc = $this->fetchByAssoc($result); if (!empty($assoc['c'])) { $rows_found = $assoc['c']; } } if ($count == -1) { $count = $sugar_config['list_max_entries_per_page']; } $next_offset = $start + $count; $result = $this->limitQuery($select_query, $start, $count); $row_count = $this->getRowCount($result); // get basic insert $sql = "INSERT INTO " . $table; $custom_sql = "INSERT INTO " . $table . "_cstm"; // get field definitions $fields = $bean->getFieldDefinitions(); $custom_fields = array(); if ($bean->hasCustomFields()) { foreach ($fields as $fieldDef) { if ($fieldDef['source'] == 'custom_fields') { $custom_fields[$fieldDef['name']] = $fieldDef['name']; } } if (!empty($custom_fields)) { $custom_fields['id_c'] = 'id_c'; $id_field = array('name' => 'id_c', custom_type => 'id'); $fields[] = $id_field; } } // get column names and values $row_array = array(); $columns = array(); $cstm_row_array = array(); $cstm_columns = array(); $built_columns = false; //configure client helper $dbHelper = $this->configureHelper($db_type); while (($row = $this->fetchByAssoc($result)) != null) { $values = array(); $cstm_values = array(); if (!$is_related_query) { foreach ($fields as $fieldDef) { if (isset($fieldDef['source']) && $fieldDef['source'] != 'db' && $fieldDef['source'] != 'custom_fields') { continue; } $val = $row[$fieldDef['name']]; //handle auto increment values here only need to do this on insert not create if ($fieldDef['name'] == 'deleted') { $values['deleted'] = $val; if (!$built_columns) { $columns[] = 'deleted'; } } else { $type = $fieldDef['type']; if (!empty($fieldDef['custom_type'])) { $type = $fieldDef['custom_type']; } // need to do some thing about types of values if ($db_type == 'mysql' && $val == '' && ($type == 'datetime' || $type == 'date' || $type == 'int' || $type == 'currency' || $type == 'decimal')) { if (!empty($custom_fields[$fieldDef['name']])) { $cstm_values[$fieldDef['name']] = 'null'; } else { $values[$fieldDef['name']] = 'null'; } } else { if (isset($type) && $type == 'int') { if (!empty($custom_fields[$fieldDef['name']])) { $cstm_values[$fieldDef['name']] = $GLOBALS['db']->quote(from_html($val)); } else { $values[$fieldDef['name']] = $GLOBALS['db']->quote(from_html($val)); } } else { if (!empty($custom_fields[$fieldDef['name']])) { $cstm_values[$fieldDef['name']] = "'" . $GLOBALS['db']->quote(from_html($val)) . "'"; } else { $values[$fieldDef['name']] = "'" . $GLOBALS['db']->quote(from_html($val)) . "'"; } } } if (!$built_columns) { if (!empty($custom_fields[$fieldDef['name']])) { $cstm_columns[] = $fieldDef['name']; } else { $columns[] = $fieldDef['name']; } } } } } else { foreach ($row as $key => $val) { if ($key != 'orc_row') { $values[$key] = "'{$val}'"; if (!$built_columns) { $columns[] = $key; } } } } $built_columns = true; if (!empty($values)) { $row_array[] = $values; } if (!empty($cstm_values) && !empty($cstm_values['id_c']) && strlen($cstm_values['id_c']) > 7) { $cstm_row_array[] = $cstm_values; } } //if (sizeof ($values) == 0) return ""; // no columns set // get the entire sql $sql .= "(" . implode(",", $columns) . ") "; $sql .= "VALUES"; for ($i = 0; $i < count($row_array); $i++) { $sql .= " (" . implode(",", $row_array[$i]) . ")"; if ($i < count($row_array) - 1) { $sql .= ", "; } } //custom // get the entire sql $custom_sql .= "(" . implode(",", $cstm_columns) . ") "; $custom_sql .= "VALUES"; for ($i = 0; $i < count($cstm_row_array); $i++) { $custom_sql .= " (" . implode(",", $cstm_row_array[$i]) . ")"; if ($i < count($cstm_row_array) - 1) { $custom_sql .= ", "; } } return array('data' => $sql, 'cstm_sql' => $custom_sql, 'result_count' => $row_count, 'total_count' => $rows_found, 'next_offset' => $next_offset); }
function set_relationships(SugarBean $record, SugarBean $bean, $params = array()) { $record_vardefs = $record->getFieldDefinitions(); require_once 'modules/Relationships/Relationship.php'; if (isset($params['rel'])) { foreach ($params['rel'] as $key => $field) { if ($field == '' || $params['rel_value'][$key] == '') { continue; } switch ($params['rel_value_type'][$key]) { case 'Field': $data = $bean->field_defs[$params['rel_value'][$key]]; if ($data['type'] == 'relate' && isset($data['id_name'])) { $params['rel_value'][$key] = $data['id_name']; } $rel_id = $bean->{$params}['rel_value'][$key]; break; default: $rel_id = $params['rel_value'][$key]; break; } $def = $record_vardefs[$field]; if ($def['type'] == 'link' && !empty($def['relationship'])) { $record->load_relationship($field); $record->{$field}->add($rel_id); } } } }
/** * Return field definitions of a bean. * Need for covering class by test. * @param SugarBean $bean * @return array */ protected function getBeanDefs($bean) { return $bean->getFieldDefinitions(); }
/** * Generates SQL for update statement. * * @param SugarBean $bean SugarBean instance * @param array $where Optional, where conditions in an array * @return string SQL Create Table statement */ public function updateSQL(SugarBean $bean, array $where = array(), $usePreparedStatements = false) { $dataFields = array(); $dataValues = array(); $primaryField = $bean->getPrimaryFieldDefinition(); $fields = $bean->getFieldDefinitions(); // get column names and values foreach ($fields as $field => $fieldDef) { if (isset($fieldDef['source']) && $fieldDef['source'] != 'db') { continue; } // Do not write out the id field on the update statement. // We are not allowed to change ids. if ($fieldDef['name'] == $primaryField['name']) { continue; } // If the field is an auto_increment field, then we shouldn't be setting it. This was added // specially for Bugs and Cases which have a number associated with them. if (!empty($bean->field_name_map[$field]['auto_increment'])) { continue; } //custom fields handle their save separately if (isset($bean->field_name_map) && !empty($bean->field_name_map[$field]['custom_type'])) { continue; } // no need to clear deleted since we only update not deleted records anyway if ($fieldDef['name'] == 'deleted' && empty($bean->deleted)) { continue; } if (!isset($bean->{$field})) { continue; } $dataValues[$field] = $bean->{$field}; $dataFields[$field] = $fieldDef; } if (empty($dataValues)) { return ""; // no columns set } // build where clause $where_data = $this->updateWhereArray($bean, $where, $usePreparedStatements); if (isset($fields['deleted'])) { $where_data['deleted'] = "0"; } foreach ($where_data as $field => $value) { $dataFields[$field] = $fields[$field]; } return $this->updateParams($bean->getTableName(), $dataFields, $dataValues, $where_data, null, false, $usePreparedStatements); }
/** * Returns arguments for RelateRecordApi for the given action * * @param SugarBean $bean Primary bean * @param array $args This API arguments * @param string $action Related record action. * * @return array * @throws SugarApiExceptionInvalidParameter */ protected function getRelatedRecordArguments(SugarBean $bean, array $args, $action) { $arguments = array(); foreach ($bean->getFieldDefinitions() as $field => $definition) { if (!isset($definition['type']) || $definition['type'] != 'link') { continue; } if (!isset($args[$field])) { continue; } if (!is_array($args[$field])) { throw new SugarApiExceptionInvalidParameter(sprintf('Link field must contain array of actions, %s given', gettype($field))); } if (!isset($args[$field][$action])) { continue; } $data = $args[$field][$action]; if (!is_array($data)) { throw new SugarApiExceptionInvalidParameter(sprintf('Link action data must be array, %s given', gettype($data))); } $arguments[$field] = $data; } return $arguments; }
/** * Get fields definition object for a $seed. * @param SugarBean $seed * @return DefinitionObject */ protected function getDefinition($seed) { return new DefinitionObject($seed->getFieldDefinitions()); }