annotate includes/database.mysql-common.inc @ 1:c1f4ac30525a 6.0

Drupal 6.0
author Franck Deroche <webmaster@defr.org>
date Tue, 23 Dec 2008 14:28:28 +0100
parents
children
rev   line source
webmaster@1 1 <?php
webmaster@1 2 // $Id: database.mysql-common.inc,v 1.17.2.1 2008/02/07 10:17:26 goba Exp $
webmaster@1 3
webmaster@1 4 /**
webmaster@1 5 * @file
webmaster@1 6 * Functions shared between mysql and mysqli database engines.
webmaster@1 7 */
webmaster@1 8
webmaster@1 9 /**
webmaster@1 10 * Runs a basic query in the active database.
webmaster@1 11 *
webmaster@1 12 * User-supplied arguments to the query should be passed in as separate
webmaster@1 13 * parameters so that they can be properly escaped to avoid SQL injection
webmaster@1 14 * attacks.
webmaster@1 15 *
webmaster@1 16 * @param $query
webmaster@1 17 * A string containing an SQL query.
webmaster@1 18 * @param ...
webmaster@1 19 * A variable number of arguments which are substituted into the query
webmaster@1 20 * using printf() syntax. Instead of a variable number of query arguments,
webmaster@1 21 * you may also pass a single array containing the query arguments.
webmaster@1 22 *
webmaster@1 23 * Valid %-modifiers are: %s, %d, %f, %b (binary data, do not enclose
webmaster@1 24 * in '') and %%.
webmaster@1 25 *
webmaster@1 26 * NOTE: using this syntax will cast NULL and FALSE values to decimal 0,
webmaster@1 27 * and TRUE values to decimal 1.
webmaster@1 28 *
webmaster@1 29 * @return
webmaster@1 30 * A database query result resource, or FALSE if the query was not
webmaster@1 31 * executed correctly.
webmaster@1 32 */
webmaster@1 33 function db_query($query) {
webmaster@1 34 $args = func_get_args();
webmaster@1 35 array_shift($args);
webmaster@1 36 $query = db_prefix_tables($query);
webmaster@1 37 if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
webmaster@1 38 $args = $args[0];
webmaster@1 39 }
webmaster@1 40 _db_query_callback($args, TRUE);
webmaster@1 41 $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
webmaster@1 42 return _db_query($query);
webmaster@1 43 }
webmaster@1 44
webmaster@1 45 /**
webmaster@1 46 * @ingroup schemaapi
webmaster@1 47 * @{
webmaster@1 48 */
webmaster@1 49
webmaster@1 50 /**
webmaster@1 51 * Generate SQL to create a new table from a Drupal schema definition.
webmaster@1 52 *
webmaster@1 53 * @param $name
webmaster@1 54 * The name of the table to create.
webmaster@1 55 * @param $table
webmaster@1 56 * A Schema API table definition array.
webmaster@1 57 * @return
webmaster@1 58 * An array of SQL statements to create the table.
webmaster@1 59 */
webmaster@1 60 function db_create_table_sql($name, $table) {
webmaster@1 61
webmaster@1 62 if (empty($table['mysql_suffix'])) {
webmaster@1 63 $table['mysql_suffix'] = "/*!40100 DEFAULT CHARACTER SET UTF8 */";
webmaster@1 64 }
webmaster@1 65
webmaster@1 66 $sql = "CREATE TABLE {". $name ."} (\n";
webmaster@1 67
webmaster@1 68 // Add the SQL statement for each field.
webmaster@1 69 foreach ($table['fields'] as $field_name => $field) {
webmaster@1 70 $sql .= _db_create_field_sql($field_name, _db_process_field($field)) .", \n";
webmaster@1 71 }
webmaster@1 72
webmaster@1 73 // Process keys & indexes.
webmaster@1 74 $keys = _db_create_keys_sql($table);
webmaster@1 75 if (count($keys)) {
webmaster@1 76 $sql .= implode(", \n", $keys) .", \n";
webmaster@1 77 }
webmaster@1 78
webmaster@1 79 // Remove the last comma and space.
webmaster@1 80 $sql = substr($sql, 0, -3) ."\n) ";
webmaster@1 81
webmaster@1 82 $sql .= $table['mysql_suffix'];
webmaster@1 83
webmaster@1 84 return array($sql);
webmaster@1 85 }
webmaster@1 86
webmaster@1 87 function _db_create_keys_sql($spec) {
webmaster@1 88 $keys = array();
webmaster@1 89
webmaster@1 90 if (!empty($spec['primary key'])) {
webmaster@1 91 $keys[] = 'PRIMARY KEY ('. _db_create_key_sql($spec['primary key']) .')';
webmaster@1 92 }
webmaster@1 93 if (!empty($spec['unique keys'])) {
webmaster@1 94 foreach ($spec['unique keys'] as $key => $fields) {
webmaster@1 95 $keys[] = 'UNIQUE KEY '. $key .' ('. _db_create_key_sql($fields) .')';
webmaster@1 96 }
webmaster@1 97 }
webmaster@1 98 if (!empty($spec['indexes'])) {
webmaster@1 99 foreach ($spec['indexes'] as $index => $fields) {
webmaster@1 100 $keys[] = 'INDEX '. $index .' ('. _db_create_key_sql($fields) .')';
webmaster@1 101 }
webmaster@1 102 }
webmaster@1 103
webmaster@1 104 return $keys;
webmaster@1 105 }
webmaster@1 106
webmaster@1 107 function _db_create_key_sql($fields) {
webmaster@1 108 $ret = array();
webmaster@1 109 foreach ($fields as $field) {
webmaster@1 110 if (is_array($field)) {
webmaster@1 111 $ret[] = $field[0] .'('. $field[1] .')';
webmaster@1 112 }
webmaster@1 113 else {
webmaster@1 114 $ret[] = $field;
webmaster@1 115 }
webmaster@1 116 }
webmaster@1 117 return implode(', ', $ret);
webmaster@1 118 }
webmaster@1 119
webmaster@1 120 /**
webmaster@1 121 * Set database-engine specific properties for a field.
webmaster@1 122 *
webmaster@1 123 * @param $field
webmaster@1 124 * A field description array, as specified in the schema documentation.
webmaster@1 125 */
webmaster@1 126 function _db_process_field($field) {
webmaster@1 127
webmaster@1 128 if (!isset($field['size'])) {
webmaster@1 129 $field['size'] = 'normal';
webmaster@1 130 }
webmaster@1 131
webmaster@1 132 // Set the correct database-engine specific datatype.
webmaster@1 133 if (!isset($field['mysql_type'])) {
webmaster@1 134 $map = db_type_map();
webmaster@1 135 $field['mysql_type'] = $map[$field['type'] .':'. $field['size']];
webmaster@1 136 }
webmaster@1 137
webmaster@1 138 if ($field['type'] == 'serial') {
webmaster@1 139 $field['auto_increment'] = TRUE;
webmaster@1 140 }
webmaster@1 141
webmaster@1 142 return $field;
webmaster@1 143 }
webmaster@1 144
webmaster@1 145 /**
webmaster@1 146 * Create an SQL string for a field to be used in table creation or alteration.
webmaster@1 147 *
webmaster@1 148 * Before passing a field out of a schema definition into this function it has
webmaster@1 149 * to be processed by _db_process_field().
webmaster@1 150 *
webmaster@1 151 * @param $name
webmaster@1 152 * Name of the field.
webmaster@1 153 * @param $spec
webmaster@1 154 * The field specification, as per the schema data structure format.
webmaster@1 155 */
webmaster@1 156 function _db_create_field_sql($name, $spec) {
webmaster@1 157 $sql = "`". $name ."` ". $spec['mysql_type'];
webmaster@1 158
webmaster@1 159 if (isset($spec['length'])) {
webmaster@1 160 $sql .= '('. $spec['length'] .')';
webmaster@1 161 }
webmaster@1 162 elseif (isset($spec['precision']) && isset($spec['scale'])) {
webmaster@1 163 $sql .= '('. $spec['precision'] .', '. $spec['scale'] .')';
webmaster@1 164 }
webmaster@1 165
webmaster@1 166 if (!empty($spec['unsigned'])) {
webmaster@1 167 $sql .= ' unsigned';
webmaster@1 168 }
webmaster@1 169
webmaster@1 170 if (!empty($spec['not null'])) {
webmaster@1 171 $sql .= ' NOT NULL';
webmaster@1 172 }
webmaster@1 173
webmaster@1 174 if (!empty($spec['auto_increment'])) {
webmaster@1 175 $sql .= ' auto_increment';
webmaster@1 176 }
webmaster@1 177
webmaster@1 178 if (isset($spec['default'])) {
webmaster@1 179 if (is_string($spec['default'])) {
webmaster@1 180 $spec['default'] = "'". $spec['default'] ."'";
webmaster@1 181 }
webmaster@1 182 $sql .= ' DEFAULT '. $spec['default'];
webmaster@1 183 }
webmaster@1 184
webmaster@1 185 if (empty($spec['not null']) && !isset($spec['default'])) {
webmaster@1 186 $sql .= ' DEFAULT NULL';
webmaster@1 187 }
webmaster@1 188
webmaster@1 189 return $sql;
webmaster@1 190 }
webmaster@1 191
webmaster@1 192 /**
webmaster@1 193 * This maps a generic data type in combination with its data size
webmaster@1 194 * to the engine-specific data type.
webmaster@1 195 */
webmaster@1 196 function db_type_map() {
webmaster@1 197 // Put :normal last so it gets preserved by array_flip. This makes
webmaster@1 198 // it much easier for modules (such as schema.module) to map
webmaster@1 199 // database types back into schema types.
webmaster@1 200 $map = array(
webmaster@1 201 'varchar:normal' => 'VARCHAR',
webmaster@1 202 'char:normal' => 'CHAR',
webmaster@1 203
webmaster@1 204 'text:tiny' => 'TINYTEXT',
webmaster@1 205 'text:small' => 'TINYTEXT',
webmaster@1 206 'text:medium' => 'MEDIUMTEXT',
webmaster@1 207 'text:big' => 'LONGTEXT',
webmaster@1 208 'text:normal' => 'TEXT',
webmaster@1 209
webmaster@1 210 'serial:tiny' => 'TINYINT',
webmaster@1 211 'serial:small' => 'SMALLINT',
webmaster@1 212 'serial:medium' => 'MEDIUMINT',
webmaster@1 213 'serial:big' => 'BIGINT',
webmaster@1 214 'serial:normal' => 'INT',
webmaster@1 215
webmaster@1 216 'int:tiny' => 'TINYINT',
webmaster@1 217 'int:small' => 'SMALLINT',
webmaster@1 218 'int:medium' => 'MEDIUMINT',
webmaster@1 219 'int:big' => 'BIGINT',
webmaster@1 220 'int:normal' => 'INT',
webmaster@1 221
webmaster@1 222 'float:tiny' => 'FLOAT',
webmaster@1 223 'float:small' => 'FLOAT',
webmaster@1 224 'float:medium' => 'FLOAT',
webmaster@1 225 'float:big' => 'DOUBLE',
webmaster@1 226 'float:normal' => 'FLOAT',
webmaster@1 227
webmaster@1 228 'numeric:normal' => 'DECIMAL',
webmaster@1 229
webmaster@1 230 'blob:big' => 'LONGBLOB',
webmaster@1 231 'blob:normal' => 'BLOB',
webmaster@1 232
webmaster@1 233 'datetime:normal' => 'DATETIME',
webmaster@1 234 );
webmaster@1 235 return $map;
webmaster@1 236 }
webmaster@1 237
webmaster@1 238 /**
webmaster@1 239 * Rename a table.
webmaster@1 240 *
webmaster@1 241 * @param $ret
webmaster@1 242 * Array to which query results will be added.
webmaster@1 243 * @param $table
webmaster@1 244 * The table to be renamed.
webmaster@1 245 * @param $new_name
webmaster@1 246 * The new name for the table.
webmaster@1 247 */
webmaster@1 248 function db_rename_table(&$ret, $table, $new_name) {
webmaster@1 249 $ret[] = update_sql('ALTER TABLE {'. $table .'} RENAME TO {'. $new_name .'}');
webmaster@1 250 }
webmaster@1 251
webmaster@1 252 /**
webmaster@1 253 * Drop a table.
webmaster@1 254 *
webmaster@1 255 * @param $ret
webmaster@1 256 * Array to which query results will be added.
webmaster@1 257 * @param $table
webmaster@1 258 * The table to be dropped.
webmaster@1 259 */
webmaster@1 260 function db_drop_table(&$ret, $table) {
webmaster@1 261 $ret[] = update_sql('DROP TABLE {'. $table .'}');
webmaster@1 262 }
webmaster@1 263
webmaster@1 264 /**
webmaster@1 265 * Add a new field to a table.
webmaster@1 266 *
webmaster@1 267 * @param $ret
webmaster@1 268 * Array to which query results will be added.
webmaster@1 269 * @param $table
webmaster@1 270 * Name of the table to be altered.
webmaster@1 271 * @param $field
webmaster@1 272 * Name of the field to be added.
webmaster@1 273 * @param $spec
webmaster@1 274 * The field specification array, as taken from a schema definition.
webmaster@1 275 * The specification may also contain the key 'initial', the newly
webmaster@1 276 * created field will be set to the value of the key in all rows.
webmaster@1 277 * This is most useful for creating NOT NULL columns with no default
webmaster@1 278 * value in existing tables.
webmaster@1 279 * @param $keys_new
webmaster@1 280 * Optional keys and indexes specification to be created on the
webmaster@1 281 * table along with adding the field. The format is the same as a
webmaster@1 282 * table specification but without the 'fields' element. If you are
webmaster@1 283 * adding a type 'serial' field, you MUST specify at least one key
webmaster@1 284 * or index including it in this array. @see db_change_field for more
webmaster@1 285 * explanation why.
webmaster@1 286 */
webmaster@1 287 function db_add_field(&$ret, $table, $field, $spec, $keys_new = array()) {
webmaster@1 288 $fixnull = FALSE;
webmaster@1 289 if (!empty($spec['not null']) && !isset($spec['default'])) {
webmaster@1 290 $fixnull = TRUE;
webmaster@1 291 $spec['not null'] = FALSE;
webmaster@1 292 }
webmaster@1 293 $query = 'ALTER TABLE {'. $table .'} ADD ';
webmaster@1 294 $query .= _db_create_field_sql($field, _db_process_field($spec));
webmaster@1 295 if (count($keys_new)) {
webmaster@1 296 $query .= ', ADD '. implode(', ADD ', _db_create_keys_sql($keys_new));
webmaster@1 297 }
webmaster@1 298 $ret[] = update_sql($query);
webmaster@1 299 if (isset($spec['initial'])) {
webmaster@1 300 // All this because update_sql does not support %-placeholders.
webmaster@1 301 $sql = 'UPDATE {'. $table .'} SET '. $field .' = '. db_type_placeholder($spec['type']);
webmaster@1 302 $result = db_query($sql, $spec['initial']);
webmaster@1 303 $ret[] = array('success' => $result !== FALSE, 'query' => check_plain($sql .' ('. $spec['initial'] .')'));
webmaster@1 304 }
webmaster@1 305 if ($fixnull) {
webmaster@1 306 $spec['not null'] = TRUE;
webmaster@1 307 db_change_field($ret, $table, $field, $field, $spec);
webmaster@1 308 }
webmaster@1 309 }
webmaster@1 310
webmaster@1 311 /**
webmaster@1 312 * Drop a field.
webmaster@1 313 *
webmaster@1 314 * @param $ret
webmaster@1 315 * Array to which query results will be added.
webmaster@1 316 * @param $table
webmaster@1 317 * The table to be altered.
webmaster@1 318 * @param $field
webmaster@1 319 * The field to be dropped.
webmaster@1 320 */
webmaster@1 321 function db_drop_field(&$ret, $table, $field) {
webmaster@1 322 $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP '. $field);
webmaster@1 323 }
webmaster@1 324
webmaster@1 325 /**
webmaster@1 326 * Set the default value for a field.
webmaster@1 327 *
webmaster@1 328 * @param $ret
webmaster@1 329 * Array to which query results will be added.
webmaster@1 330 * @param $table
webmaster@1 331 * The table to be altered.
webmaster@1 332 * @param $field
webmaster@1 333 * The field to be altered.
webmaster@1 334 * @param $default
webmaster@1 335 * Default value to be set. NULL for 'default NULL'.
webmaster@1 336 */
webmaster@1 337 function db_field_set_default(&$ret, $table, $field, $default) {
webmaster@1 338 if ($default == NULL) {
webmaster@1 339 $default = 'NULL';
webmaster@1 340 }
webmaster@1 341 else {
webmaster@1 342 $default = is_string($default) ? "'$default'" : $default;
webmaster@1 343 }
webmaster@1 344
webmaster@1 345 $ret[] = update_sql('ALTER TABLE {'. $table .'} ALTER COLUMN '. $field .' SET DEFAULT '. $default);
webmaster@1 346 }
webmaster@1 347
webmaster@1 348 /**
webmaster@1 349 * Set a field to have no default value.
webmaster@1 350 *
webmaster@1 351 * @param $ret
webmaster@1 352 * Array to which query results will be added.
webmaster@1 353 * @param $table
webmaster@1 354 * The table to be altered.
webmaster@1 355 * @param $field
webmaster@1 356 * The field to be altered.
webmaster@1 357 */
webmaster@1 358 function db_field_set_no_default(&$ret, $table, $field) {
webmaster@1 359 $ret[] = update_sql('ALTER TABLE {'. $table .'} ALTER COLUMN '. $field .' DROP DEFAULT');
webmaster@1 360 }
webmaster@1 361
webmaster@1 362 /**
webmaster@1 363 * Add a primary key.
webmaster@1 364 *
webmaster@1 365 * @param $ret
webmaster@1 366 * Array to which query results will be added.
webmaster@1 367 * @param $table
webmaster@1 368 * The table to be altered.
webmaster@1 369 * @param $fields
webmaster@1 370 * Fields for the primary key.
webmaster@1 371 */
webmaster@1 372 function db_add_primary_key(&$ret, $table, $fields) {
webmaster@1 373 $ret[] = update_sql('ALTER TABLE {'. $table .'} ADD PRIMARY KEY ('.
webmaster@1 374 _db_create_key_sql($fields) .')');
webmaster@1 375 }
webmaster@1 376
webmaster@1 377 /**
webmaster@1 378 * Drop the primary key.
webmaster@1 379 *
webmaster@1 380 * @param $ret
webmaster@1 381 * Array to which query results will be added.
webmaster@1 382 * @param $table
webmaster@1 383 * The table to be altered.
webmaster@1 384 */
webmaster@1 385 function db_drop_primary_key(&$ret, $table) {
webmaster@1 386 $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP PRIMARY KEY');
webmaster@1 387 }
webmaster@1 388
webmaster@1 389 /**
webmaster@1 390 * Add a unique key.
webmaster@1 391 *
webmaster@1 392 * @param $ret
webmaster@1 393 * Array to which query results will be added.
webmaster@1 394 * @param $table
webmaster@1 395 * The table to be altered.
webmaster@1 396 * @param $name
webmaster@1 397 * The name of the key.
webmaster@1 398 * @param $fields
webmaster@1 399 * An array of field names.
webmaster@1 400 */
webmaster@1 401 function db_add_unique_key(&$ret, $table, $name, $fields) {
webmaster@1 402 $ret[] = update_sql('ALTER TABLE {'. $table .'} ADD UNIQUE KEY '.
webmaster@1 403 $name .' ('. _db_create_key_sql($fields) .')');
webmaster@1 404 }
webmaster@1 405
webmaster@1 406 /**
webmaster@1 407 * Drop a unique key.
webmaster@1 408 *
webmaster@1 409 * @param $ret
webmaster@1 410 * Array to which query results will be added.
webmaster@1 411 * @param $table
webmaster@1 412 * The table to be altered.
webmaster@1 413 * @param $name
webmaster@1 414 * The name of the key.
webmaster@1 415 */
webmaster@1 416 function db_drop_unique_key(&$ret, $table, $name) {
webmaster@1 417 $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP KEY '. $name);
webmaster@1 418 }
webmaster@1 419
webmaster@1 420 /**
webmaster@1 421 * Add an index.
webmaster@1 422 *
webmaster@1 423 * @param $ret
webmaster@1 424 * Array to which query results will be added.
webmaster@1 425 * @param $table
webmaster@1 426 * The table to be altered.
webmaster@1 427 * @param $name
webmaster@1 428 * The name of the index.
webmaster@1 429 * @param $fields
webmaster@1 430 * An array of field names.
webmaster@1 431 */
webmaster@1 432 function db_add_index(&$ret, $table, $name, $fields) {
webmaster@1 433 $query = 'ALTER TABLE {'. $table .'} ADD INDEX '. $name .' ('. _db_create_key_sql($fields) .')';
webmaster@1 434 $ret[] = update_sql($query);
webmaster@1 435 }
webmaster@1 436
webmaster@1 437 /**
webmaster@1 438 * Drop an index.
webmaster@1 439 *
webmaster@1 440 * @param $ret
webmaster@1 441 * Array to which query results will be added.
webmaster@1 442 * @param $table
webmaster@1 443 * The table to be altered.
webmaster@1 444 * @param $name
webmaster@1 445 * The name of the index.
webmaster@1 446 */
webmaster@1 447 function db_drop_index(&$ret, $table, $name) {
webmaster@1 448 $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP INDEX '. $name);
webmaster@1 449 }
webmaster@1 450
webmaster@1 451 /**
webmaster@1 452 * Change a field definition.
webmaster@1 453 *
webmaster@1 454 * IMPORTANT NOTE: To maintain database portability, you have to explicitly
webmaster@1 455 * recreate all indices and primary keys that are using the changed field.
webmaster@1 456 *
webmaster@1 457 * That means that you have to drop all affected keys and indexes with
webmaster@1 458 * db_drop_{primary_key,unique_key,index}() before calling db_change_field().
webmaster@1 459 * To recreate the keys and indices, pass the key definitions as the
webmaster@1 460 * optional $keys_new argument directly to db_change_field().
webmaster@1 461 *
webmaster@1 462 * For example, suppose you have:
webmaster@1 463 * @code
webmaster@1 464 * $schema['foo'] = array(
webmaster@1 465 * 'fields' => array(
webmaster@1 466 * 'bar' => array('type' => 'int', 'not null' => TRUE)
webmaster@1 467 * ),
webmaster@1 468 * 'primary key' => array('bar')
webmaster@1 469 * );
webmaster@1 470 * @endcode
webmaster@1 471 * and you want to change foo.bar to be type serial, leaving it as the
webmaster@1 472 * primary key. The correct sequence is:
webmaster@1 473 * @code
webmaster@1 474 * db_drop_primary_key($ret, 'foo');
webmaster@1 475 * db_change_field($ret, 'foo', 'bar', 'bar',
webmaster@1 476 * array('type' => 'serial', 'not null' => TRUE),
webmaster@1 477 * array('primary key' => array('bar')));
webmaster@1 478 * @endcode
webmaster@1 479 *
webmaster@1 480 * The reasons for this are due to the different database engines:
webmaster@1 481 *
webmaster@1 482 * On PostgreSQL, changing a field definition involves adding a new field
webmaster@1 483 * and dropping an old one which* causes any indices, primary keys and
webmaster@1 484 * sequences (from serial-type fields) that use the changed field to be dropped.
webmaster@1 485 *
webmaster@1 486 * On MySQL, all type 'serial' fields must be part of at least one key
webmaster@1 487 * or index as soon as they are created. You cannot use
webmaster@1 488 * db_add_{primary_key,unique_key,index}() for this purpose because
webmaster@1 489 * the ALTER TABLE command will fail to add the column without a key
webmaster@1 490 * or index specification. The solution is to use the optional
webmaster@1 491 * $keys_new argument to create the key or index at the same time as
webmaster@1 492 * field.
webmaster@1 493 *
webmaster@1 494 * You could use db_add_{primary_key,unique_key,index}() in all cases
webmaster@1 495 * unless you are converting a field to be type serial. You can use
webmaster@1 496 * the $keys_new argument in all cases.
webmaster@1 497 *
webmaster@1 498 * @param $ret
webmaster@1 499 * Array to which query results will be added.
webmaster@1 500 * @param $table
webmaster@1 501 * Name of the table.
webmaster@1 502 * @param $field
webmaster@1 503 * Name of the field to change.
webmaster@1 504 * @param $field_new
webmaster@1 505 * New name for the field (set to the same as $field if you don't want to change the name).
webmaster@1 506 * @param $spec
webmaster@1 507 * The field specification for the new field.
webmaster@1 508 * @param $keys_new
webmaster@1 509 * Optional keys and indexes specification to be created on the
webmaster@1 510 * table along with changing the field. The format is the same as a
webmaster@1 511 * table specification but without the 'fields' element.
webmaster@1 512 */
webmaster@1 513
webmaster@1 514 function db_change_field(&$ret, $table, $field, $field_new, $spec, $keys_new = array()) {
webmaster@1 515 $sql = 'ALTER TABLE {'. $table .'} CHANGE '. $field .' '.
webmaster@1 516 _db_create_field_sql($field_new, _db_process_field($spec));
webmaster@1 517 if (count($keys_new)) {
webmaster@1 518 $sql .= ', ADD '. implode(', ADD ', _db_create_keys_sql($keys_new));
webmaster@1 519 }
webmaster@1 520 $ret[] = update_sql($sql);
webmaster@1 521 }
webmaster@1 522
webmaster@1 523 /**
webmaster@1 524 * Returns the last insert id.
webmaster@1 525 *
webmaster@1 526 * @param $table
webmaster@1 527 * The name of the table you inserted into.
webmaster@1 528 * @param $field
webmaster@1 529 * The name of the autoincrement field.
webmaster@1 530 */
webmaster@1 531 function db_last_insert_id($table, $field) {
webmaster@1 532 return db_result(db_query('SELECT LAST_INSERT_ID()'));
webmaster@1 533 }