text: /*-
   * Copyright (c) 2014-2016 MongoDB, Inc.
   * Copyright (c) 2008-2014 WiredTiger, Inc.
   *	All rights reserved.
   *
   * See the file LICENSE for redistribution information.
   */
  
  #include "wt_internal.h"
  
  /*
   * __wt_schema_get_source --
   *	Find a matching data source or report an error.
   */
  WT_DATA_SOURCE *
  __wt_schema_get_source(WT_SESSION_IMPL *session, const char *name)
  {
  	WT_NAMED_DATA_SOURCE *ndsrc;
  
  	TAILQ_FOREACH(ndsrc, &S2C(session)->dsrcqh, q)
  		if (WT_PREFIX_MATCH(name, ndsrc->prefix))
  			return (ndsrc->dsrc);
  	return (NULL);
  }
  
  /*
   * __wt_str_name_check --
   *	Disallow any use of the WiredTiger name space.
   */
  int
  __wt_str_name_check(WT_SESSION_IMPL *session, const char *str)
  {
  	const char *name, *sep;
  	int skipped;
  
  	/*
  	 * Check if name is somewhere in the WiredTiger name space: it would be
  	 * "bad" if the application truncated the metadata file.  Skip any
  	 * leading URI prefix, check and then skip over a table name.
  	 */
  	name = str;
  	for (skipped = 0; skipped < 2; skipped++) {
  		if ((sep = strchr(name, ':')) == NULL)
  			break;
  
  		name = sep + 1;
  		if (WT_PREFIX_MATCH(name, "WiredTiger"))
  			WT_RET_MSG(session, EINVAL,
  			    "%s: the \"WiredTiger\" name space may not be "
  			    "used by applications", name);
  	}
  
  	/*
  	 * Disallow JSON quoting characters -- the config string parsing code
  	 * supports quoted strings, but there's no good reason to use them in
  	 * names and we're not going to do the testing.
  	 */
  	if (strpbrk(name, "{},:[]\\\"'") != NULL)
  		WT_RET_MSG(session, EINVAL,
  		    "%s: WiredTiger objects should not include grouping "
  		    "characters in their names",
  		    name);
  
  	return (0);
  }
  
  /*
   * __wt_name_check --
   *	Disallow any use of the WiredTiger name space.
   */
  int
  __wt_name_check(WT_SESSION_IMPL *session, const char *str, size_t len)
  {
  	WT_DECL_RET;
  	WT_DECL_ITEM(tmp);
  
  	WT_RET(__wt_scr_alloc(session, len, &tmp));
  
  	WT_ERR(__wt_buf_fmt(session, tmp, "%.*s", (int)len, str));
  
  	ret = __wt_str_name_check(session, tmp->data);
  
  err:	__wt_scr_free(session, &tmp);
  	return (ret);
  }
  