getFieldType($fieldDef); switch ($type) { case 'int': case 'double': case 'float': case 'uint': case 'ulong': case 'long': case 'short': case 'tinyint': return $val; break; } $qval = $this->quote($val); switch ($type) { case 'varchar': case 'nvarchar': case 'char': case 'nchar': case 'enum': case 'multienum': case 'id': return $qval; break; case 'date': return "$qval"; break; case 'datetime': return $qval; break; case 'time': return "$qval"; break; case 'text': case 'ntext': case 'blob': case 'longblob': case 'clob': case 'longtext': case 'image': return $qval; break; } return $val; } /** * Detect if no clustered index has been created for a table; if none created then just pick the first index and make it that * * @see MssqlHelper::indexSQL() */ public function indexSQL( $tableName, $fieldDefs, $indices ) { if ( $this->doesTableHaveAClusteredIndexDefined($tableName) ) { return parent::indexSQL($tableName, $fieldDefs, $indices); } // check to see if one of the passed in indices is a primary one; if so we can bail as well foreach ( $indices as $index ) { if ( $index['type'] == 'primary' ) { return parent::indexSQL($tableName, $fieldDefs, $indices); } } // Change the first index listed to be a clustered one instead ( so we have at least one for the table ) if ( isset($indices[0]) ) { $indices[0]['type'] = 'clustered'; } return parent::indexSQL($tableName, $fieldDefs, $indices); } /** * @see DBHelper::get_columns() */ public function get_columns( $tablename ) { //find all unique indexes and primary keys. $result = $this->db->query("sp_columns_90 $tablename"); $columns = array(); while (($row=$this->db->fetchByAssoc($result)) !=null) { $column_name = strtolower($row['COLUMN_NAME']); $columns[$column_name]['name']=$column_name; $columns[$column_name]['type']=strtolower($row['TYPE_NAME']); if ( $row['TYPE_NAME'] == 'decimal' ) { $columns[$column_name]['len']=strtolower($row['PRECISION']); $columns[$column_name]['len'].=','.strtolower($row['SCALE']); } elseif ( in_array($row['TYPE_NAME'],array('nchar','nvarchar')) ) { $columns[$column_name]['len']=strtolower($row['PRECISION']); if ( $row['TYPE_NAME'] == 'nvarchar' && $row['PRECISION'] == '0' ) { $columns[$column_name]['len']='255'; } } elseif ( !in_array($row['TYPE_NAME'],array('datetime','text')) ) { $columns[$column_name]['len']=strtolower($row['LENGTH']); } if ( stristr($row['TYPE_NAME'],'identity') ) { $columns[$column_name]['auto_increment'] = '1'; $columns[$column_name]['type']=str_replace(' identity','',strtolower($row['TYPE_NAME'])); } if (!empty($row['IS_NULLABLE']) && $row['IS_NULLABLE'] == 'NO' && (empty($row['KEY']) || !stristr($row['KEY'],'PRI'))) $columns[strtolower($row['COLUMN_NAME'])]['required'] = 'true'; $column_def = 0; if ( strtolower($tablename) == 'relationships' ) { $column_def = $this->db->getOne("select cdefault from syscolumns where id = object_id('relationships') and name = '$column_name'"); } if ( $column_def != 0 ) { $matches = array(); $row['COLUMN_DEF'] = html_entity_decode($row['COLUMN_DEF'],ENT_QUOTES); if ( preg_match("/\([\(|'](.*)[\)|']\)/i",$row['COLUMN_DEF'],$matches) ) $columns[$column_name]['default'] = $matches[1]; elseif ( preg_match("/\(N'(.*)'\)/i",$row['COLUMN_DEF'],$matches) ) $columns[$column_name]['default'] = $matches[1]; else $columns[$column_name]['default'] = $row['COLUMN_DEF']; } } return $columns; } /** * @see DBHelper::get_indices() */ public function get_indices( $tableName ) { //find all unique indexes and primary keys. $query = <<db->query($query); $indices = array(); while (($row=$this->db->fetchByAssoc($result)) != null) { $index_type = 'index'; if ($row['is_primary_key'] == '1') $index_type = 'primary'; elseif ($row['is_unique'] == 1 ) $index_type = 'unique'; $name = strtolower($row['index_name']); $indices[$name]['name'] = $name; $indices[$name]['type'] = $index_type; $indices[$name]['fields'][] = strtolower($row['column_name']); } return $indices; } /** * protected function to return true if the given tablename has any clustered indexes defined. * * @param string $tableName * @return bool */ protected function doesTableHaveAClusteredIndexDefined($tableName) { $query = <<db->getOne($query); if ( !$result ) { return false; } return true; } /** * protected function to return true if the given tablename has any fulltext indexes defined. * * @param string $tableName * @return bool */ protected function doesTableHaveAFulltextIndexDefined($tableName) { $query = <<db->getOne($query); if ( !$result ) { return false; } return true; } /** * Override method to add support for detecting and dropping fulltext indices. * * @see DBHelper::changeColumnSQL() * @see MssqlHelper::changeColumnSQL() */ protected function changeColumnSQL( $tablename, $fieldDefs, $action, $ignoreRequired = false ) { $sql = ''; if ( $this->doesTableHaveAFulltextIndexDefined($tablename) ) { $sql .= "DROP FULLTEXT INDEX ON {$tablename}"; } $sql .= parent::changeColumnSQL($tablename, $fieldDefs, $action, $ignoreRequired); return $sql; } /** * @see DBHelper::massageFieldDef() */ public function massageFieldDef( &$fieldDef, $tablename ) { parent::massageFieldDef($fieldDef,$tablename); if ($fieldDef['type'] == 'bit') $fieldDef['len'] = '1'; } protected function getDefault($fieldDef, $type) { if (isset($fieldDef['default']) && strlen($fieldDef['default']) > 0) { $default = " DEFAULT '".$fieldDef['default']."'"; } else { $default = ''; } return $default; } } ?>