日期:2014-05-16 浏览次数:20586 次
// 开始数据库连接 public abstract void requestStart(); // 结束数据库连接 public abstract void requestDone(); // 保持数据库连接 public abstract void requestEnsureConnection(); // 获取指定名称的数据集 protected abstract DBCollection doGetCollection( String name );
// 创建数据集 public final DBCollection createCollection( String name, DBObject options ){ // 如果 options 不为空 // 则先以 options 构造创建数据库的命令 // 然后执行创建数据库的命令并得到结果 if ( options != null ){ DBObject createCmd = new BasicDBObject("create", name); createCmd.putAll(options); CommandResult result = command(createCmd); result.throwOnError(); } return getCollection(name); } // 解析用 "." 分隔的字符串,获取指定的数据集 public DBCollection getCollectionFromString( String s ){ DBCollection foo = null; // 获取 "." 所在位置 int idx = s.indexOf( "." ); // 当分解后的字符串中仍然包含 "." 时 // 循环分解字符串,知道所有 "." 号解析完毕 // 效果类似于递归调用,但这里采用了循环的写法 while ( idx >= 0 ){ // 获取 "." 之前的字符串 b String b = s.substring( 0 , idx ); // 获取 "." 之后的字符串 s s = s.substring( idx + 1 ); // 检查上次解析得到的对象 foo 是否为空 if ( foo == null ) foo = getCollection( b ); else foo = foo.getCollection( b ); // 获取 "." 所在位置 idx = s.indexOf( "." ); } if ( foo != null ) return foo.getCollection( s ); return getCollection( s ); } // 获取所有数据集名称 public Set<String> getCollectionNames() throws MongoException { // 获取系统的 namespace 数据集 DBCollection namespaces = getCollection("system.namespaces"); if (namespaces == null) throw new RuntimeException("this is impossible"); // 获取用于遍历 namespace 的迭代器 Iterator<DBObject> i = namespaces.__find(new BasicDBObject(), null, 0, 0, 0, getOptions()); if (i == null) return new HashSet<String>(); // 表名称 List,最后转换为 set 并返回 List<String> tables = new ArrayList<String>(); for (; i.hasNext();) { DBObject o = i.next(); if ( o.get( "name" ) == null ){ throw new MongoException( "how is name null : " + o ); } // 获取 namespace 名称 String n = o.get("name").toString(); // 获取 namespace 名称前缀 int idx = n.indexOf("."); String root = n.substring(0, idx); // 如果前缀不为当前 DB 的名称 // 表示这个 namespace 不属于当前 DB if (!root.equals(_name)) continue; // 忽略特殊数据集 if (n.indexOf("$") >= 0) continue; // 获取数据集名称 String table = n.substring(idx + 1); tables.add(table); } Collections.sort(tables); // 转换为 Set return new LinkedHashSet<String>(tables); }
// 执行数据库命令 public CommandResult command( DBObject cmd , int options ) throws MongoException { // 调用 DBCollection 的 find 方法 Iterator<DBObject> i = getCollection("$cmd").__find(cmd, new BasicDBObject(), 0, -1, 0, options); if ( i == null || ! i.hasNext() ) return null; // 获得数据库命令的返回结果结果 CommandResult res = (CommandResult)i.next(); res._cmd = c