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