示例#1
0
void
update_callback(void *arg, int sqlite_operation_type, char const *sqlite_database, char const *sqlite_table, sqlite3_int64 sqlite_rowid)
{
    esqlite_connection *db = (esqlite_connection *)arg;
    esqlite_command *cmd = NULL;
    ERL_NIF_TERM type, table, rowid;
    cmd = command_create();

    if(db == NULL)
        return;

    if(!cmd)
	    return;

    rowid = enif_make_int64(cmd->env, sqlite_rowid);
    table = enif_make_string(cmd->env, sqlite_table, ERL_NIF_LATIN1);

    switch(sqlite_operation_type) {
        case SQLITE_INSERT:
            type = make_atom(cmd->env, "insert");
            break;
        case SQLITE_DELETE:
            type = make_atom(cmd->env, "delete");
            break;
        case SQLITE_UPDATE:
            type = make_atom(cmd->env, "update");
            break;
        default:
            return;
    }
    cmd->type = cmd_notification;
    cmd->arg = enif_make_tuple3(cmd->env, type, table, rowid);
    push_command(cmd->env, db, cmd);
}
示例#2
0
static int
purge_module(int module)
{
    Eterm* code;
    Eterm* end;
    Module* modp;
    int i;

    /*
     * Correct module?
     */

    if ((modp = erts_get_module(make_atom(module))) == NULL) {
	return -2;
    }

    /*
     * Any code to purge?
     */
    if (modp->old_code == 0) {
	if (display_loads) {
	    erts_printf("No code to purge for %T\n", make_atom(module));
	}
	return -1;
    }


    /*
     * Remove the old code.
     */
    ASSERT(erts_total_code_size >= modp->old_code_length);
    erts_total_code_size -= modp->old_code_length;
    code = modp->old_code;
    end = (Eterm *)((char *)code + modp->old_code_length);
    erts_cleanup_funs_on_purge(code, end);
    beam_catches_delmod(modp->old_catches, code, modp->old_code_length);
    erts_free(ERTS_ALC_T_CODE, (void *) code);
    modp->old_code = NULL;
    modp->old_code_length = 0;
    modp->old_catches = BEAM_CATCHES_NIL;

    /*
     * Remove the code from the address table too.
     */
    for (i = 0; i < num_loaded_modules; i++) {
	if (modules[i].start == code) {
	    num_loaded_modules--;
	    while (i < num_loaded_modules) {
		modules[i] = modules[i+1];
		i++;
	    }
	    mid_module = &modules[num_loaded_modules/2];
	    return 0;
	}
    }

    ASSERT(0);			/* Not found? */
    return 0;
}
示例#3
0
static ERL_NIF_TERM
do_get_autocommit(ErlNifEnv *env, esqlite_connection *conn)
{
    if(sqlite3_get_autocommit(conn->db) != 0) {
        return make_atom(env, "true");
    } else {
        return make_atom(env, "false");
    }
}
示例#4
0
static ERL_NIF_TERM
make_sqlite3_error_tuple(ErlNifEnv *env, int error_code, sqlite3 *db) 
{
    const char *error_code_msg = get_sqlite3_return_code_msg(error_code);
    const char *msg = get_sqlite3_error_msg(error_code, db);
    
    return enif_make_tuple2(env, make_atom(env, "error"), 
        enif_make_tuple2(env, make_atom(env, error_code_msg), 
            enif_make_string(env, msg, ERL_NIF_LATIN1)));
}
示例#5
0
static ERL_NIF_TERM
do_multi_step(ErlNifEnv *env, sqlite3 *db, sqlite3_stmt *stmt, const ERL_NIF_TERM arg)
{
    ERL_NIF_TERM status;
    ERL_NIF_TERM rows = enif_make_list_from_array(env, NULL, 0);
    ERL_NIF_TERM *rowBuffer = NULL;
    int rowBufferSize = 0;

    int chunk_size = 0;
    enif_get_int(env, arg, &chunk_size);

    int rc = sqlite3_step(stmt);
    while (rc == SQLITE_ROW && chunk_size-- > 0)
    {
        if (!rowBufferSize)
            rowBufferSize = sqlite3_column_count(stmt);
        if (rowBuffer == NULL)
            rowBuffer = (ERL_NIF_TERM *) enif_alloc(sizeof(ERL_NIF_TERM)*rowBufferSize);

        rows = enif_make_list_cell(env, make_row(env, stmt, rowBuffer, rowBufferSize), rows);

        if (chunk_size > 0)
            rc = sqlite3_step(stmt);
    }

    switch(rc) {
    case SQLITE_ROW:
        status = make_atom(env, "rows");
        break;
    case SQLITE_BUSY:
        status = make_atom(env, "$busy");
        break;
    case SQLITE_DONE:
        /*
        * Automatically reset the statement after a done so
        * column_names will work after the statement is done.
        *
        * Not resetting the statement can lead to vm crashes.
        */
        sqlite3_reset(stmt);
        status = make_atom(env, "$done");
        break;
    default:
        /* We use prepare_v2, so any error code can be returned. */
        return make_sqlite3_error_tuple(env, rc, db);
    }

    enif_free(rowBuffer);
    return enif_make_tuple2(env, status, rows);
}
示例#6
0
MCPasteboard *MCScreenDC::getselection(void)
{
	
	MCXPasteboard *t_pasteboard ;

	if ( !ownsclipboard()) 
		m_Selection_store -> GetExternalTypes(MCclipboardatom, make_atom("REV_SELECTION_TYPES"), NULLWindow);

	// Create the pasteboard we will use, wrapping the clipboard
	t_pasteboard = new MCXPasteboard ( XA_PRIMARY,make_atom("REV_SELECTION"), m_Selection_store );
	t_pasteboard -> SetWindows( XGetSelectionOwner(dpy, XA_PRIMARY), NULLWindow );
	
	return t_pasteboard ;
}
示例#7
0
MCPasteboard *MCScreenDC::getclipboard(void)
{
	
	MCXPasteboard *t_pasteboard ;

	if ( !ownsclipboard()) 
		m_Clipboard_store -> GetExternalTypes(MCclipboardatom, make_atom("REV_CLIPBOARD_TYPES"), NULLWindow);

	// Create the pasteboard we will use, wrapping the clipboard
	t_pasteboard = new MCXPasteboard ( MCclipboardatom,make_atom("REV_CLIPBOARD"), m_Clipboard_store );
	t_pasteboard -> SetWindows( XGetSelectionOwner(dpy, MCclipboardatom), NULLWindow );
	
	return t_pasteboard ;
}
示例#8
0
static int
purge_module(int module)
{
    BeamInstr* code;
    BeamInstr* end;
    Module* modp;

    /*
     * Correct module?
     */

    if ((modp = erts_get_module(make_atom(module))) == NULL) {
	return -2;
    }

    /*
     * Any code to purge?
     */
    if (modp->old_code == 0) {
	if (display_loads) {
	    erts_printf("No code to purge for %T\n", make_atom(module));
	}
	return -1;
    }

    /*
     * Unload any NIF library
     */
    if (modp->old_nif != NULL) {
	erts_unload_nif(modp->old_nif);
	modp->old_nif = NULL;
    }

    /*
     * Remove the old code.
     */
    ASSERT(erts_total_code_size >= modp->old_code_length);
    erts_total_code_size -= modp->old_code_length;
    code = modp->old_code;
    end = (BeamInstr *)((char *)code + modp->old_code_length);
    erts_cleanup_funs_on_purge(code, end);
    beam_catches_delmod(modp->old_catches, code, modp->old_code_length);
    erts_free(ERTS_ALC_T_CODE, (void *) code);
    modp->old_code = NULL;
    modp->old_code_length = 0;
    modp->old_catches = BEAM_CATCHES_NIL;
    remove_from_address_table(code);
    return 0;
}
示例#9
0
/*
 * NIF callbacks
 */
