static int
_check(struct pinfo *pinfo, int len, char *path)
{
    char query[PATH_SIZE + 3];
    struct master_db *db;
    int ret;

    db = _master_db_open(pinfo->common.lms->db_path);
    if (!db)
        return -1;

    if (_is_file(path))
        memcpy(query, path, len + 1);
    else {
        memcpy(query, path, len);
        memcpy(query + len, "/%", sizeof("/%"));
        len += sizeof("/%") - 1;
    }
    ret = lms_db_get_files(db->get_files, query, len);
    if (ret != 0)
        goto end;

    ret = lms_db_update_id_get(db->handle);
    if (ret < 0) {
        fprintf(stderr, "ERROR: could not get global update id.\n");
        goto end;
    }

    pinfo->common.update_id = ret + 1;

    if (lms_create_slave(pinfo, _slave_work) != 0) {
        ret = -2;
        goto end;
    }

    _init_sync_wait(pinfo, 1);

    ret = _db_files_loop(db, (struct cinfo *)pinfo, _check_row);

    _master_send_finish(&pinfo->master);
    _init_sync_wait(pinfo, 0);
    lms_finish_slave(pinfo, _master_dummy_send_finish);
  end:
    lms_db_reset_stmt(db->get_files);
    _master_db_close(db);

    return ret;
}
static int
_check_single_process(struct sinfo *sinfo, int len, char *path)
{
    struct single_process_db *db;
    char query[PATH_SIZE + 2];
    void **parser_match = NULL;
    lms_t *lms;
    int ret;

    lms = sinfo->common.lms;
    db = _single_process_db_open(lms->db_path);
    if (!db)
        return -1;

    if (_is_file(path))
        memcpy(query, path, len + 1);
    else {
        memcpy(query, path, len);
        memcpy(query + len, "/%", sizeof("/%"));
        len += sizeof("/%") - 1;
    }
    ret = lms_db_get_files(db->get_files, query, len);
    if (ret != 0)
        goto end;

    if (lms_parsers_setup(lms, db->handle) != 0) {
        fprintf(stderr, "ERROR: could not setup parsers.\n");
        ret = -2;
        goto end;
    }

    if (lms_parsers_start(lms, db->handle) != 0) {
        fprintf(stderr, "ERROR: could not start parsers.\n");
        ret = -3;
        goto end;
    }

    if (lms->n_parsers < 1) {
        fprintf(stderr, "ERROR: no parser could be started, exit.\n");
        ret = -4;
        goto end;
    }

    parser_match = malloc(lms->n_parsers * sizeof(*parser_match));
    if (!parser_match) {
        perror("malloc");
        ret = -5;
        goto end;
    }

    ret = lms_db_update_id_get(db->handle);
    if (ret < 0) {
        fprintf(stderr, "ERROR: could not get global update id.\n");
        goto end;
    }

    sinfo->common.update_id = ret + 1;
    sinfo->parser_match = parser_match;

    lms_db_begin_transaction(db->transaction_begin);

    ret = _db_files_loop(db, (struct cinfo *)sinfo, _check_row_single_process);

    /* Check only if there are remaining commits to do */
    if (sinfo->commit_counter) {
        sinfo->total_committed += sinfo->commit_counter;
        lms_db_update_id_set(db->handle, sinfo->common.update_id);
    }

    lms_db_end_transaction(db->transaction_commit);

end:
    free(parser_match);
    lms_parsers_finish(lms, db->handle);
    lms_db_reset_stmt(db->get_files);
    _single_process_db_close(db);

    return ret;
}
Ejemplo n.º 3
0
bool fs_t::is_file(const std::string& path) const { return _is_file(canocial(path).c_str()); }