? sites/default/files
? sites/default/modules
? sites/default/settings.php
Index: includes/locale.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/locale.inc,v
retrieving revision 1.187
diff -u -p -r1.187 locale.inc
--- includes/locale.inc	27 Sep 2008 20:23:30 -0000	1.187
+++ includes/locale.inc	28 Sep 2008 12:43:14 -0000
@@ -844,10 +844,16 @@ function locale_translate_edit_form_subm
     if (!empty($value)) {
       // Only update or insert if we have a value to use.
       if (!empty($translation)) {
-        db_query("UPDATE {locales_target} SET translation = '%s' WHERE lid = %d AND language = '%s'", $value, $lid, $key);
+        db_update('locales_target')->fields(array(
+          'translation' => $value
+        ))->condition('lid', $lid)->condition('language', $key)->execute();
       }
       else {
-        db_query("INSERT INTO {locales_target} (lid, translation, language) VALUES (%d, '%s', '%s')", $lid, $value, $key);
+        db_insert('locales_target')->fields(array(
+          'lid' => $lid,
+          'translation' => $value,
+          'language' => $key
+        ))->execute();
       }
     }
     elseif (!empty($translation)) {
@@ -1308,7 +1314,10 @@ function _locale_import_one_string($op, 
  *   The string ID of the existing string modified or the new string added.
  */
 function _locale_import_one_string_db(&$report, $langcode, $source, $translation, $textgroup, $location, $mode, $plid = NULL, $plural = NULL) {
-  $lid = db_result(db_query("SELECT lid FROM {locales_source} WHERE source = '%s' AND textgroup = '%s'", $source, $textgroup));
+  $lid = db_query("SELECT lid FROM {locales_source} WHERE hash = :hash AND textgroup = :textgroup", array(
+    ':hash' => md5($source),
+    ':textgroup' => $textgroup
+  ))->fetchField();
 
   if (!empty($translation)) {
     if ($lid) {
@@ -1317,20 +1326,44 @@ function _locale_import_one_string_db(&$
       $exists = (bool) db_result(db_query("SELECT lid FROM {locales_target} WHERE lid = %d AND language = '%s'", $lid, $langcode));
       if (!$exists) {
         // No translation in this language.
-        db_query("INSERT INTO {locales_target} (lid, language, translation, plid, plural) VALUES (%d, '%s', '%s', %d, %d)", $lid, $langcode, $translation, $plid, $plural);
+        db_insert('locales_target')->fields(array(
+          'lid' => $lid,
+          'language' => $langcode,
+          'translation' => $translation,
+          'plid' => $plid,
+          'plural' => $plural
+        ))->execute();
         $report[0]++;
       }
       else if ($mode == LOCALE_IMPORT_OVERWRITE) {
         // Translation exists, only overwrite if instructed.
-        db_query("UPDATE {locales_target} SET translation = '%s', plid = %d, plural = %d WHERE language = '%s' AND lid = %d", $translation, $plid, $plural, $langcode, $lid);
+        db_update('locales_target')->fields(array(
+          'translation' => $translation,
+          'plid' => $plid,
+          'plural' => $plural          
+        ))->condition('lid', $lid)->condition('language', $langcode)->execute();
         $report[1]++;
       }
     }
     else {
       // No such source string in the database yet.
-      db_query("INSERT INTO {locales_source} (location, source, textgroup) VALUES ('%s', '%s', '%s')", $location, $source, $textgroup);
-      $lid = db_result(db_query("SELECT lid FROM {locales_source} WHERE source = '%s' AND textgroup = '%s'", $source, $textgroup));
-      db_query("INSERT INTO {locales_target} (lid, language, translation, plid, plural) VALUES (%d, '%s', '%s', %d, %d)", $lid, $langcode, $translation, $plid, $plural);
+      db_insert('locales_source')->fields(array(
+        'location' => $location,
+        'source' => $source,
+        'hash' => md5($source),
+        'textgroup' => $textgroup
+      ))->execute();
+      $lid = db_query("SELECT lid FROM {locales_source} WHERE hash = :hash AND textgroup = :textgroup", array(
+        ':hash' => md5($source),
+        ':textgroup' => $textgroup
+      ))->fetchField();
+      db_insert('locales_target')->fields(array(
+        'lid' => $lid,
+        'language' => $langcode,
+        'translation' => $translation,
+        'plid' => $plid,
+        'plural' => $plural
+      ))->execute();
       $report[0]++;
     }
   }
@@ -1672,8 +1705,11 @@ function _locale_parse_js_file($filepath
       // Remove the quotes and string concatenations from the string.
       $string = implode('', preg_split('~(?<!\\\\)[\'"]\s*\+\s*[\'"]~s', substr($string, 1, -1)));
 
-      $result = db_query("SELECT lid, location FROM {locales_source} WHERE source = '%s' AND textgroup = 'default'", $string);
-      if ($source = db_fetch_object($result)) {
+      $source = db_query("SELECT lid, location FROM {locales_source} WHERE hash = :hash AND textgroup = :textgroup", array(
+        ':hash' => md5($string),
+        ':textgroup' => 'default'
+      ))->fetch();
+      if ($source) {
         // We already have this source string and now have to add the location
         // to the location column, if this file is not yet present in there.
         $locations = preg_split('~\s*;\s*~', $source->location);
@@ -1688,7 +1724,12 @@ function _locale_parse_js_file($filepath
       }
       else {
         // We don't have the source string yet, thus we insert it into the database.
-        db_query("INSERT INTO {locales_source} (location, source, textgroup) VALUES ('%s', '%s', 'default')", $filepath, $string);
+        db_insert('locales_source')->fields(array(
+          'location' => $filepath,
+          'source' => $string,
+          'hash' => md5($string),
+          'textgroup' => 'default'
+        ))->execute();
       }
     }
   }
Index: modules/locale/locale.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.install,v
retrieving revision 1.30
diff -u -p -r1.30 locale.install
--- modules/locale/locale.install	14 Apr 2008 17:48:37 -0000	1.30
+++ modules/locale/locale.install	28 Sep 2008 12:43:14 -0000
@@ -5,10 +5,6 @@
  * Implementation of hook_install().
  */
 function locale_install() {
-  // locales_source.source and locales_target.target are not used as binary
-  // fields; non-MySQL database servers need to ensure the field type is text
-  // and that LIKE produces a case-sensitive comparison.
-
   // Create tables.
   drupal_install_schema('locale');
 
@@ -206,6 +202,46 @@ function locale_update_6005() {
  */
 
 /**
+ * @defgroup updates-6.x-to-7.x Locale updates from 6.x to 7.x
+ * @{
+ */
+
+/**
+ * Add hash column to locales_source table.
+ */
+function locale_update_7000() {
+  $ret = array();
+  db_add_field($ret, 'locales_source', 'hash', array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => ''));
+  db_add_index($ret, 'locales_source', 'hash', array('hash'));
+  $ret[] = update_sql('UPDATE {locales_source} SET hash = MD5(source)');
+  return $ret;
+}
+
+/**
+ * Update locales_source.source as BLOB.
+ */
+function locale_update_7001() {
+  $ret = array();
+  db_change_field($ret, 'locales_source', 'source', 'source', array('type' => 'blob', 'not null' => TRUE));
+  return $ret;
+}
+
+/**
+ * Update locales_target.translation as BLOB.
+ */
+function locale_update_7002() {
+  $ret = array();
+  db_change_field($ret, 'locales_target', 'translation', 'translation', array('type' => 'blob', 'not null' => TRUE));
+  return $ret;
+}
+
+/**
+ * @} End of "defgroup updates-6.x-to-7.x"
+ * The next series of updates should start at 8000.
+ */
+
+
+/**
  * Implementation of hook_uninstall().
  */
 function locale_uninstall() {
@@ -331,11 +367,17 @@ function locale_schema() {
         'description' => t('A module defined group of translations, see hook_locale().'),
       ),
       'source' => array(
-        'type' => 'text',
-        'mysql_type' => 'blob',
+        'type' => 'blob',
         'not null' => TRUE,
         'description' => t('The original string in English.'),
       ),
+      'hash' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => t('Calculated md5 hash of the original string, used for validation.'),
+      ),
       'version' => array(
         'type' => 'varchar',
         'length' => 20,
@@ -347,6 +389,7 @@ function locale_schema() {
     'primary key' => array('lid'),
     'indexes' => array(
       'source' => array(array('source', 30)),
+      'hash' => array('hash'),
     ),
   );
 
@@ -360,8 +403,7 @@ function locale_schema() {
         'description' => t('Source string ID. References {locales_source}.lid.'),
       ),
       'translation' => array(
-        'type' => 'text',
-        'mysql_type' => 'blob',
+        'type' => 'blob',
         'not null' => TRUE,
         'description' => t('Translation string value in this language.'),
       ),
Index: modules/locale/locale.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.module,v
retrieving revision 1.223
diff -u -p -r1.223 locale.module
--- modules/locale/locale.module	20 Sep 2008 20:22:24 -0000	1.223
+++ modules/locale/locale.module	28 Sep 2008 12:43:15 -0000
@@ -376,7 +376,11 @@ function locale($string = NULL, $langcod
   if (!isset($locale_t[$langcode][$string])) {
 
     // We do not have this translation cached, so get it from the DB.
-    $translation = db_fetch_object(db_query("SELECT s.lid, t.translation, s.version FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = '%s' WHERE s.source = '%s' AND s.textgroup = 'default'", $langcode, $string));
+    $translation = db_query("SELECT s.lid, t.translation, s.version FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.hash = :hash AND s.textgroup = :textgroup", array(
+      ':language' => $langcode,
+      ':hash' => md5($string),
+      ':textgroup' => 'default'
+    ))->fetch();
     if ($translation) {
       // We have the source string at least.
       // Cache translation string or TRUE if no translation exists.
@@ -392,7 +396,13 @@ function locale($string = NULL, $langcod
     }
     else {
       // We don't have the source string, cache this as untranslated.
-      db_query("INSERT INTO {locales_source} (location, source, textgroup, version) VALUES ('%s', '%s', 'default', '%s')", request_uri(), $string, VERSION);
+      db_insert('locales_source')->fields(array(
+        'location' => request_uri(),
+        'source' => $string,
+        'hash' => md5($string),
+        'textgroup' => 'default',
+        'version' => VERSION
+      ))->execute();
       $locale_t[$langcode][$string] = TRUE;
       // Clear locale cache so this string can be added in a later request.
       cache_clear_all('locale:', 'cache', TRUE);
