LagomarsinoDamageModel * LagomarsinoDamageModel::clone() const { LagomarsinoDamageModel * out = new LagomarsinoDamageModel(); std::vector <Parameter> params_all = parameters(); std::vector <double> params_values; for (unsigned int i = 0; i < ParameterCount(); i++) { params_values.push_back(params_all[i].value); } out->set_parameters(params_values); return out; }
void Statement::Execute() { if (! _db.IsConnected()) { throw DatabaseException("Error in Statement::Execute", 0, "----", "Database is not connected"); } _numberAffectedRows = 0; _eof = true; _currentColumn = 0; if (ParameterCount() != _params.size()) { throw DatabaseException("Error in Statement::Execute", 0, "----", "Have not yet assigned all parameters"); } if (mysql_stmt_bind_param(_stmt, _bind) != 0) { throw DatabaseException(_stmt, "Error in Statement::Execute while binding parameters"); } if (mysql_stmt_execute(_stmt) != 0) { throw DatabaseException(_stmt, "Error in Statement::Execute while executing statement"); } if (_numberResultColumns > 0) { if (mysql_stmt_store_result(_stmt) != 0) { throw DatabaseException(_stmt, "Error in Statement::Execute while storing results"); } _eof = false; } else { _numberAffectedRows = mysql_stmt_affected_rows(_stmt); } _resultWasStored = true; if (_hasBlobField && _resultBind != NULL) { MYSQL_RES *res = mysql_stmt_result_metadata(_stmt); if (res != NULL) { for (unsigned int i = 0; i < _resultParams.size(); i++) { MYSQL_FIELD *column = mysql_fetch_field_direct(res, i); if (_resultBind[i].buffer_type == MYSQL_TYPE_BLOB) { _resultParams[i]->ResizeBlob(column->max_length); _resultBind[i].buffer = _resultParams[i]->Buffer(); _resultBind[i].buffer_length = _resultParams[i]->BufferSize(); _resultBind[i].length = _resultParams[i]->BufferLength(); } } mysql_free_result(res); } } }
void Statement::AssignNextParameter(ParamBuffer *buffer) { if (buffer == NULL) { throw DatabaseException("Error in Statement::AssignNextParameter", 0, "----", "Buffer cannot be null"); } unsigned int pos = _params.size(); if (pos >= ParameterCount()) { delete buffer; throw DatabaseException("Error in Statement::AssignNextParameter", 0, "----", "Have already assigned all possible input parameters"); } _params.push_back(buffer); _bind[pos].buffer_type = buffer->BufferType(); _bind[pos].buffer = buffer->Buffer(); _bind[pos].buffer_length = buffer->BufferSize(); _bind[pos].is_null = buffer->IsNull(); _bind[pos].length = buffer->BufferLength(); _bind[pos].is_unsigned = buffer->IsUnsigned(); }
std::vector <Parameter> LagomarsinoDamageModel::parameters() const { std::vector <Parameter> out; out.resize(ParameterCount()); out[0].name = "n_0"; out[0].value = _n_0; out[0].units = ""; out[1].name = "kappa_0"; out[1].value = _kappa_0; out[1].units = ""; out[2].name = "p12_0"; out[2].value = _p12_0; out[2].units = ""; out[3].name = "A"; out[3].value = _A; out[3].units = "cm^3"; out[4].name = "B"; out[4].value = _B; out[4].units = "cm^3"; return out; }
void Statement::Prepare() { if (! _db.IsConnected()) { throw DatabaseException("Error in Statement::Prepare", 0, "----", "Database is not connected"); } _numberAffectedRows = 0; if ((_stmt = mysql_stmt_init(_db._db)) == NULL) { throw DatabaseException(_db._db, "Error in Statement::Prepare during initialize"); } if (mysql_stmt_prepare(_stmt, _sqlStatement.c_str(), _sqlStatement.length()) != 0) { mysql_stmt_close(_stmt); throw DatabaseException(_stmt, "Error in Statement::Prepare during prepare"); } _bind = NULL; unsigned long parameterCount = ParameterCount(); if (parameterCount > 0) { _bind = (MYSQL_BIND *) malloc(sizeof(MYSQL_BIND) * parameterCount); memset(_bind, 0, sizeof(MYSQL_BIND) * parameterCount); } _numberResultColumns = 0; _hasBlobField = false; MYSQL_RES *metaData; if ((metaData = mysql_stmt_result_metadata(_stmt)) == NULL) { return; } _resultBind = NULL; _numberResultColumns = mysql_num_fields(metaData); if (_numberResultColumns > 0) { _resultBind = (MYSQL_BIND *) malloc(sizeof(MYSQL_BIND) * _numberResultColumns); memset(_resultBind, 0, sizeof(MYSQL_BIND) * _numberResultColumns); } int fieldPos = 0; MYSQL_FIELD *field; while ((field = mysql_fetch_field(metaData)) != NULL) { ParamBuffer *buffer = NULL; if ((field->type == MYSQL_TYPE_VAR_STRING) || (field->type == MYSQL_TYPE_STRING) || (field->type == MYSQL_TYPE_DECIMAL) || (field->type == MYSQL_TYPE_BIT) || (field->type == MYSQL_TYPE_VARCHAR)) { std::string str; buffer = new ParamBuffer(str, field->length); _resultBind[fieldPos].buffer_type = field->type; _resultBind[fieldPos].buffer = buffer->Buffer(); _resultBind[fieldPos].buffer_length = buffer->BufferSize(); _resultBind[fieldPos].length = buffer->BufferLength(); _resultBind[fieldPos].is_null = buffer->IsNull(); _resultBind[fieldPos].error = buffer->Error(); } else if (field->type == MYSQL_TYPE_TINY) { if ((field->flags & UNSIGNED_FLAG) != 0) { buffer = new ParamBuffer((const unsigned char) 0); } else { buffer = new ParamBuffer((const char) 0); } _resultBind[fieldPos].buffer_type = MYSQL_TYPE_TINY; _resultBind[fieldPos].buffer = buffer->Buffer(); _resultBind[fieldPos].buffer_length = buffer->BufferSize(); _resultBind[fieldPos].length = buffer->BufferLength(); _resultBind[fieldPos].is_null = buffer->IsNull(); _resultBind[fieldPos].error = buffer->Error(); _resultBind[fieldPos].is_unsigned = buffer->IsUnsigned(); } else if ((field->type == MYSQL_TYPE_SHORT) || (field->type == MYSQL_TYPE_YEAR)) { if ((field->flags & UNSIGNED_FLAG) != 0) { buffer = new ParamBuffer((const unsigned short int) 0); } else { buffer = new ParamBuffer((const short int) 0); } _resultBind[fieldPos].buffer_type = MYSQL_TYPE_SHORT; _resultBind[fieldPos].buffer = buffer->Buffer(); _resultBind[fieldPos].buffer_length = buffer->BufferSize(); _resultBind[fieldPos].length = buffer->BufferLength(); _resultBind[fieldPos].is_null = buffer->IsNull(); _resultBind[fieldPos].error = buffer->Error(); _resultBind[fieldPos].is_unsigned = buffer->IsUnsigned(); } else if ((field->type == MYSQL_TYPE_LONG) || (field->type == MYSQL_TYPE_INT24)) { if ((field->flags & UNSIGNED_FLAG) != 0) { buffer = new ParamBuffer((const unsigned int) 0); } else { buffer = new ParamBuffer((const int) 0); } _resultBind[fieldPos].buffer_type = field->type; _resultBind[fieldPos].buffer = buffer->Buffer(); _resultBind[fieldPos].buffer_length = buffer->BufferSize(); _resultBind[fieldPos].length = buffer->BufferLength(); _resultBind[fieldPos].is_null = buffer->IsNull(); _resultBind[fieldPos].error = buffer->Error(); _resultBind[fieldPos].is_unsigned = buffer->IsUnsigned(); } else if (field->type == MYSQL_TYPE_FLOAT) { _resultBind[fieldPos].buffer_type = field->type; _resultBind[fieldPos].buffer = buffer->Buffer(); _resultBind[fieldPos].buffer_length = buffer->BufferSize(); _resultBind[fieldPos].length = buffer->BufferLength(); _resultBind[fieldPos].is_null = buffer->IsNull(); _resultBind[fieldPos].error = buffer->Error(); _resultBind[fieldPos].is_unsigned = buffer->IsUnsigned(); } else if (field->type == MYSQL_TYPE_DOUBLE) { _resultBind[fieldPos].buffer_type = field->type; _resultBind[fieldPos].buffer = buffer->Buffer(); _resultBind[fieldPos].buffer_length = buffer->BufferSize(); _resultBind[fieldPos].length = buffer->BufferLength(); _resultBind[fieldPos].is_null = buffer->IsNull(); _resultBind[fieldPos].error = buffer->Error(); _resultBind[fieldPos].is_unsigned = buffer->IsUnsigned(); } else if ((field->type == MYSQL_TYPE_TIMESTAMP) || (field->type == MYSQL_TYPE_DATE) || (field->type == MYSQL_TYPE_TIME) || (field->type == MYSQL_TYPE_DATETIME)) { Julian time; buffer = new ParamBuffer(time); _resultBind[fieldPos].buffer_type = field->type; _resultBind[fieldPos].buffer = buffer->Buffer(); _resultBind[fieldPos].buffer_length = buffer->BufferSize(); _resultBind[fieldPos].length = buffer->BufferLength(); _resultBind[fieldPos].is_null = buffer->IsNull(); _resultBind[fieldPos].error = buffer->Error(); } else if ((field->type == MYSQL_TYPE_BLOB) || (field->type == MYSQL_TYPE_TINY_BLOB) || (field->type == MYSQL_TYPE_MEDIUM_BLOB) || (field->type == MYSQL_TYPE_LONG_BLOB)) { _hasBlobField = true; Binary data(field->length); buffer = new ParamBuffer(data); _resultBind[fieldPos].buffer_type = field->type; _resultBind[fieldPos].buffer = buffer->Buffer(); _resultBind[fieldPos].buffer_length = buffer->BufferSize(); _resultBind[fieldPos].length = buffer->BufferLength(); _resultBind[fieldPos].is_null = buffer->IsNull(); _resultBind[fieldPos].error = buffer->Error(); } if (buffer != NULL) { _resultParams.push_back(buffer); } fieldPos++; } if (_resultParams.size() != _numberResultColumns) { mysql_free_result(metaData); mysql_stmt_close(_stmt); throw DatabaseException("Error in Statement::Prepare", 0, "----", "was not able to bind all parameters"); } if (_hasBlobField) { my_bool setMax = 1; mysql_stmt_attr_set(_stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &setMax); } if (_numberResultColumns > 0) { if (mysql_stmt_bind_result(_stmt, _resultBind) != 0) { mysql_free_result(metaData); mysql_stmt_close(_stmt); throw DatabaseException(_stmt, "Error in Statement::Prepare while binding results"); } } mysql_free_result(metaData); }
unsigned long Statement::RemainingParameters() { return ParameterCount() - _params.size(); }