function content_write_record in Content Construction Kit (CCK) 6.2
Same name and namespace in other branches
- 6.3 content.module \content_write_record()
- 6 content.module \content_write_record()
Save a record to the database based upon the schema.
Directly copied from core's drupal_write_record, which can't update a column to NULL. See http://drupal.org/node/227677 and http://drupal.org/node/226264 for more details about that problem.
TODO - get rid of this function and change references back to drupal_write_record() if the patch gets into core. Will need a method of protecting people on older versions, though.
Default values are filled in for missing items, and 'serial' (auto increment) types are filled in with IDs.
Parameters
$table: The name of the table; this must exist in schema API.
$object: The object to write. This is a reference, as defaults according to the schema may be filled in on the object, as well as ID on the serial type(s). Both array an object types may be passed.
$update: If this is an update, specify the primary keys' field names. It is the caller's responsibility to know if a record for this object already exists in the database. If there is only 1 key, you may pass a simple string.
Return value
Failure to write a record will return FALSE. Otherwise SAVED_NEW or SAVED_UPDATED is returned depending on the operation performed. The $object parameter contains values for any serial fields defined by the $table. For example, $object->nid will be populated after inserting a new node.
1 call to content_write_record()
- content_storage in ./
content.module - Handle storage ops for _content_field_invoke_default().
File
- ./
content.module, line 1129 - Allows administrators to associate custom fields to content types.
Code
function content_write_record($table, &$object, $update = array()) {
// Standardize $update to an array.
if (is_string($update)) {
$update = array(
$update,
);
}
// Convert to an object if needed.
if (is_array($object)) {
$object = (object) $object;
$array = TRUE;
}
else {
$array = FALSE;
}
$schema = drupal_get_schema($table);
if (empty($schema)) {
return FALSE;
}
$fields = $defs = $values = $serials = $placeholders = array();
// Go through our schema, build SQL, and when inserting, fill in defaults for
// fields that are not set.
foreach ($schema['fields'] as $field => $info) {
// Special case -- skip serial types if we are updating.
if ($info['type'] == 'serial' && count($update)) {
continue;
}
// For inserts, populate defaults from Schema if not already provided
if (!isset($object->{$field}) && !count($update) && isset($info['default'])) {
$object->{$field} = $info['default'];
}
// Track serial fields so we can helpfully populate them after the query.
if ($info['type'] == 'serial') {
$serials[] = $field;
// Ignore values for serials when inserting data. Unsupported.
unset($object->{$field});
}
// Build arrays for the fields, placeholders, and values in our query.
if (isset($object->{$field}) || array_key_exists($field, $object)) {
$fields[] = $field;
if (isset($object->{$field})) {
$placeholders[] = db_type_placeholder($info['type']);
if (empty($info['serialize'])) {
$values[] = $object->{$field};
}
else {
$values[] = serialize($object->{$field});
}
}
else {
$placeholders[] = 'NULL';
}
}
}
// Build the SQL.
$query = '';
if (!count($update)) {
$query = "INSERT INTO {" . $table . "} (" . implode(', ', $fields) . ') VALUES (' . implode(', ', $placeholders) . ')';
$return = SAVED_NEW;
}
else {
$query = '';
foreach ($fields as $id => $field) {
if ($query) {
$query .= ', ';
}
$query .= $field . ' = ' . $placeholders[$id];
}
foreach ($update as $key) {
$conditions[] = "{$key} = " . db_type_placeholder($schema['fields'][$key]['type']);
$values[] = $object->{$key};
}
$query = "UPDATE {" . $table . "} SET {$query} WHERE " . implode(' AND ', $conditions);
$return = SAVED_UPDATED;
}
// Execute the SQL.
if (db_query($query, $values)) {
if ($serials) {
// Get last insert ids and fill them in.
foreach ($serials as $field) {
$object->{$field} = db_last_insert_id($table, $field);
}
}
// If we began with an array, convert back so we don't surprise the caller.
if ($array) {
$object = (array) $object;
}
return $return;
}
return FALSE;
}