Results 1 to 10 of 25

Thread: Asynchronous mysql queries

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #5
    Assadministrator IzNoGoD's Avatar
    Join Date
    Aug 2012
    Posts
    1,718
    Thanks
    17
    Thanked 1,068 Times in 674 Posts
    Big update: Cleaned up the mysql files and made the stuff make more sense.

    Here goes:
    PHP Code:
    init()
    {
        
    //get your host, user, pass, db, port here
        
    level.JH_mysql mysql_reuse_connection();
        if(!
    isDefined(level.JH_mysql))
            
    level.JH_mysql initMySQL(hostuserpassdbport);
        
    initAsyncMySQL(hostuserpassdbport);
    }

    query(query)
    {
        if(!
    isDefined(level.JH_mysql))
            return 
    undefined;
        
    result mysql_query(level.JH_mysqlquery);
        
    resettimeout();
        if(
    result)
        {
            
    printf("Error in " query "\n");
            return 
    undefined;
        }
        
    result mysql_store_result(level.JH_mysql);
        
    rows getRows(result);
        return 
    rows;
    }

    queryNosave(query)
    {
        if(!
    isDefined(level.JH_mysql))
            return 
    undefined;
        
    result mysql_query(level.JH_mysqlquery);
        
    resettimeout();
        if(
    result)
        {
            
    printf("Error in " query "\n");
            return 
    undefined;
        }
        return [];
    }

    getRows(result)
    {
        if(!
    isDefined(result))
            return [];
        
    rowcount mysql_num_rows(result);
        
    fields = [];
        
    field mysql_fetch_field(result);
        while(
    isDefined(field))
        {
            
    fields[fields.size] = field;
            
    field mysql_fetch_field(result);
        }
        
    rows = [];
        for(
    0rowcounti++)
        {
            
    row mysql_fetch_row(result);
            
    rows[rows.size] = [];
            for(
    0fields.sizej++)
                
    rows[rows.size 1][fields[j]] = row[j];
        }
        
    mysql_free_result(result);
        return 
    rows;
    }

    asyncQuery(query, function, args)
    {
        
    id mysql_async_createQuery(query);
        
    task spawnstruct();
        
    task.query query;
        
    task.invoker self;
        
    task.function = function;
        
    task.args args;
        
    level.JH_mysqlAsync["" id] = task;
    }

    asyncQueryNosave(query, function, args)
    {
        
    id mysql_async_createQueryNosave(query);
        
    task spawnstruct();
        
    task.query query;
        
    task.invoker self;
        
    task.function = function;
        
    task.args args;
        
    level.JH_mysqlAsync["" id] = task;
    }

    initAsyncMySQL(hostuserpassdbport)
    {
        
    mysql_async_initializer(hostuserpassdbport4);
        
    level.JH_mysqlAsync = [];
        
    thread loopAsyncMySQL();
    }

    loopAsyncMySQL()
    {
        while(
    true)
        {
            list = 
    mysql_async_GetDoneList();
            for(
    0< list.sizei++)
            {
                
    result mysql_async_getResultAndFree(list[i]);
                if(!
    isdefined(result))
                    continue;
                if(
    result == 0)
                    
    result undefined;
                
    task "" + list[i];
                if(
    isDefined(level.JH_mysqlAsync[task]))
                {
                    if(
    isDefined(level.JH_mysqlAsync[task].function))
                    {
                        if(
    isDefined(level.JH_mysqlAsync[task].invoker))
                        {
                            
    rows getRows(result);
                            
    level.JH_mysqlAsync[task].invoker thread [[level.JH_mysqlAsync[task].function]](rowslevel.JH_mysqlAsync[task].args);
                        }
                        else if(
    isDefined(result))
                            
    mysql_free_result(result);
                    }
                    else if(
    isDefined(result))
                        
    mysql_free_result(result);
                }
                else if(
    isDefined(result))
                    
    mysql_free_result(result);
                
    level.JH_mysqlAsync[task] = undefined;
            }
            
    wait .05;
        }
    }

    initMySQL(hostuserpassdbport)
    {
        
    mysql mysql_init();
        
    ret mysql_real_connect(mysqlhostuserpassdbport);
        if(!
    ret)
        {
            
    printf("errno=" mysql_errno(mysql) + " error= " mysql_error(mysql) + "\n");
            
    mysql_close(mysql);
            return 
    undefined;
        }
        return 
    mysql;
    }
    stripString(string)
    {
        if(
    isDefined(level.JH_mysql))
            return 
    mysql_real_escape_string(level.JH_mysqlstring);
        return 
    "";

    How to use:
    Call init() at game start.

    Call query() and queryNosave() for stuff at gamestart or non-latency queries (not recommended though)

    Call asyncQuery() and asyncQueryNosave() for your runtime queries.

    Example:

    PHP Code:
    foo()
    {
        
    asyncQuery("SELECT NOW() AS `time`", ::showTime);
    }

    showTime(rowsargs)
    {
       if(
    isDefined(rows) && isDefined(rows[0]) && isDefined(rows[0]["time"]))
          
    iprintlnbold("It is " rows[0]["time"]);

    Additional args will be passed to the secondary function as well, as long as it is a single var or a single array. The helper function will be called on the original invoker, and auto-free-s and auto-quits if the invoker is gone (useful for disconnecting players etc)
    "Does not work" is an error report for a bug between keyboard and chair.

    All hail Artie Effem

  2. The Following 5 Users Say Thank You to IzNoGoD For This Useful Post:

    kung foo man (2nd March 2016),Ni3ls (2nd March 2016),suck000 (14th April 2016),voron00 (2nd March 2016),Whiskas (7th March 2016)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •