Fix crash when trying to change staticness of a property
[hiphop-php.git] / hphp / util / db-dataset.cpp
blob70bf7fa4507d54bf9a7099c12abeb47dce7e47b2
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-2014 Facebook, Inc. (http://www.facebook.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
16 #include "hphp/util/db-dataset.h"
18 #include <cassert>
19 #include <cstring>
21 namespace HPHP {
22 ///////////////////////////////////////////////////////////////////////////////
24 DBDataSet::DBDataSet()
25 : m_fields(nullptr), m_rowCount(0), m_colCount(0),
26 m_row(nullptr), m_lengths(nullptr) {
29 DBDataSet::~DBDataSet() {
30 close();
33 void DBDataSet::addResult(MYSQL *conn, MYSQL_RES *result) {
34 if (result == nullptr) return;
36 int rowCount = mysql_num_rows(result);
37 if (rowCount) {
38 int fieldCount = (int)mysql_field_count(conn);
39 if (m_colCount == 0) {
40 m_colCount = fieldCount;
41 } else {
42 assert(m_colCount == fieldCount);
43 if (m_colCount > fieldCount) {
44 m_colCount = fieldCount; // in case we overflow m_row later
48 m_rowCount += rowCount;
49 m_results.push_back(result);
50 } else {
51 mysql_free_result(result);
55 void DBDataSet::addDataSet(DBDataSet &ds) {
56 if (ds.m_results.empty()) return;
58 if (m_colCount == 0) {
59 m_colCount = ds.m_colCount;
60 } else {
61 assert(m_colCount == ds.m_colCount);
64 m_rowCount += ds.m_rowCount;
65 m_results.insert(m_results.end(), ds.m_results.begin(), ds.m_results.end());
66 ds.m_results.clear();
67 ds.close();
70 void DBDataSet::close() {
71 for (m_iter = m_results.begin(); m_iter != m_results.end(); ++m_iter) {
72 mysql_free_result(*m_iter);
74 m_results.clear();
75 m_fields = nullptr;
76 m_row = nullptr;
77 m_lengths = nullptr;
78 m_rowCount = 0;
79 m_colCount = 0;
82 ///////////////////////////////////////////////////////////////////////////////
84 int DBDataSet::getFieldIndex(const char *fieldName) {
85 assert(fieldName && *fieldName);
87 // without any results, cannot really resolve field names
88 if (m_results.empty()) return -1;
90 if (m_fields == nullptr) {
91 m_fields = mysql_fetch_fields(m_results.front());
94 for (int i = 0; i < m_colCount; i++) {
95 if (strcmp(m_fields[i].name, fieldName) == 0) {
96 return i;
99 return -1;
102 MYSQL_FIELD *DBDataSet::getFields() const {
103 if (m_fields == nullptr && !m_results.empty()) {
104 m_fields = mysql_fetch_fields(m_results.front());
106 return m_fields;
109 ///////////////////////////////////////////////////////////////////////////////
111 void DBDataSet::moveFirst() {
112 for (m_iter = m_results.begin(); m_iter != m_results.end(); ++m_iter) {
113 if (*m_iter && mysql_num_rows(*m_iter) > 0) {
114 mysql_data_seek(*m_iter, 0);
115 m_row = mysql_fetch_row(*m_iter);
116 m_lengths = mysql_fetch_lengths(*m_iter);
117 assert(m_row);
118 assert(m_lengths);
119 return;
122 m_row = nullptr;
123 m_lengths = nullptr;
126 void DBDataSet::moveNext() {
127 if (m_iter != m_results.end()) {
128 if (*m_iter) {
129 m_row = mysql_fetch_row(*m_iter);
130 m_lengths = mysql_fetch_lengths(*m_iter);
131 if (m_row) return;
133 for (++m_iter; m_iter != m_results.end(); ++m_iter) {
134 if (*m_iter && mysql_num_rows(*m_iter) > 0) {
135 mysql_data_seek(*m_iter, 0);
136 m_row = mysql_fetch_row(*m_iter);
137 m_lengths = mysql_fetch_lengths(*m_iter);
138 assert(m_row);
139 assert(m_lengths);
140 return;
144 m_row = nullptr;
145 m_lengths = nullptr;
148 const char *DBDataSet::getField(int field) const {
149 assert(field >= 0 && field < m_colCount);
150 assert(m_row);
151 if (m_row && field >= 0 && field < m_colCount) {
152 return m_row[field];
154 return nullptr;
157 int DBDataSet::getFieldLength(int field) const {
158 assert(field >= 0 && field < m_colCount);
159 assert(m_lengths);
160 if (m_lengths && field >= 0 && field < m_colCount) {
161 return m_lengths[field];
163 return 0;
166 ///////////////////////////////////////////////////////////////////////////////