Index: drupal-6.x-dev/includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.704
diff -u -p -r1.704 common.inc
--- drupal-6.x-dev/includes/common.inc	19 Oct 2007 10:30:54 -0000	1.704
+++ drupal-6.x-dev/includes/common.inc	19 Oct 2007 16:05:31 -0000
@@ -3092,7 +3092,7 @@ function drupal_schema_fields_sql($table
  *   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.
- * @param update
+ * @param primary_keys
  *   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.
@@ -3101,19 +3101,15 @@ function drupal_schema_fields_sql($table
  *   fields defined by the $table. For example, $object->nid will be populated
  *   after inserting a new node.
  */
-function drupal_write_record($table, &$object, $update = array()) {
-  // Standardize $update to an array.
-  if (is_string($update)) {
-    $update = array($update);
+function drupal_write_record($table, &$object, $primary_keys = array()) {
+  // Standardize $primary_keys to an array.
+  if (!is_array($primary_keys)) {
+    $primary_keys = array($primary_keys);
   }
 
   // Convert to an object if needed.
-  if (is_array($object)) {
+  if ($array = is_array($object)) {
     $object = (object) $object;
-    $array = TRUE;
-  }
-  else {
-    $array = FALSE;
   }
 
   $schema = drupal_get_schema($table);
@@ -3121,18 +3117,18 @@ function drupal_write_record($table, &$o
     return FALSE;
   }
 
-  $fields = $defs = $values = $serials = array();
-
+  $values = array();
+  $serials = 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)) {
+    if ($info['type'] == 'serial' && count($primary_keys)) {
       continue;
     }
 
     // For inserts, populate defaults from Schema if not already provided
-    if (!isset($object->$field)  && !count($update) && isset($info['default'])) {
+    if (!isset($object->$field) && !count($primary_keys) && isset($info['default'])) {
       $object->$field = $info['default'];
     }
 
@@ -3145,42 +3141,33 @@ function drupal_write_record($table, &$o
 
     // Build arrays for the fields, placeholders, and values in our query.
     if (isset($object->$field)) {
-      $fields[] = $field;
-      $placeholders[] = db_type_placeholder($info['type']);
+      $value['field'] = $field;
+      $value['placeholder'] = db_type_placeholder($info['type']);
 
       if (empty($info['serialize'])) {
-        $values[] = $object->$field;
+        $value['data'] = $object->$field;
       }
       else {
-        $values[] = serialize($object->$field);
+        $value['data'] = serialize($object->$field);
       }
+
+      $values[] = $value;
     }
   }
 
   // Build the SQL.
-  $query = '';
-  if (!count($update)) {
-    $query = "INSERT INTO {". $table ."} (". implode(', ', $fields) .') VALUES ('. implode(', ', $placeholders) .')';
+  if (!count($primary_keys)) {
+    db_query_insert("{". $table ."}", $values);
     $return = SAVED_NEW;
   }
   else {
-    $query = '';
-    foreach ($fields as $id => $field) {
-      if ($query) {
-        $query .= ', ';
-      }
-      $query .= $field .' = '. $placeholders[$id];
-    }
-
-    foreach ($update as $key){
+    foreach ($primary_keys as $key){
       $conditions[] = "$key = ". db_type_placeholder($schema['fields'][$key]['type']);
-      $values[] = $object->$key;
+      $args[] = $object->$key;
     }
-
-    $query = "UPDATE {". $table ."} SET $query WHERE ". implode(' AND ', $conditions);
+    db_query_update("{". $table ."}", $values, implode(' AND ', $conditions), $args);
     $return = SAVED_UPDATED;
   }
-  db_query($query, $values);
 
   if ($serials) {
     // Get last insert ids and fill them in.
@@ -3191,13 +3178,54 @@ function drupal_write_record($table, &$o
 
   // If we began with an array, convert back so we don't surprise the caller.
   if ($array) {
-    $object = (array)$object;
+    $object = (array) $object;
   }
 
   return $return;
 }
 
 /**
+ * Drop a record from the database based upon the schema.
+ *
+ * @param $table
+ *   The name of the table; this must exist in schema API.
+ * @param $object
+ *   The object to drop. 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.
+ * @param primary_keys
+ *   Specify the primary keys' field names. If there is only 1 key, you may
+ *   pass a simple string.
+ * @return (boolean) Failure to write a record will return FALSE. Otherwise,
+ *   TRUE is returned.
+ */
+function drupal_drop_record($table, $object, $primary_keys = array()) {
+  // Standardize $primary_keys to an array.
+  if (!is_array($primary_keys)) {
+    $primary_keys = array($primary_keys);
+  }
+
+  // Convert to an object if needed.
+  if ($array = is_array($object)) {
+    $object = (object) $object;
+  }
+
+  $schema = drupal_get_schema($table);
+  if (empty($schema)) {
+    return FALSE;
+  }
+
+  // Execute the request.
+  foreach ($primary_keys as $key){
+    $conditions[] = "$key = ". db_type_placeholder($schema['fields'][$key]['type']);
+    $args[] = $object->$key;
+  }
+  db_query_delete("{". $table ."}", implode(' AND ', $conditions), $args);
+
+  return SAVED_DELETED;
+}
+
+/**
  * @} End of "ingroup schemaapi".
  */
 
Index: drupal-6.x-dev/includes/database.mysql-common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.mysql-common.inc,v
retrieving revision 1.13
diff -u -p -r1.13 database.mysql-common.inc
--- drupal-6.x-dev/includes/database.mysql-common.inc	2 Oct 2007 16:15:56 -0000	1.13
+++ drupal-6.x-dev/includes/database.mysql-common.inc	19 Oct 2007 16:05:35 -0000
@@ -43,6 +43,130 @@ function db_query($query) {
 }
 
 /**
+ * Insert a row of record into database.
+ *
+ * @param $table
+ *   Table to insert.
+ * @param $values
+ *   An array containing the insert values. Each element of the array
+ *   should be an associatie array with the following keys:
+ *   - "field": The database field represented in the table column.
+ *   - "placeholder": The placeholder of the table column, using printf()
+ *     syntax. Valid %-modifiers are: %d, %f, %s and %b.
+ *   - "data": The data to insert into the table column.
+ * @return
+ *   A database query result resource, or FALSE if the query was not
+ *   executed correctly.
+ */
+function db_query_insert($table, $values) {
+  $fields = array();
+  $placeholders = array();
+  $data = array();
+  foreach ($values as $value) {
+    $fields[] = $value['field'];
+    $placeholders[] = $value['placeholder'];
+    $data[] = $value['data'];
+  }
+
+  if (count($fields)) {
+    $query = "INSERT INTO ". $table ." (". implode(', ', $fields) .") VALUES (". implode(', ', $placeholders) .")";
+    return db_query($query, $data);
+  }
+}
+
+/**
+ * Update a row of record in database.
+ *
+ * @param $table
+ *   Table to update.
+ * @param $values
+ *   An array containing the update values. Each element of the array
+ *   should be an associatie array with the following keys:
+ *   - "field": The database field represented in the table column.
+ *   - "placeholder": The placeholder of the table column, using printf()
+ *     syntax. Valid %-modifiers are: %d, %f, %s and %b.
+ *   - "data": The data to insert into the table column.
+ * @param $where_clause
+ *   A string containing an update condition query (where clause).
+ * @param ...
+ *   A variable number of arguments which are substituted into the query
+ *   WHERE condition, using printf() syntax. Instead of a variable number
+ *   of query arguments, you may also pass a single array containing the
+ *   query arguments.
+ *
+ *   Valid %-modifiers are: %d, %f and %s.
+ *
+ *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0,
+ *   and TRUE values to decimal 1.
+ *
+ * @return
+ *   A database query result resource, or FALSE if the query was not
+ *   executed correctly.
+ */
+function db_query_update($table, $values, $where_clause = NULL) {
+  $args = func_get_args();
+  $args = array_slice($args, 3);
+  if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
+    $args = $args[0];
+  }
+
+  $fields = array();
+  $data = array();
+  foreach ($values as $value) {
+    $fields[] = $value['field'] .'='. $value['placeholder'];
+    $data[] = $value['data'];
+  }
+
+  if (count($fields)) {
+    $query = "UPDATE ". $table ." SET ". implode(', ', $fields);
+    if ($where_clause) {
+      $query .= " WHERE ". $where_clause;
+      $data = array_merge($data, $args);
+    }
+    return db_query($query, $data);
+  }
+}
+
+/**
+ * Delete a row of record from database.
+ *
+ * @param $table
+ *   Table to delete.
+ * @param $where_clause
+ *   A string containing an update condition query (where clause).
+ * @param ...
+ *   A variable number of arguments which are substituted into the query
+ *   WHERE condition, using printf() syntax. Instead of a variable number
+ *   of query arguments, you may also pass a single array containing the
+ *   query arguments.
+ *
+ *   Valid %-modifiers are: %d, %f and %s.
+ *
+ *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0,
+ *   and TRUE values to decimal 1.
+ *
+ * @return
+ *   A database query result resource, or FALSE if the query was not
+ *   executed correctly.
+ */
+function db_query_delete($table, $where_clause = NULL) {
+  $args = func_get_args();
+  $args = array_slice($args, 2);
+  if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
+    $args = $args[0];
+  }
+
+  $data = array();
+
+  $query = "DELETE FROM ". $table;
+  if ($where_clause) {
+    $query .= " WHERE ". $where_clause;
+    $data = $args;
+  }
+  return db_query($query, $data);
+}
+
+/**
  * @ingroup schemaapi
  * @{
  */
Index: drupal-6.x-dev/includes/database.pgsql.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.pgsql.inc,v
retrieving revision 1.63
diff -u -p -r1.63 database.pgsql.inc
--- drupal-6.x-dev/includes/database.pgsql.inc	17 Oct 2007 12:47:28 -0000	1.63
+++ drupal-6.x-dev/includes/database.pgsql.inc	19 Oct 2007 16:05:42 -0000
@@ -348,6 +348,130 @@ function db_query_temporary($query) {
 }
 
 /**
+ * Insert a row of record into database.
+ *
+ * @param $table
+ *   Table to insert.
+ * @param $values
+ *   An array containing the insert values. Each element of the array
+ *   should be an associatie array with the following keys:
+ *   - "field": The database field represented in the table column.
+ *   - "placeholder": The placeholder of the table column, using printf()
+ *     syntax. Valid %-modifiers are: %d, %f, %s and %b.
+ *   - "data": The data to insert into the table column.
+ * @return
+ *   A database query result resource, or FALSE if the query was not
+ *   executed correctly.
+ */
+function db_query_insert($table, $values) {
+  $fields = array();
+  $placeholders = array();
+  $data = array();
+  foreach ($values as $value) {
+    $fields[] = $value['field'];
+    $placeholders[] = $value['placeholder'];
+    $data[] = $value['data'];
+  }
+
+  if (count($fields)) {
+    $query = "INSERT INTO ". $table ." (". implode(', ', $fields) .") VALUES (". implode(', ', $placeholders) .")";
+    return db_query($query, $data);
+  }
+}
+
+/**
+ * Update a row of record in database.
+ *
+ * @param $table
+ *   Table to update.
+ * @param $values
+ *   An array containing the update values. Each element of the array
+ *   should be an associatie array with the following keys:
+ *   - "field": The database field represented in the table column.
+ *   - "placeholder": The placeholder of the table column, using printf()
+ *     syntax. Valid %-modifiers are: %d, %f, %s and %b.
+ *   - "data": The data to insert into the table column.
+ * @param $where_clause
+ *   A string containing an update condition query (where clause).
+ * @param ...
+ *   A variable number of arguments which are substituted into the query
+ *   WHERE condition, using printf() syntax. Instead of a variable number
+ *   of query arguments, you may also pass a single array containing the
+ *   query arguments.
+ *
+ *   Valid %-modifiers are: %d, %f and %s.
+ *
+ *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0,
+ *   and TRUE values to decimal 1.
+ *
+ * @return
+ *   A database query result resource, or FALSE if the query was not
+ *   executed correctly.
+ */
+function db_query_update($table, $values, $where_clause = NULL) {
+  $args = func_get_args();
+  $args = array_slice($args, 3);
+  if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
+    $args = $args[0];
+  }
+
+  $fields = array();
+  $data = array();
+  foreach ($values as $value) {
+    $fields[] = $value['field'] .'='. $value['placeholder'];
+    $data[] = $value['data'];
+  }
+
+  if (count($fields)) {
+    $query = "UPDATE ". $table ." SET ". implode(', ', $fields);
+    if ($where_clause) {
+      $query .= " WHERE ". $where_clause;
+      $data = array_merge($data, $args);
+    }
+    return db_query($query, $data);
+  }
+}
+
+/**
+ * Delete a row of record from database.
+ *
+ * @param $table
+ *   Table to delete.
+ * @param $where_clause
+ *   A string containing an update condition query (where clause).
+ * @param ...
+ *   A variable number of arguments which are substituted into the query
+ *   WHERE condition, using printf() syntax. Instead of a variable number
+ *   of query arguments, you may also pass a single array containing the
+ *   query arguments.
+ *
+ *   Valid %-modifiers are: %d, %f and %s.
+ *
+ *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0,
+ *   and TRUE values to decimal 1.
+ *
+ * @return
+ *   A database query result resource, or FALSE if the query was not
+ *   executed correctly.
+ */
+function db_query_delete($table, $where_clause = NULL) {
+  $args = func_get_args();
+  $args = array_slice($args, 2);
+  if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
+    $args = $args[0];
+  }
+
+  $data = array();
+
+  $query = "DELETE FROM ". $table;
+  if ($where_clause) {
+    $query .= " WHERE ". $where_clause;
+    $data = $args;
+  }
+  return db_query($query, $data);
+}
+
+/**
  * Returns a properly formatted Binary Large OBject value.
  * In case of PostgreSQL encodes data for insert into bytea field.
  *
Index: drupal-6.x-dev/modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.895
diff -u -p -r1.895 node.module
--- drupal-6.x-dev/modules/node/node.module	19 Oct 2007 10:19:02 -0000	1.895
+++ drupal-6.x-dev/modules/node/node.module	19 Oct 2007 16:05:57 -0000
@@ -845,8 +845,8 @@ function node_delete($nid) {
   $node = node_load($nid);
 
   if (node_access('delete', $node)) {
-    db_query('DELETE FROM {node} WHERE nid = %d', $node->nid);
-    db_query('DELETE FROM {node_revisions} WHERE nid = %d', $node->nid);
+    drupal_drop_record('{node}', $node, 'nid');
+    drupal_drop_record('{node_revisions}', $node, 'nid');
 
     // Call the node-specific callback (if any):
     node_invoke($node, 'delete');
