Exemplo n.º 1
0
HavokResponse *db_mysql_save_account( HavokRequest *req )
{
    MYSQL_BIND         *data;
    pthread_mutex_t    *mutex;
    HavokResponse      *resp;
    ProtectedData_t    *protect;
    volatile int        id;

    if( !req || !req->account_data ) {
        return;
    }

    mutex = CREATE(pthread_mutex_t);
    thread_mutex_init( mutex );

    protect = ProtectedDataCreate();
    protect->data = (void *)&id;
    ProtectedDataLock( protect );

    data = CREATEN(MYSQL_BIND, 7);

    bind_numeric( &data[0], req->account_data->id, MYSQL_TYPE_LONG );
    bind_string( &data[1], req->account_data->email, MYSQL_TYPE_VAR_STRING );
    bind_string( &data[2], req->account_data->passwd, MYSQL_TYPE_VAR_STRING );
    bind_numeric( &data[3], (req->account_data->ansi ? 1 : 0), 
                            MYSQL_TYPE_TINY );
    bind_numeric( &data[4], (req->account_data->confirmed ? 1 : 0), 
                            MYSQL_TYPE_TINY );
    bind_string( &data[5], (req->account_data->confcode ? 
                            req->account_data->confcode : ""), 
                           MYSQL_TYPE_VAR_STRING );
    bind_null_blob( &data[6], protect );

    db_queue_query( 5, QueryTable, data, 7, NULL, NULL, mutex );

    pthread_mutex_unlock( mutex );
    pthread_mutex_destroy( mutex );
    memfree( mutex );

    ProtectedDataLock( protect );
    ProtectedDataDestroy( protect );

    resp = protobufCreateResponse();
    if( !resp ) {
        return( NULL );
    }

    resp->request_type = REQ_TYPE__SAVE_ACCOUNT;
    resp->account_data = CREATE(ReqAccountType);
    req_account_type__init( resp->account_data );
    memcpy( resp->account_data, req->account_data, sizeof(ReqAccountType) );
    resp->account_data->id = id;
    resp->account_data->email    = memstrlink( req->account_data->email );
    resp->account_data->passwd   = memstrlink( req->account_data->passwd );
    resp->account_data->confcode = memstrlink( req->account_data->confcode );

    return( resp );
}
Exemplo n.º 2
0
HavokResponse *db_mysql_find_pc( HavokRequest *req )
{
    MYSQL_BIND         *data;
    pthread_mutex_t    *mutex;
    HavokResponse      *resp;

    if( !req || !req->pc_data || !req->pc_data->name ) {
        return( NULL );
    }

    mutex = CREATE(pthread_mutex_t);
    thread_mutex_init( mutex );

    data = CREATEN(MYSQL_BIND, 1);

    bind_string( &data[0], req->pc_data->name, MYSQL_TYPE_VAR_STRING );

    db_queue_query( 17, QueryTable, data, 1, result_find_pc, (void *)&resp, 
                    mutex );
    pthread_mutex_unlock( mutex );
    pthread_mutex_destroy( mutex );
    memfree( mutex );

    return( resp );
}
Exemplo n.º 3
0
int bind_params(sqlite3_stmt* stmt, const mxArray *params, int column)
{
    TYPECHECK(params, mxSTRUCT_CLASS);
    int i, n = mxGetNumberOfFields(params);
    for (i = 0; i < n; i++) {
        mxArray *array = mxGetFieldByNumber(params, column, i);
        mxClassID cls = mxGetClassID(array);
        int res;
        switch (cls) {
            case mxFUNCTION_CLASS:
                break;

            case mxCHAR_CLASS:
                res = bind_string(stmt, i + 1, array);
                break;

            case mxSINGLE_CLASS:
            case mxDOUBLE_CLASS:
                res = bind_double(stmt, i + 1, array);
                break;

            default:  /* anything else is an integer */
                res = bind_int64(stmt, i + 1, array);
        }
        if (res != SQLITE_OK) {
            return res;
        }
    }
    return SQLITE_OK;
}
Exemplo n.º 4
0
HavokResponse *db_mysql_set_setting( HavokRequest *req )
{
    MYSQL_BIND     *data;
    
    if( !req || !req->settings_data->setting_name || 
        !req->settings_data->setting_value ) {
        return( NULL );
    }
    
    data = CREATEN(MYSQL_BIND, 2);

    bind_string( &data[0], req->settings_data->setting_name, 
                 MYSQL_TYPE_VAR_STRING );
    bind_string( &data[1], req->settings_data->setting_value, 
                 MYSQL_TYPE_VAR_STRING );
    
    db_queue_query( 1, QueryTable, data, 2, NULL, NULL, NULL);

    return( NULL );
}
Exemplo n.º 5
0
static void bind_post(int *count, lily_parse_state *parser, request_rec *r)
{
    if (*count == -1)
        return;

    lily_var *post_var = bind_hash_str_str_var(parser->symtab, "post");
    lily_hash_val *hash_val = post_var->value.hash;

    apr_array_header_t *pairs;
    apr_off_t len;
    apr_size_t size;
    char *buffer;
    char *sipkey = parser->vm->sipkey;
    lily_class *string_cls = lily_class_by_id(parser->symtab, SYM_CLASS_STRING);
    lily_sig *string_sig = string_cls->sig;

    /* Credit: I found out how to use this by reading httpd 2.4's mod_lua
       (specifically req_parsebody of lua_request.c). */
    int res = ap_parse_form_data(r, NULL, &pairs, -1, 1024 * 8);
    if (res == OK) {
        while (pairs && !apr_is_empty_array(pairs)) {
            ap_form_pair_t *pair = (ap_form_pair_t *) apr_array_pop(pairs);
            apr_brigade_length(pair->value, 1, &len);
            size = (apr_size_t) len;
            buffer = lily_malloc(size + 1);
            if (buffer == NULL) {
                *count = -1;
                return;
            }

            apr_brigade_flatten(pair->value, buffer, &size);
            buffer[len] = 0;

            lily_value *elem_key = bind_string(string_sig, pair->name);
            /* Give the buffer to the value to save memory. */
            lily_value *elem_value = bind_string_and_buffer(string_sig, buffer);
            lily_hash_elem *new_elem = bind_hash_elem_with_values(sipkey,
                    elem_key, elem_value);

            if (elem_key == NULL || elem_value == NULL || new_elem == NULL) {
                lily_free(new_elem);
                deref_destroy_value(elem_key);
                deref_destroy_value(elem_value);
                *count = -1;
                return;
            }

            new_elem->next = hash_val->elem_chain;
            hash_val->elem_chain = new_elem;
        }
    }

    (*count)++;
}
Exemplo n.º 6
0
HavokResponse *db_mysql_save_pc( HavokRequest *req )
{
    MYSQL_BIND         *data;
    pthread_mutex_t    *mutex;
    HavokResponse      *resp;
    ProtectedData_t    *protect;
    volatile int        id;

    if( !req || !req->pc_data ) {
        return( NULL );
    }

    mutex = CREATE(pthread_mutex_t);
    thread_mutex_init( mutex );

    protect = ProtectedDataCreate();
    protect->data = (void *)&id;
    ProtectedDataLock( protect );

    data = CREATEN(MYSQL_BIND, 4);

    bind_numeric( &data[0], req->pc_data->id, MYSQL_TYPE_LONG );
    bind_numeric( &data[1], req->pc_data->account_id, MYSQL_TYPE_LONG );
    bind_string( &data[2], req->pc_data->name, MYSQL_TYPE_VAR_STRING );
    bind_null_blob( &data[3], protect );

    db_queue_query( 10, QueryTable, data, 4, NULL, NULL, mutex );

    pthread_mutex_unlock( mutex );
    pthread_mutex_destroy( mutex );
    memfree( mutex );

    ProtectedDataLock( protect );
    ProtectedDataDestroy( protect );

    db_mysql_save_pc_attribs( id, req->pc_data->attribs );

    resp = protobufCreateResponse();
    if( !resp ) {
        return( NULL );
    }

    resp->request_type = REQ_TYPE__SAVE_PC;
    resp->n_pc_data = 1;
    resp->pc_data = CREATE(ReqPCType *);
    resp->pc_data[0] = CREATE(ReqPCType);
    req_pctype__init( resp->pc_data[0] );
    memcpy( resp->pc_data[0], req->pc_data, sizeof(ReqPCType) );
    resp->pc_data[0]->id   = id;
    resp->pc_data[0]->name = memstrlink( req->pc_data->name );

    return( resp );
}
Exemplo n.º 7
0
static int bind_table_entry(void *data, const char *key, const char *value)
{
    struct table_bind_data *d = data;

    lily_value *elem_key = bind_string(d->string_sig, key);
    lily_value *elem_value = bind_string(d->string_sig, value);
    lily_hash_elem *new_elem = bind_hash_elem_with_values(d->sipkey,
            elem_key, elem_value);

    if (elem_key == NULL || elem_value == NULL || new_elem == NULL) {
        lily_free(new_elem);
        deref_destroy_value(elem_key);
        deref_destroy_value(elem_value);
        d->ok = 0;
        return FALSE;
    }

    new_elem->next = d->hash_val->elem_chain;
    d->hash_val->elem_chain = new_elem;
    return TRUE;
}
Exemplo n.º 8
0
void db_mysql_save_pc_attribs( int pc_id, char *json )
{
    MYSQL_BIND         *data;
    pthread_mutex_t    *mutex;
    JSONSource_t       *js;
    JSONSource_t       *jsItem;

    if( !pc_id || !json ) {
        return;
    }

    js = SplitJSON( json );
    if( !js ) {
        return;
    }

    mutex = CREATE(pthread_mutex_t);
    thread_mutex_init( mutex );

    for( jsItem = js; jsItem->source; jsItem++ ) {
        data = CREATEN(MYSQL_BIND, 3);

        bind_numeric( &data[0], pc_id, MYSQL_TYPE_LONG );
        bind_string( &data[1], jsItem->source, MYSQL_TYPE_VAR_STRING );
        bind_string( &data[2], jsItem->json, MYSQL_TYPE_VAR_STRING );

        db_queue_query( 14, QueryTable, data, 3, NULL, NULL, mutex );

        pthread_mutex_unlock( mutex );
    }

    pthread_mutex_destroy( mutex );
    memfree( mutex );

    DestroyJSONSource( js );
}
Exemplo n.º 9
0
/*
 * http://dev.mysql.com/doc/refman/5.1/en/mysql-stmt-execute.html
 *
 * 6 >  odbc:param_query(Ref,
 *                       "INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
 *                       "LASTNAME, GENDER) VALUES(?, ?, ?, ?)",
 *                       [{sql_integer,[2,3,4,5,6,7,8]},
 *                        {{sql_varchar, 20},
 *                         ["John", "Monica", "Ross", "Rachel",
 *                          "Piper", "Prue", "Louise"]},
 *                        {{sql_varchar, 20},
 *                         ["Doe","Geller","Geller", "Green",
 *                          "Halliwell", "Halliwell", "Lane"]},
 *                        {{sql_char, 1}, ["M","F","M","F","T","F","F"]}]).
 * {updated, 7}
 */
