Adodb Dokumentation  V5.14 8 Sept 2011
datadict/datadict-mssql.inc.php
00001 <?php
00002 
00013 /*
00014 In ADOdb, named quotes for MS SQL Server use ". From the MSSQL Docs:
00015 
00016         Note Delimiters are for identifiers only. Delimiters cannot be used for keywords, 
00017         whether or not they are marked as reserved in SQL Server.
00018         
00019         Quoted identifiers are delimited by double quotation marks ("):
00020         SELECT * FROM "Blanks in Table Name"
00021         
00022         Bracketed identifiers are delimited by brackets ([ ]):
00023         SELECT * FROM [Blanks In Table Name]
00024         
00025         Quoted identifiers are valid only when the QUOTED_IDENTIFIER option is set to ON. By default, 
00026         the Microsoft OLE DB Provider for SQL Server and SQL Server ODBC driver set QUOTED_IDENTIFIER ON 
00027         when they connect. 
00028         
00029         In Transact-SQL, the option can be set at various levels using SET QUOTED_IDENTIFIER, 
00030         the quoted identifier option of sp_dboption, or the user options option of sp_configure.
00031         
00032         When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.
00033         
00034         Syntax
00035         
00036                 SET QUOTED_IDENTIFIER { ON | OFF }
00037 
00038 
00039 */
00040 
00041 // security - hide paths
00042 if (!defined('ADODB_DIR')) die();
00043 
00044 class ADODB2_mssql extends ADODB_DataDict {
00045         var $databaseType = 'mssql';
00046         var $dropIndex = 'DROP INDEX %2$s.%1$s';
00047         var $renameTable = "EXEC sp_rename '%s','%s'";
00048         var $renameColumn = "EXEC sp_rename '%s.%s','%s'";
00049 
00050         var $typeX = 'TEXT';  ## Alternatively, set it to VARCHAR(4000)
00051         var $typeXL = 'TEXT';
00052         
00053         //var $alterCol = ' ALTER COLUMN ';
00054         
00055         function MetaType($t,$len=-1,$fieldobj=false)
00056         {
00057                 if (is_object($t)) {
00058                         $fieldobj = $t;
00059                         $t = $fieldobj->type;
00060                         $len = $fieldobj->max_length;
00061                 }
00062                 
00063                 $len = -1; // mysql max_length is not accurate
00064                 switch (strtoupper($t)) {
00065                 case 'R':
00066                 case 'INT': 
00067                 case 'INTEGER': return  'I';
00068                 case 'BIT':
00069                 case 'TINYINT': return  'I1';
00070                 case 'SMALLINT': return 'I2';
00071                 case 'BIGINT':  return  'I8';
00072                 case 'SMALLDATETIME': return 'T';
00073                 case 'REAL':
00074                 case 'FLOAT': return 'F';
00075                 default: return parent::MetaType($t,$len,$fieldobj);
00076                 }
00077         }
00078         
00079         function ActualType($meta)
00080         {
00081                 switch(strtoupper($meta)) {
00082 
00083                 case 'C': return 'VARCHAR';
00084                 case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT';
00085                 case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle
00086                 case 'C2': return 'NVARCHAR';
00087                 case 'X2': return 'NTEXT';
00088                 
00089                 case 'B': return 'IMAGE';
00090                         
00091                 case 'D': return 'DATETIME';
00092                 
00093                 case 'TS':
00094                 case 'T': return 'DATETIME';
00095                 case 'L': return 'BIT';
00096                 
00097                 case 'R':               
00098                 case 'I': return 'INT'; 
00099                 case 'I1': return 'TINYINT';
00100                 case 'I2': return 'SMALLINT';
00101                 case 'I4': return 'INT';
00102                 case 'I8': return 'BIGINT';
00103                 
00104                 case 'F': return 'REAL';
00105                 case 'N': return 'NUMERIC';
00106                 default:
00107                         return $meta;
00108                 }
00109         }
00110         
00111         
00112         function AddColumnSQL($tabname, $flds)
00113         {
00114                 $tabname = $this->TableName ($tabname);
00115                 $f = array();
00116                 list($lines,$pkey) = $this->_GenFields($flds);
00117                 $s = "ALTER TABLE $tabname $this->addCol";
00118                 foreach($lines as $v) {
00119                         $f[] = "\n $v";
00120                 }
00121                 $s .= implode(', ',$f);
00122                 $sql[] = $s;
00123                 return $sql;
00124         }
00125         
00126         /*
00127         function AlterColumnSQL($tabname, $flds)
00128         {
00129                 $tabname = $this->TableName ($tabname);
00130                 $sql = array();
00131                 list($lines,$pkey) = $this->_GenFields($flds);
00132                 foreach($lines as $v) {
00133                         $sql[] = "ALTER TABLE $tabname $this->alterCol $v";
00134                 }
00135 
00136                 return $sql;
00137         }
00138         */
00139         
00140         function DropColumnSQL($tabname, $flds)
00141         {
00142                 $tabname = $this->TableName ($tabname);
00143                 if (!is_array($flds))
00144                         $flds = explode(',',$flds);
00145                 $f = array();
00146                 $s = 'ALTER TABLE ' . $tabname;
00147                 foreach($flds as $v) {
00148                         $f[] = "\n$this->dropCol ".$this->NameQuote($v);
00149                 }
00150                 $s .= implode(', ',$f);
00151                 $sql[] = $s;
00152                 return $sql;
00153         }
00154         
00155         // return string must begin with space
00156         function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
00157         {       
00158                 $suffix = '';
00159                 if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
00160                 if ($fautoinc) $suffix .= ' IDENTITY(1,1)';
00161                 if ($fnotnull) $suffix .= ' NOT NULL';
00162                 else if ($suffix == '') $suffix .= ' NULL';
00163                 if ($fconstraint) $suffix .= ' '.$fconstraint;
00164                 return $suffix;
00165         }
00166         
00167         /*
00168 CREATE TABLE 
00169     [ database_name.[ owner ] . | owner. ] table_name 
00170     ( { < column_definition > 
00171         | column_name AS computed_column_expression 
00172         | < table_constraint > ::= [ CONSTRAINT constraint_name ] }
00173 
00174             | [ { PRIMARY KEY | UNIQUE } [ ,...n ] 
00175     ) 
00176 
00177 [ ON { filegroup | DEFAULT } ] 
00178 [ TEXTIMAGE_ON { filegroup | DEFAULT } ] 
00179 
00180 < column_definition > ::= { column_name data_type } 
00181     [ COLLATE < collation_name > ] 
00182     [ [ DEFAULT constant_expression ] 
00183         | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
00184     ] 
00185     [ ROWGUIDCOL] 
00186     [ < column_constraint > ] [ ...n ] 
00187 
00188 < column_constraint > ::= [ CONSTRAINT constraint_name ] 
00189     { [ NULL | NOT NULL ] 
00190         | [ { PRIMARY KEY | UNIQUE } 
00191             [ CLUSTERED | NONCLUSTERED ] 
00192             [ WITH FILLFACTOR = fillfactor ] 
00193             [ON {filegroup | DEFAULT} ] ] 
00194         ] 
00195         | [ [ FOREIGN KEY ] 
00196             REFERENCES ref_table [ ( ref_column ) ] 
00197             [ ON DELETE { CASCADE | NO ACTION } ] 
00198             [ ON UPDATE { CASCADE | NO ACTION } ] 
00199             [ NOT FOR REPLICATION ] 
00200         ] 
00201         | CHECK [ NOT FOR REPLICATION ] 
00202         ( logical_expression ) 
00203     } 
00204 
00205 < table_constraint > ::= [ CONSTRAINT constraint_name ] 
00206     { [ { PRIMARY KEY | UNIQUE } 
00207         [ CLUSTERED | NONCLUSTERED ] 
00208         { ( column [ ASC | DESC ] [ ,...n ] ) } 
00209         [ WITH FILLFACTOR = fillfactor ] 
00210         [ ON { filegroup | DEFAULT } ] 
00211     ] 
00212     | FOREIGN KEY 
00213         [ ( column [ ,...n ] ) ] 
00214         REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] 
00215         [ ON DELETE { CASCADE | NO ACTION } ] 
00216         [ ON UPDATE { CASCADE | NO ACTION } ] 
00217         [ NOT FOR REPLICATION ] 
00218     | CHECK [ NOT FOR REPLICATION ] 
00219         ( search_conditions ) 
00220     } 
00221 
00222 
00223         */
00224         
00225         /*
00226         CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name 
00227     ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) 
00228                 [ WITH < index_option > [ ,...n] ] 
00229                 [ ON filegroup ]
00230                 < index_option > :: = 
00231                     { PAD_INDEX | 
00232                         FILLFACTOR = fillfactor | 
00233                         IGNORE_DUP_KEY | 
00234                         DROP_EXISTING | 
00235                     STATISTICS_NORECOMPUTE | 
00236                     SORT_IN_TEMPDB  
00237                 }
00238 */
00239         function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
00240         {
00241                 $sql = array();
00242                 
00243                 if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
00244                         $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
00245                         if ( isset($idxoptions['DROP']) )
00246                                 return $sql;
00247                 }
00248                 
00249                 if ( empty ($flds) ) {
00250                         return $sql;
00251                 }
00252                 
00253                 $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
00254                 $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
00255                 
00256                 if ( is_array($flds) )
00257                         $flds = implode(', ',$flds);
00258                 $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
00259                 
00260                 if ( isset($idxoptions[$this->upperName]) )
00261                         $s .= $idxoptions[$this->upperName];
00262                 
00263 
00264                 $sql[] = $s;
00265                 
00266                 return $sql;
00267         }
00268         
00269         
00270         function _GetSize($ftype, $ty, $fsize, $fprec)
00271         {
00272                 switch ($ftype) {
00273                 case 'INT':
00274                 case 'SMALLINT':
00275                 case 'TINYINT':
00276                 case 'BIGINT':
00277                         return $ftype;
00278                 }
00279         if ($ty == 'T') return $ftype;
00280         return parent::_GetSize($ftype, $ty, $fsize, $fprec);    
00281 
00282         }
00283 }
00284 ?>