[Groonga-commit] groonga/gcs [master] Update validation logic of IndexField matching to Domain's one

Back to archive index

YUKI Hiroshi null+****@clear*****
Thu Nov 15 16:54:34 JST 2012


YUKI Hiroshi	2012-11-15 16:54:34 +0900 (Thu, 15 Nov 2012)

  New Revision: d81286529cf5f279ac5d7e074ed5ab6e5ecd5643
  https://github.com/groonga/gcs/commit/d81286529cf5f279ac5d7e074ed5ab6e5ecd5643

  Log:
    Update validation logic of IndexField matching to Domain's one

  Modified files:
    lib/database/domain.js
    lib/database/index-field.js

  Modified: lib/database/domain.js (+1 -0)
===================================================================
--- lib/database/domain.js    2012-11-15 16:39:31 +0900 (508839f)
+++ lib/database/domain.js    2012-11-15 16:54:34 +0900 (5aa34ce)
@@ -16,6 +16,7 @@ var MINIMUM_NAME_LENGTH =
 var MAXIMUM_NAME_LENGTH =
       exports.MAXIMUM_NAME_LENGTH =
       Domain.MAXIMUM_NAME_LENGTH = 28;
+
 var VALID_NAME_PATTERN =
       exports.VALID_NAME_PATTERN =
       Domain.VALID_NAME_PATTERN = '[a-z][a-z0-9\\-]+';

  Modified: lib/database/index-field.js (+58 -23)
===================================================================
--- lib/database/index-field.js    2012-11-15 16:39:31 +0900 (f5756c5)
+++ lib/database/index-field.js    2012-11-15 16:54:34 +0900 (4e7431c)
@@ -1,9 +1,22 @@
 var nroonga = require('../wrapped-nroonga');
 
-exports.MINIMUM_NAME_LENGTH = 3;
-exports.MAXIMUM_NAME_LENGTH = 64;
-exports.INVALID_NAME_CHARACTER_PATTERN = /[^_a-z0-9]/g;
-exports.INVALID_COLUMN_NAME_CHARACTER_PATTERN = /[^_a-z0-9]/g;
+var MINIMUM_NAME_LENGTH =
+      exports.MINIMUM_NAME_LENGTH =
+      IndexField.MINIMUM_NAME_LENGTH = 3;
+var MAXIMUM_NAME_LENGTH =
+      exports.MAXIMUM_NAME_LENGTH =
+      IndexField.MAXIMUM_NAME_LENGTH = 64;
+
+var VALID_NAME_PATTERN =
+      exports.VALID_NAME_PATTERN =
+      IndexField.VALID_NAME_PATTERN = '[a-z][a-z0-9\\-]+';
+var VALID_NAME_MATCHER =
+      exports.VALID_NAME_MATCHER =
+      IndexField.VALID_NAME_MATCHER = new RegExp('^' + VALID_NAME_PATTERN + '$');
+var INVALID_COLUMN_NAME_CHARACTERS_MATCHER =
+      exports.INVALID_COLUMN_NAME_CHARACTERS_MATCHER =
+      IndexField.INVALID_COLUMN_NAME_CHARACTERS_MATCHER = /[^_a-z0-9]/g;
+
 exports.RESERVED_NAMES = [
   'body',
   'docid',
@@ -14,30 +27,52 @@ exports.RESERVED_COLUMN_NAMES = [
 ];
 
 function assertValidFieldName(field) {
-  if (typeof field != 'string')
-    throw new Error('field name must be a string');
-
-  if (field.length < exports.MINIMUM_NAME_LENGTH)
-    throw new Error('too short field name (minimum length = ' +
-                    exports.MINIMUM_NAME_LENGTH + ')');
-
-  if (field.length > exports.MAXIMUM_NAME_LENGTH)
-    throw new Error('too long field name (max length = ' +
-                   exports.MAXIMUM_NAME_LENGTH + ')');
-
-  var invalidCharacter = field.match(exports.INVALID_NAME_CHARACTER_PATTERN) ||
-                         field.match(exports.INVALID_COLUMN_NAME_CHARACTER_PATTERN);
-  if (invalidCharacter) {
-    var characters = Array.prototype.map.call(invalidCharacter, function(aCharacter) {
-                       return '"' + aCharacter + '"';
-                     });
-    throw new Error(characters.join(', ') + ' cannot appear in a field name');
+  if (typeof field != 'string') {
+    var error = new Error('field name name must be a string');
+    error.isValidationError = true;
+    throw error;
+  }
+
+  var errors = [];
+  var commonPrefix = 'Value \'' + domain + '\' at \'indexFieldName\' failed ' +
+                     'to satisfy constraint: ';
+
+  if (!domain.match(VALID_NAME_MATCHER)) {
+    errors.push(commonPrefix + 'Member must satisfy regular ' +
+                'expression pattern: ' + VALID_NAME_PATTERN);
+  } else {
+    var invalidCharacters = domain.match(INVALID_COLUMN_NAME_CHARACTERS_MATCHER);
+    if (invalidCharacters) {
+      invalidCharacters = Array.prototype.slice.call(invalidCharacters, 0)
+                            .map(function(aCharacter) {
+                              return "'" + aCharacter + "'";
+                            });
+      errors.push(commonPrefix + 'Member cannot include these ' +
+                  'characters: ' + invalidCharacters.join(', '));
+    }
   }
 
+  if (domain.length < MINIMUM_NAME_LENGTH)
+    errors.push(commonPrefix + 'Member must have length greater ' +
+                'than or equal to ' + MINIMUM_NAME_LENGTH);
+
+  if (domain.length > MAXIMUM_NAME_LENGTH)
+    errors.push(commonPrefix + 'Member must have length less ' +
+                'than or equal to ' + MAXIMUM_NAME_LENGTH);
+
   var index = exports.RESERVED_NAMES.indexOf(field);
   if (index > -1) index = exports.RESERVED_COLUMN_NAMES.indexOf(field);
   if (index > -1)
-    throw new Error(field + ' is a reserved field name');
+    errors.push(field + ' is a reserved field name'));
+
+  if (errors.length) {
+    var prefix = errors.length > 1 ? 
+                   errors.length + ' validation errors detected: ' :
+                   '1 validation error detected: ';
+    var error = new Error(prefix + errors.join('; '));
+    error.isValidationError = true;
+    throw error;
+  }
 }
 
 function IndexField(name, domain) {
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index