static int
load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
{
    htpasswd_st* st = enif_alloc(sizeof(htpasswd_st));
    if(st == NULL) {
        return 1;
    }

    st->atom_true = make_atom(env, "true");
    st->atom_false = make_atom(env, "false");

    *priv = (void*) st;

    return 0;
}
示例#10
0
文件: parse.c 项目: GJDuck/SMCHR
/*
 * Parse a term.
 */
static bool parse_term_op(context_t cxt, term_t *val, unsigned priority)
{
    term_t lval;
    if (!parse_term_head(cxt, &lval))
        return false;

    do
    {
        char *op_name = (char *)gc_malloc(TOKEN_MAXLEN+1);
        token_t tok = token_peek(cxt, NULL, op_name);
        
        unsigned op_priority;
        assoc_t op_assoc;

        if (!parse_maybe_op(tok) ||
            !binop_lookup(cxt->opinfo, op_name, &op_assoc, &op_priority, NULL,
                NULL) ||
            op_priority > priority)
        {
            *val = lval;
            gc_free(op_name);
            return true;
        }

        if (op_priority == priority)
        {
            switch (op_assoc)
            {
                case YFX:
                    *val = lval;
                    return true;
                case XFY:
                    break;
                case XFX:
                    parse_error(cxt, "operator `!y%s!d' associativity error",
                        op_name);
                    gc_free(op_name);
                    return false;
            }
        }

        if (!token_expect(cxt, tok))
        {
            gc_free(op_name);
            return false;
        }
        term_t rval;
        if (!parse_term_op(cxt, &rval, op_priority))
        {
            gc_free(op_name);
            return false;
        }

        atom_t atom = make_atom(gc_strdup(op_name), 2);
        gc_free(op_name);
        func_t f = make_func(atom, lval, rval);
        lval = term_func(f);
    }
    while (true);
}
示例#11
0
文件: iofunc.cpp 项目: chanpi/MyLisp
// ファイルディスクリプタの状態を返す
CELLP fmode_f(CELLP arg)
{
	int i;
	ATOMP ap;
	STR s;

	if (arg->id != _CELL) {
		return error(NEA);
	}
	if (arg->car->id != _FIX) {
		return error(IFD);
	}
	i = (int)((NUMP)(arg->car))->value.fix;
	if (i < 0 || i >= NFILES) {
		return error(IFD);
	}
	if (fp[i].ptr == NULL) {
		return (CELLP)nil;
	}
	s = (STR)modestr[fp[i].mode];
	if ((ap = old_atom(s)) == NULL) {
		return (CELLP)make_atom(s);
	}
	return (CELLP)ap;
}
示例#12
0
文件: iofunc.cpp 项目: chanpi/MyLisp
CELLP readch_f(CELLP arg)
{
	char ch[2] = {0};
	int i;
	FILE* nfp = cur_fpi;
	ATOMP ap;

	dirin(arg); ec;
	if (_isatty(_fileno(cur_fpi))) {
		i = _getch();
	} else {
		i = fgetc(cur_fpi);
	}

	if (i == EOF) {
		return (CELLP)eofread;
	}
	ch[0] = i;
	ch[1] = '\0';
	cur_fpi = nfp;
	if ((ap = old_atom((STR)ch)) == NULL) {
		return (CELLP)make_atom((STR)ch);
	}
	return (CELLP)ap;
}
示例#13
0
static ERL_NIF_TERM
do_column_names(ErlNifEnv *env, sqlite3_stmt *stmt)
{
    int i, size;
    const char *name;
    ERL_NIF_TERM *array;
    ERL_NIF_TERM column_names;
     
    size = sqlite3_column_count(stmt);
    if(size <= 0)
        return make_error_tuple(env, "no_columns");

    array = (ERL_NIF_TERM *) malloc(sizeof(ERL_NIF_TERM) * size);
    if(!array)
        return make_error_tuple(env, "no_memory");

    for(i = 0; i < size; i++) {
        name = sqlite3_column_name(stmt, i);
        if(name == NULL) {
            free(array);
            return make_error_tuple(env, "sqlite3_malloc_failure");
        }

        array[i] = make_atom(env, name);
    }

    column_names = enif_make_tuple_from_array(env, array, size);
    free(array);
    return column_names;
}
示例#14
0
static ERL_NIF_TERM
do_column_types(ErlNifEnv *env, sqlite3_stmt *stmt)
{
    int i, size;
    const char *type;
    ERL_NIF_TERM *array;
    ERL_NIF_TERM column_types;

    size = sqlite3_column_count(stmt);
    if(size == 0)
        return enif_make_tuple(env, 0);
    else if(size < 0)
        return make_error_tuple(env, "invalid_column_count");

    array = (ERL_NIF_TERM *) enif_alloc(sizeof(ERL_NIF_TERM) * size);
    if(!array)
        return make_error_tuple(env, "no_memory");

    for(i = 0; i < size; i++) {
        type = sqlite3_column_decltype(stmt, i);
        if(type == NULL) {
	    type = "nil";
        }

        array[i] = make_atom(env, type);
    }

    column_types = enif_make_tuple_from_array(env, array, size);
    enif_free(array);
    return column_types;
}
示例#15
0
BIF_RETTYPE loaded_0(BIF_ALIST_0)
{
    ErtsCodeIndex code_ix = erts_active_code_ix();
    Module* modp;
    Eterm previous = NIL;
    Eterm* hp;
    int i;
    int j = 0;

    for (i = 0; i < module_code_size(code_ix); i++) {
	if ((modp = module_code(i, code_ix)) != NULL &&
	    ((modp->curr.code_length != 0) ||
	     (modp->old.code_length != 0))) {
	    j++;
	}
    }
    if (j > 0) {
	hp = HAlloc(BIF_P, j*2);

	for (i = 0; i < module_code_size(code_ix); i++) {
	    if ((modp=module_code(i,code_ix)) != NULL &&
		((modp->curr.code_length != 0) ||
		 (modp->old.code_length != 0))) {
		previous = CONS(hp, make_atom(modp->module), previous);
		hp += 2;
	    }
	}
    }
    BIF_RET(previous);
}
示例#16
0
BIF_RETTYPE loaded_0(BIF_ALIST_0)
{
    Eterm previous = NIL;
    Eterm* hp;
    int i;
    int j = 0;
    
    for (i = 0; i < module_code_size(); i++) {
	if (module_code(i) != NULL &&
	    ((module_code(i)->code_length != 0) ||
	     (module_code(i)->old_code_length != 0))) {
	    j++;
	}
    }
    if (j > 0) {
	hp = HAlloc(BIF_P, j*2);

	for (i = 0; i < module_code_size(); i++) {
	    if (module_code(i) != NULL &&
		((module_code(i)->code_length != 0) ||
		 (module_code(i)->old_code_length != 0))) {
		previous = CONS(hp, make_atom(module_code(i)->module), 
				previous);
		hp += 2;
	    }
	}
    }
    BIF_RET(previous);
}
示例#17
0
static ERL_NIF_TERM
do_bind(ErlNifEnv *env, sqlite3 *db, sqlite3_stmt *stmt, const ERL_NIF_TERM arg)
{
    int parameter_count = sqlite3_bind_parameter_count(stmt);
    int i, is_list, r;
    ERL_NIF_TERM list, head, tail;
    unsigned int list_length;

    is_list = enif_get_list_length(env, arg, &list_length);
    if(!is_list) 
	    return make_error_tuple(env, "bad_arg_list");
    if(parameter_count != list_length) 
	    return make_error_tuple(env, "args_wrong_length");

    sqlite3_reset(stmt);
     
    list = arg;
    for(i=0; i < list_length; i++) {
	    enif_get_list_cell(env, list, &head, &tail);
	    r = bind_cell(env, head, stmt, i+1);
	    if(r == -1) 
	        return make_error_tuple(env, "wrong_type");
	    if(r != SQLITE_OK)
	        return make_sqlite3_error_tuple(env, r, db);
	    list = tail;
    }
     
    return make_atom(env, "ok");
}
示例#18
0
static ERL_NIF_TERM
push_command(ErlNifEnv *env, esqlite_connection *conn, esqlite_command *cmd) {
    if(!queue_push(conn->commands, cmd)) 
        return make_error_tuple(env, "command_push_failed");
  
    return make_atom(env, "ok");
}
示例#19
0
// Checks that there is a clipboard manager running
// and that it supports clipboard persistance
bool MCScreenDC::check_clipboard_manager(void)
{
 Atom clipboard_manager;

  clipboard_manager = make_atom ("CLIPBOARD_MANAGER");
  return XGetSelectionOwner (dpy, clipboard_manager) != None;	
}
示例#20
0
static ERL_NIF_TERM
do_open(ErlNifEnv *env, esqlite_connection *db, const ERL_NIF_TERM arg) 
{
    char filename[MAX_PATHNAME];
    unsigned int size;
    int rc;
    ERL_NIF_TERM error;

    size = enif_get_string(env, arg, filename, MAX_PATHNAME, ERL_NIF_LATIN1);
    if(size <= 0) 
        return make_error_tuple(env, "invalid_filename");

    /* Open the database. 
     */
    rc = sqlite3_open(filename, &db->db);
    if(rc != SQLITE_OK) {
	    error = make_sqlite3_error_tuple(env, rc, db->db);
	    sqlite3_close(db->db);
	    db->db = NULL;
     
	    return error;
    }
	  
    return make_atom(env, "ok");
}
示例#21
0
static void defsubr(STR name, CELLP funcp, char type)
{
	ATOMP ap;

	ap = make_atom(name);
	ap->ftype = type;
	ap->fptr = (CELLP)funcp;
}
示例#22
0
ERL_NIF_TERM
dec_error(Decoder* d, const char* atom)
{
    ERL_NIF_TERM pos = enif_make_int(d->env, d->i+1);
    ERL_NIF_TERM msg = make_atom(d->env, atom);
    ERL_NIF_TERM ret = enif_make_tuple2(d->env, pos, msg);
    return enif_make_tuple2(d->env, d->atoms->atom_error, ret);
}
示例#23
0
文件: gc.c 项目: cpylua/mark-sweep-gc
void test(void) {
    int i;

    for (i = 1; i <= 5; i++) {
        make_atom(i * 10);
    }

    f();
}
示例#24
0
文件: erl_nif.c 项目: a5an0/otp
ErlNifResourceType*
enif_open_resource_type(ErlNifEnv* env,
			const char* module_str, 
			const char* name_str, 
			ErlNifResourceDtor* dtor,
			ErlNifResourceFlags flags,
			ErlNifResourceFlags* tried)
{
    ErlNifResourceType* type = NULL;
    ErlNifResourceFlags op = flags;
    Eterm module_am, name_am;

    ASSERT(erts_smp_thr_progress_is_blocking());
    ASSERT(module_str == NULL); /* for now... */
    module_am = make_atom(env->mod_nif->mod->module);
    name_am = enif_make_atom(env, name_str);

    type = find_resource_type(module_am, name_am);
    if (type == NULL) {
	if (flags & ERL_NIF_RT_CREATE) {
	    type = erts_alloc(ERTS_ALC_T_NIF,
			      sizeof(struct enif_resource_type_t)); 
	    type->dtor = dtor;
	    type->module = module_am;
	    type->name = name_am;
	    erts_refc_init(&type->refc, 1);
	    type->owner = env->mod_nif;
	    type->prev = &resource_type_list;
	    type->next = resource_type_list.next;
	    type->next->prev = type;
	    type->prev->next = type;
	    op = ERL_NIF_RT_CREATE;
	}
    }
    else {
	if (flags & ERL_NIF_RT_TAKEOVER) {	
	    steal_resource_type(type);
	    op = ERL_NIF_RT_TAKEOVER;
	}
	else {
	    type = NULL;
	}
    }
    if (type != NULL) {
	type->owner = env->mod_nif;
	type->dtor = dtor;
	if (type->dtor != NULL) {
	    erts_refc_inc(&type->owner->rt_dtor_cnt, 1);
	}
	erts_refc_inc(&type->owner->rt_cnt, 1);    
    }
    if (tried != NULL) {
	*tried = op;
    }
    return type;
}
示例#25
0
static ERL_NIF_TERM
do_step(ErlNifEnv *env, sqlite3 *db, sqlite3_stmt *stmt)
{
    int rc = sqlite3_step(stmt);

    if(rc == SQLITE_ROW) 
        return make_row(env, stmt);
    if(rc == SQLITE_DONE) 
	    return make_atom(env, "$done");
    if(rc == SQLITE_BUSY)
	    return make_atom(env, "$busy");

    if(rc == SQLITE_ERROR)
        return make_sqlite3_error_tuple(env, rc, db);
    if(rc == SQLITE_MISUSE)
        return make_error_tuple(env, "misuse");

    return make_error_tuple(env, "unexpected_return_value");
}
示例#26
0
文件: CAN_nif.c 项目: qoocku/erleos
static int
_load_module(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
  ErlNifResourceFlags flags;
  CAN_handle_type = enif_open_resource_type(env, MODULE, "CAN_handle_type",
      NULL, ERL_NIF_RT_CREATE, &flags);
  can_atom = make_atom(env, "can");
  enif_fprintf(stdout, "*** " MODULE " loaded\n");
  return 0;
}
示例#27
0
static ERL_NIF_TERM
do_reset(ErlNifEnv *env, sqlite3 *db, sqlite3_stmt *stmt)
{
    int rc = sqlite3_reset(stmt);

    if(rc == SQLITE_OK)
        return make_atom(env, "ok");

    return make_sqlite3_error_tuple(env, rc, db);
}
示例#28
0
static ERL_NIF_TERM
update(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    md5ctx* ctx;
    ErlNifBinary bin;

    if(argc != 2)
        return enif_make_badarg(env);
    if(!enif_get_resource(env, argv[0], md5_type, (void**) &ctx))
        return enif_make_badarg(env);
    if(!enif_inspect_binary(env, argv[1], &bin))
        return enif_make_badarg(env);

    if(ctx->finalized)
        return make_atom(env, "already_finalized");

    if(!MD5_Update(&(ctx->md5), bin.data, bin.size))
        return make_atom(env, "update_error");

    return make_atom(env, "ok");
}
示例#29
0
static ERL_NIF_TERM
do_close(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
{
    int rc;
     
    rc = sqlite3_close(conn->db);
    if(rc != SQLITE_OK) 
	    return make_sqlite3_error_tuple(env, rc, conn->db);

    conn->db = NULL;
    return make_atom(env, "ok");
}
示例#30
0
static ERL_NIF_TERM
do_set_update_hook(ErlNifEnv *env, esqlite_connection *db, const ERL_NIF_TERM arg)
{
    if(!enif_get_local_pid(env, arg, &db->notification_pid))
	    return make_error_tuple(env, "invalid_pid");

    sqlite3_update_hook(db->db, NULL, NULL);
    if(sqlite3_update_hook(db->db, update_callback, db) != SQLITE_OK)
        return make_error_tuple(env, "sqlite3_update_hook_fail");

    return make_atom(env, "ok");
}