int main(int argc, char *argv[]) { attachsql_connect_t *con= NULL; attachsql_error_st *error= NULL; const char *query= "SELECT * FROM t1 WHERE name='fred'"; attachsql_return_t ret= ATTACHSQL_RETURN_NONE; attachsql_query_row_st *row; uint16_t columns, current_column; con= attachsql_connect_create("localhost", 3306, "test", "test", "testdb", NULL); error= attachsql_query(con, strlen(query), query, 0, NULL); while ((ret != ATTACHSQL_RETURN_EOF) && (error == NULL)) { ret= attachsql_connect_poll(con, &error); if (ret != ATTACHSQL_RETURN_ROW_READY) { continue; } row= attachsql_query_row_get(con, &error); columns= attachsql_query_column_count(con); for (current_column= 0; current_column < columns; current_column++) { printf("%.*s ", (int)row[current_column].length, row[current_column].data); } printf("\n"); attachsql_query_row_next(con); } if (error != NULL) { printf("Error occurred: %s", error->msg); } attachsql_query_close(con); attachsql_connect_destroy(con); }
int main(void) { attachsql_connect_t *con= NULL; attachsql_error_t *error= NULL; const char *query= "SELECT * FROM t1 WHERE name = ? AND age > ?"; attachsql_return_t ret= ATTACHSQL_RETURN_NONE; attachsql_query_row_st *row; uint16_t columns, current_column; attachsql_query_parameter_st param[2]; con= attachsql_connect_create("localhost", 3306, "test", "test", "testdb", NULL); const char *name= "fred"; uint32_t age= 30; param[0].type= ATTACHSQL_ESCAPE_TYPE_CHAR; param[0].data= (char*)name; param[0].length= strlen(name); param[1].type= ATTACHSQL_ESCAPE_TYPE_INT; param[1].data= &age; param[1].is_unsigned= true; attachsql_query(con, strlen(query), query, 2, param, &error); while ((ret != ATTACHSQL_RETURN_EOF) && (error == NULL)) { ret= attachsql_connect_poll(con, &error); if (ret != ATTACHSQL_RETURN_ROW_READY) { continue; } row= attachsql_query_row_get(con, &error); columns= attachsql_query_column_count(con); for (current_column= 0; current_column < columns; current_column++) { printf("%.*s ", (int)row[current_column].length, row[current_column].data); } printf("\n"); attachsql_query_row_next(con); } if (error != NULL) { printf("Error occurred: %s", attachsql_error_message(error)); attachsql_error_free(error); } attachsql_query_close(con); attachsql_connect_destroy(con); }
int attachsql_drv_query(db_conn_t *sb_conn, const char *query, db_result_set_t *rs) { (void) rs; attachsql_connect_t *con = sb_conn->ptr; unsigned int rc; attachsql_error_t *error= NULL; attachsql_return_t aret= ATTACHSQL_RETURN_NONE; /* Close any previous query */ attachsql_query_close(con); DEBUG("attachsql_query(%p, \"%s\", %u)", con, query, strlen(query)); attachsql_query(con, strlen(query), query, 0, NULL, &error); while((aret != ATTACHSQL_RETURN_EOF) && (aret != ATTACHSQL_RETURN_ROW_READY)) { aret= attachsql_connect_poll(con, &error); if (error) { rc= attachsql_error_code(error); if (rc == 1213 || rc == 1205 || rc == 1020) { attachsql_error_free(error); return SB_DB_ERROR_DEADLOCK; } log_text(LOG_ALERT, "libAttachSQL Query Failed: %u:%s", attachsql_error_code(error), attachsql_error_message(error)); attachsql_error_free(error); return SB_DB_ERROR_FAILED; } } //rs->connection->ptr= con; DEBUG("attachsql_query \"%s\" returned %d", query, aret); return SB_DB_ERROR_NONE; }
int _attachsql_QueryObject_Initialize(_attachsql_QueryObject *self, PyObject *args, PyObject *kwargs) { bool ret; char *query= NULL; int query_length; int param_count= 0; int i; int64_t *tmp_int; uint64_t *tmp_uint; double *tmp_double; attachsql_query_parameter_st *asql_params= NULL; PyObject *param_list= NULL; PyObject *param_dict= NULL; PyObject *type= NULL; PyObject *value= NULL; PyObject *is_unsigned= NULL; attachsql_error_t *error= NULL; if (!PyArg_ParseTuple(args, "s#|O!", &query, &query_length, &PyList_Type, ¶m_list)) { return -1; } if (!param_list) { ret= attachsql_query(self->pycon->conn, query_length, query, 0, NULL, &error); if (error) { _attachsql_Exception(error); return -1; } return 0; } /* For parameters the user should use: * .query("SELECT * FROM test WHERE a=? and b=?", [{'type': ESCAPE_TYPE_CHAR, 'data': 'hello'}, {'type': ESCAPE_TYPE_INT, 'data': 1}]) */ param_count= PyList_Size(param_list); asql_params= (attachsql_query_parameter_st*)malloc(sizeof(attachsql_query_parameter_st) * param_count); /* This is ugly, need to find a better way */ tmp_int= (int64_t*)malloc(sizeof(int64_t) * param_count); tmp_uint= (uint64_t*)malloc(sizeof(uint64_t) * param_count); tmp_double= (double*)malloc(sizeof(double) * param_count); for (i= 0; i < param_count; i++) { param_dict= PyList_GetItem(param_list, i); if (!PyDict_Check(param_dict)) { PyErr_SetString(PyExc_TypeError, "Dict not found in list"); free(asql_params); return -1; } type= PyDict_GetItemString(param_dict, "type"); value= PyDict_GetItemString(param_dict, "data"); is_unsigned= PyDict_GetItemString(param_dict, "is_unsigned"); if (!type || !value || !PyInt_Check(type)) { PyErr_SetString(PyExc_TypeError, "Bad type or value in dict"); free(asql_params); return -1; } asql_params[i].type= PyInt_AsLong(type); switch (asql_params[i].type) { case ATTACHSQL_ESCAPE_TYPE_NONE: asql_params[i].data= NULL; break; case ATTACHSQL_ESCAPE_TYPE_CHAR: case ATTACHSQL_ESCAPE_TYPE_CHAR_LIKE: asql_params[i].data= PyString_AsString(value); asql_params[i].length= PyString_Size(value); break; case ATTACHSQL_ESCAPE_TYPE_INT: if (is_unsigned && PyInt_AsLong(is_unsigned)) { if (PyInt_Check(value)) { tmp_uint[i]= PyInt_AsUnsignedLongMask(value); } else { tmp_uint[i]= PyLong_AsUnsignedLong(value); } asql_params[i].data= &tmp_uint[i]; asql_params[i].is_unsigned= true; } else { if (PyInt_Check(value)) { tmp_int[i]= PyInt_AsLong(value); } else { tmp_int[i]= PyLong_AsLong(value); } asql_params[i].data= &tmp_int[i]; asql_params[i].is_unsigned= false; } break; case ATTACHSQL_ESCAPE_TYPE_BIGINT: if (is_unsigned && PyInt_AsLong(is_unsigned)) { if (PyInt_Check(value)) { tmp_uint[i]= PyInt_AsUnsignedLongMask(value); } else { tmp_uint[i]= PyLong_AsUnsignedLongLong(value); } asql_params[i].data= &tmp_uint[i]; asql_params[i].is_unsigned= true; } else { if (PyInt_Check(value)) { tmp_int[i]= PyInt_AsLong(value); } else { tmp_int[i]= PyLong_AsLongLong(value); } asql_params[i].data= &tmp_int[i]; asql_params[i].is_unsigned= false; } break; case ATTACHSQL_ESCAPE_TYPE_FLOAT: case ATTACHSQL_ESCAPE_TYPE_DOUBLE: tmp_double[i]= PyFloat_AsDouble(value); asql_params[i].data= &tmp_double[i]; break; } } ret= attachsql_query(self->pycon->conn, query_length, query, param_count, asql_params, &error); free(asql_params); free(tmp_int); free(tmp_uint); free(tmp_double); if (error) { _attachsql_Exception(error); return -1; } return 0; }