void
handle_param_query(ETERM *msg)
{
  ETERM *query, *params, *p, *tmp, *resp;
  MYSQL_STMT *handle;
  MYSQL_BIND *bind;
  char *q;
  int param_count, i;

  query = erl_element(2, msg);
  q = erl_iolist_to_string(query);
  erl_free_term(query);

  logmsg("INFO: got param query: %s", q);

  params = erl_element(3, msg);
  erl_free_term(params);

  handle = mysql_stmt_init(&dbh);
  if (mysql_stmt_prepare(handle, q, strlen(q))) {
    resp = erl_format("{error, {mysql_error, ~i, ~s}}",
                      mysql_stmt_errno(handle), mysql_stmt_error(handle));
  } else {
    param_count = mysql_stmt_param_count(handle);
    if (param_count != erl_length(params)) {
      resp = erl_format("{error, {mysql_error, -1, [expected_params, %d, got_params, %d]}}", param_count, erl_length(params));
    } else {
      bind = safe_malloc(param_count * sizeof(MYSQL_BIND));
      memset(bind, 0, param_count * sizeof(MYSQL_BIND));

      for (i = 0, tmp = params;
           i < param_count && (p = erl_hd(tmp)) != NULL;
           i++, tmp = erl_tl(tmp)) {
        ETERM *type, *value;

        type = erl_element(1, p);
        value = erl_element(2, p);

        if (ERL_IS_TUPLE(type)) {
          // Parameter Type + Size: {Type, Size}
          ETERM *t_type, *t_size;
          char *t;
          unsigned long size;

          t_size = erl_element(2, type);
          size = ERL_INT_VALUE(t_size);
          bind[i].buffer_length = size;
          erl_free_term(t_size);

          t_type = erl_element(1, type);
          t = (char *)ERL_ATOM_PTR(t_type);
          bind[i].length = safe_malloc(sizeof(unsigned long));
          if (strncmp(t, NUMERIC_SQL, strlen(NUMERIC_SQL)) == 0) {
            int val;

            bind[i].buffer_type = MYSQL_TYPE_LONG;
            *bind[i].length = sizeof(int);
            bind[i].buffer = safe_malloc(*bind[i].length);
            memset(bind[i].buffer, 0, *bind[i].length);

            val = ERL_INT_VALUE(value);
            memcpy(bind[i].buffer, &val, *bind[i].length);
          } else if (strncmp(t, DECIMAL_SQL, strlen(DECIMAL_SQL)) == 0) {
            char *val;

            bind[i].buffer_type = MYSQL_TYPE_STRING;
            *bind[i].length = bind[i].buffer_length * sizeof(char);
            bind[i].buffer = safe_malloc(*bind[i].length);
            memset(bind[i].buffer, 0, *bind[i].length);

            val = erl_iolist_to_string(value);
            if (val) {
              memcpy(bind[i].buffer, val, *bind[i].length);
              free(val);
            }
          } else if (strncmp(t, FLOAT_SQL, strlen(FLOAT_SQL)) == 0) {
            float val;

            bind[i].buffer_type = MYSQL_TYPE_FLOAT;
            *bind[i].length = sizeof(float);
            bind[i].buffer = safe_malloc(*bind[i].length);
            memset(bind[i].buffer, 0, *bind[i].length);

            val = ERL_FLOAT_VALUE(value);
            memcpy(bind[i].buffer, &val, *bind[i].length);
          } else if (strncmp(t, CHAR_SQL, strlen(CHAR_SQL)) == 0) {
            char *val;

            bind[i].buffer_type = MYSQL_TYPE_STRING;
            *bind[i].length = bind[i].buffer_length * sizeof(char);
            bind[i].buffer = safe_malloc(*bind[i].length);
            memset(bind[i].buffer, 0, *bind[i].length);

            val = erl_iolist_to_string(value);
            if (val) {
              memcpy(bind[i].buffer, val, *bind[i].length);
              free(val);
            }
          } else if (strncmp(t, VARCHAR_SQL, strlen(VARCHAR_SQL)) == 0) {
            (void)bind_string(&bind[i], value, size);
          } else {
            ETERM *resp;

            resp = erl_format("{error, {unknown_sized_type, ~s, ~i}}",
                              t, bind[i].buffer_length);
            write_msg(resp);
            erl_free_term(resp);
          }
          erl_free_term(t_type);
        } else {
          char *t;

          t = (char *)ERL_ATOM_PTR(type);
          if (strncmp(t, TIMESTAMP_SQL, strlen(TIMESTAMP_SQL)) == 0) {
            bind[i].buffer_type = MYSQL_TYPE_TIMESTAMP;
            *bind[i].length = sizeof(MYSQL_TIME);
            bind[i].buffer = safe_malloc(*bind[i].length);
            memset(bind[i].buffer, 0, *bind[i].length);

            memcpy(bind[i].buffer, value, *bind[i].length);
          } else if (strncmp(t, INTEGER_SQL, strlen(INTEGER_SQL)) == 0) {
            int val;

            bind[i].buffer_type = MYSQL_TYPE_LONG;
            *bind[i].length = sizeof(int);
            bind[i].buffer = safe_malloc(*bind[i].length);
            memset(bind[i].buffer, 0, *bind[i].length);

            val = ERL_INT_VALUE(value);
            memcpy(bind[i].buffer, &val, *bind[i].length);
          } else {
            ETERM *resp;

            resp = erl_format("{error, {unknown_type, ~s}}", t);
            write_msg(resp);
            erl_free_term(resp);
          }
        }

        if (ERL_IS_ATOM(value)
            && strncmp((char *)ERL_ATOM_PTR(value),
                       NULL_SQL, strlen(NULL_SQL)) == 0)
          bind[i].is_null = &TRUTHY;
        else
          bind[i].is_null = &FALSY;

        erl_free_term(value);
        erl_free_term(type);
      }
      erl_free_term(params);

      if (mysql_stmt_bind_param(handle, bind)) {
        resp = erl_format("{error, {mysql_error, ~i, ~s}}",
                          mysql_stmt_errno(handle), mysql_stmt_error(handle));
      } else {
        if (mysql_stmt_execute(handle)) {
          resp = erl_format("{error, {mysql_error, ~i, ~s}}",
                            mysql_stmt_errno(handle), mysql_stmt_error(handle));
        } else {
          set_mysql_results(handle);
          if (results) {
            resp = handle_mysql_result();
          } else {
            if (mysql_stmt_field_count(handle) == 0)
              resp = erl_format("{updated, ~i}", numrows);
            else
              resp = erl_format("{error, {mysql_error, ~i, ~s}}",
                                mysql_stmt_errno(handle), mysql_stmt_error(handle));
          }
        }
      }

      for (i = 0; i < param_count; i++) {
        free(bind[i].length);
        free(bind[i].buffer);
      }
      free(bind);
    }
  }
  erl_free(q);

  mysql_stmt_close(handle);

  write_msg(resp);
  erl_free_term(resp);
}