Variant f_mysql_fetch_lengths(CVarRef result) { MySQLResult *res = php_mysql_extract_result(result); if (res == NULL) return false; if (res->isLocalized()) { if (!res->isRowReady()) return false; Array ret; for (int i = 0; i < res->getFieldCount(); i++) { MySQLFieldInfo *info = res->getFieldInfo(i); if (info->type == MYSQL_TYPE_YEAR) { // special case for years, because of leading zeros ret.set(i, info->length); } else { // convert fields back to Strings to get lengths ret.set(i, res->getField(i).toString().length()); } } return ret; } MYSQL_RES *mysql_result = res->get(); unsigned long *lengths = mysql_fetch_lengths(mysql_result); if (!lengths) { return false; } Array ret; int num_fields = mysql_num_fields(mysql_result); for (int i = 0; i < num_fields; i++) { ret.set(i, (int)lengths[i]); } return ret; }
static Variant HHVM_FUNCTION(mysql_async_fetch_array, const Resource& result, int result_type /* = 1 */) { if ((result_type & PHP_MYSQL_BOTH) == 0) { throw_invalid_argument("result_type: %d", result_type); return false; } MySQLResult* res = php_mysql_extract_result(result); if (!res) { return false; } MYSQL_RES* mysql_result = res->get(); if (!mysql_result) { raise_warning("invalid parameter to mysql_async_fetch_array"); return false; } MYSQL_ROW mysql_row = NULL; int status = mysql_fetch_row_nonblocking(mysql_result, &mysql_row); // Last row, or no row yet available. if (status != NET_ASYNC_COMPLETE) { return false; } if (mysql_row == NULL) { res->close(); return false; } unsigned long *mysql_row_lengths = mysql_fetch_lengths(mysql_result); if (!mysql_row_lengths) { return false; } mysql_field_seek(mysql_result, 0); Array ret; MYSQL_FIELD *mysql_field; int i; for (mysql_field = mysql_fetch_field(mysql_result), i = 0; mysql_field; mysql_field = mysql_fetch_field(mysql_result), i++) { Variant data; if (mysql_row[i]) { data = mysql_makevalue(String(mysql_row[i], mysql_row_lengths[i], CopyString), mysql_field); } if (result_type & PHP_MYSQL_NUM) { ret.set(i, data); } if (result_type & PHP_MYSQL_ASSOC) { ret.set(String(mysql_field->name, CopyString), data); } } return ret; }
MySQLResult *php_mysql_extract_result(const Variant& result) { MySQLResult *res = result.toResource().getTyped<MySQLResult> (!RuntimeOption::ThrowBadTypeExceptions, !RuntimeOption::ThrowBadTypeExceptions); if (res == nullptr || (res->get() == nullptr && !res->isLocalized())) { raise_warning("supplied argument is not a valid MySQL result resource"); return nullptr; } return res; }
Variant f_mysql_result(CVarRef result, int row, CVarRef field /* = null_variant */) { MySQLResult *res = php_mysql_extract_result(result); if (res == NULL) return false; MYSQL_RES *mysql_result = NULL; MYSQL_ROW sql_row = NULL; unsigned long *sql_row_lengths = NULL; if (res->isLocalized()) { if (!res->seekRow(row)) return false; if (!res->fetchRow()) return false; } else { mysql_result = res->get(); if (row < 0 || row >= (int)mysql_num_rows(mysql_result)) { raise_warning("Unable to jump to row %d on MySQL result index %d", row, result.toResource()->o_getId()); return false; } mysql_data_seek(mysql_result, row); sql_row = mysql_fetch_row(mysql_result); if (!sql_row) { return false; } sql_row_lengths = mysql_fetch_lengths(mysql_result); if (!sql_row_lengths) { return false; } } int field_offset = 0; if (!field.isNull()) { if (field.isString()) { String sfield = field.toString(); const char *tmp = strchr(sfield.data(), '.'); String table_name, field_name; if (tmp) { int pos = tmp - sfield.data(); table_name = sfield.substr(0, pos); field_name = sfield.substr(pos + 1); } else { field_name = sfield; } int i = 0; bool found = false; res->seekField(0); while (i < res->getFieldCount()) { MySQLFieldInfo *info = res->getFieldInfo(i); if ((table_name.empty() || table_name.same(info->table)) && field_name.same(info->name)) { field_offset = i; found = true; break; } i++; } if (!found) { /* no match found */ raise_warning("%s%s%s not found in MySQL result index %d", table_name.data(), (table_name.empty() ? "" : "."), field_name.data(), result.toResource()->o_getId()); return false; } } else { field_offset = field.toInt32(); if (field_offset < 0 || field_offset >= (int)res->getFieldCount()) { raise_warning("Bad column offset specified"); return false; } } } if (res->isLocalized()) { Variant f = res->getField(field_offset); if (!f.isNull()) { return f.toString(); } } else { if (sql_row[field_offset]) { return String(sql_row[field_offset], sql_row_lengths[field_offset], CopyString); } } return uninit_null(); }
bool f_mysql_async_query_completed(CVarRef result) { MySQLResult *res = result.toResource().getTyped<MySQLResult> (!RuntimeOption::ThrowBadTypeExceptions, !RuntimeOption::ThrowBadTypeExceptions); return !res || res->get() == NULL; }