|
Adodb Dokumentation
V5.14 8 Sept 2011
|
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 ?>