make (array) of ArrayObject return the contents
[hiphop-php.git] / hphp / util / db-dataset.cpp
blobfadde0de7cb37036d4c38d0eee43fdd01a7a3ca6
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-2013 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 +----------------------------------------------------------------------+
17 #include "hphp/util/db-dataset.h"
19 namespace HPHP {
20 ///////////////////////////////////////////////////////////////////////////////
22 DBDataSet::DBDataSet()
23 : m_fields(nullptr), m_rowCount(0), m_colCount(0),
24 m_row(nullptr), m_lengths(nullptr) {
27 DBDataSet::~DBDataSet() {
28 close();
31 void DBDataSet::addResult(MYSQL *conn, MYSQL_RES *result) {
32 if (result == nullptr) return;
34 int rowCount = mysql_num_rows(result);
35 if (rowCount) {
36 int fieldCount = (int)mysql_field_count(conn);
37 if (m_colCount == 0) {
38 m_colCount = fieldCount;
39 } else {
40 assert(m_colCount == fieldCount);
41 if (m_colCount > fieldCount) {
42 m_colCount = fieldCount; // in case we overflow m_row later
46 m_rowCount += rowCount;
47 m_results.push_back(result);
48 } else {
49 mysql_free_result(result);
53 void DBDataSet::addDataSet(DBDataSet &ds) {
54 if (ds.m_results.empty()) return;
56 if (m_colCount == 0) {
57 m_colCount = ds.m_colCount;
58 } else {
59 assert(m_colCount == ds.m_colCount);
62 m_rowCount += ds.m_rowCount;
63 m_results.insert(m_results.end(), ds.m_results.begin(), ds.m_results.end());
64 ds.m_results.clear();
65 ds.close();
68 void DBDataSet::close() {
69 for (m_iter = m_results.begin(); m_iter != m_results.end(); ++m_iter) {
70 mysql_free_result(*m_iter);
72 m_results.clear();
73 m_fields = nullptr;
74 m_row = nullptr;
75 m_lengths = nullptr;
76 m_rowCount = 0;
77 m_colCount = 0;
80 ///////////////////////////////////////////////////////////////////////////////
82 int DBDataSet::getFieldIndex(const char *fieldName) {
83 assert(fieldName && *fieldName);
85 // without any results, cannot really resolve field names
86 if (m_results.empty()) return -1;
88 if (m_fields == nullptr) {
89 m_fields = mysql_fetch_fields(m_results.front());
92 for (int i = 0; i < m_colCount; i++) {
93 if (strcmp(m_fields[i].name, fieldName) == 0) {
94 return i;
97 return -1;
100 MYSQL_FIELD *DBDataSet::getFields() const {
101 if (m_fields == nullptr && !m_results.empty()) {
102 m_fields = mysql_fetch_fields(m_results.front());
104 return m_fields;
107 ///////////////////////////////////////////////////////////////////////////////
109 void DBDataSet::moveFirst() {
110 for (m_iter = m_results.begin(); m_iter != m_results.end(); ++m_iter) {
111 if (*m_iter && mysql_num_rows(*m_iter) > 0) {
112 mysql_data_seek(*m_iter, 0);
113 m_row = mysql_fetch_row(*m_iter);
114 m_lengths = mysql_fetch_lengths(*m_iter);
115 assert(m_row);
116 assert(m_lengths);
117 return;
120 m_row = nullptr;
121 m_lengths = nullptr;
124 void DBDataSet::moveNext() {
125 if (m_iter != m_results.end()) {
126 if (*m_iter) {
127 m_row = mysql_fetch_row(*m_iter);
128 m_lengths = mysql_fetch_lengths(*m_iter);
129 if (m_row) return;
131 for (++m_iter; m_iter != m_results.end(); ++m_iter) {
132 if (*m_iter && mysql_num_rows(*m_iter) > 0) {
133 mysql_data_seek(*m_iter, 0);
134 m_row = mysql_fetch_row(*m_iter);
135 m_lengths = mysql_fetch_lengths(*m_iter);
136 assert(m_row);
137 assert(m_lengths);
138 return;
142 m_row = nullptr;
143 m_lengths = nullptr;
146 const char *DBDataSet::getField(int field) const {
147 assert(field >= 0 && field < m_colCount);
148 assert(m_row);
149 if (m_row && field >= 0 && field < m_colCount) {
150 return m_row[field];
152 return nullptr;
155 int DBDataSet::getFieldLength(int field) const {
156 assert(field >= 0 && field < m_colCount);
157 assert(m_lengths);
158 if (m_lengths && field >= 0 && field < m_colCount) {
159 return m_lengths[field];
161 return 0;
164 ///////////////////////////////////////////////////////////////////////////////