예제 #1
0
bool js_util_DirectoryUtils_walkDirs(JSContext *cx, uint32_t argc, jsval *vp)
{
    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);

    JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
    js_proxy_t *proxy = jsb_get_js_proxy(obj);
    auto cobj = (Utils::DirectoryUtils *)(proxy ? proxy->ptr : NULL);
    JSB_PRECONDITION2( cobj, cx, false, "js_util_DirectoryUtils_walkDirs : Invalid Native Object");

    if (argc == 3) {
        std::string arg0;
        bool arg1;
        Utils::DirectoryUtils::walkCallback arg2;

        bool ok = true;
        do {
            ok = jsval_to_std_string(cx, args.get(0), &arg0);
            if (!ok) break;

            ok = jsval_to_bool(cx, args.get(1), &arg1);
            if (!ok) break;

            ok = JS_TypeOfValue(cx, args.get(2)) == JSTYPE_FUNCTION;
            if (!ok) break;

            JSObject* thisObj = JS_THIS_OBJECT(cx, vp); // TODO 其它用法
            std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, thisObj, args.get(2)));
            arg2 = [=](const char* arg0, const char* arg1, const char* arg2) -> void {
                JS::RootedValue rval(cx);
                JS::AutoValueVector args(cx);
                args.reserve(3);
                args.append(STRING_TO_JSVAL(c_str_to_js_str(cx, arg0)));
                args.append(STRING_TO_JSVAL(c_str_to_js_str(cx, arg1)));
                args.append(STRING_TO_JSVAL(c_str_to_js_str(cx, arg2)));
                bool ok = func->invoke(args, &rval);
                if (!ok && JS_IsExceptionPending(cx)) {
                    JS_ReportPendingException(cx);
                }
            };

            cobj->walkDirs(arg0.c_str(), arg1, arg2);

        } while (0);

        JSB_PRECONDITION2(ok, cx, false, "js_util_DirectoryUtils_walkDirs : Error processing arguments");

        args.rval().setUndefined();
        return true;
    }

    JS_ReportError(cx, "js_util_DirectoryUtils_walkDirs : wrong number of arguments");
    return false;
}
예제 #2
0
파일: fbmerge.cpp 프로젝트: agonen/fastbit
int walkDirs(char *input_dir, char *output_dir) {
    char partname[256];
    struct stat stats;

    printf("Processing directory %s\n", input_dir);
#ifdef HAVE_DIRENT_H
    DIR *dir;
    struct dirent *dirent;

    if ((dir = opendir(input_dir)) != NULL) {
	while ((dirent = readdir(dir))) {
	    char dirname[256];

	    if (dirent->d_name[0] == '.') continue;
	    snprintf(dirname, sizeof(dirname), "%s/%s", input_dir,
		     dirent->d_name);

	    if (stat(dirname, &stats) == 0) {
		if (S_ISDIR(stats.st_mode)) {
		    walkDirs(dirname, output_dir);
		}
	    }
	}

	closedir(dir);
    }
#endif

    snprintf(partname, sizeof(partname), "%s/-part.txt", input_dir);
    if (stat(partname, &stats) == 0) {
	if (access(partname, 4) == 0) // have read access
	    mergeDir(input_dir, output_dir);
	else
	    printf("WARNING: skipping unreadable directory %s\n", partname);
    }

    return(0);
}
예제 #3
0
파일: fbmerge.cpp 프로젝트: agonen/fastbit
int main (int argc, char * argv []) {
    char c, *input_dir = NULL, *output_dir = NULL;

#if defined(_WIN32) && defined(_MSC_VER)
    // don't have getopt on windows
    input_dir  = argv[1];
    output_dir = argv[2];
#else
    while ((c = getopt (argc, argv, "hvi:o:d")) != -1) {
	switch(c) {
	case 'd':
	    dump_mode = true;
	    break;

	case 'h':
	    help();
	    break;

	case 'i':
	    input_dir = strdup(optarg);
	    break;

	case 'o':
	    output_dir = strdup(optarg);
	    break;
	}
    }
#endif
    if ((!input_dir) || (!output_dir))
	help();

    printf("Searching FastBit dirs on %s...\n", input_dir);
    walkDirs(input_dir, output_dir);
    printf("Merged %u records into directory %s...\n", tot_records, output_dir);
    printf("Leaving...\n");
    exit(0);
}