2 +----------------------------------------------------------------------+
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"
22 ///////////////////////////////////////////////////////////////////////////////
24 DBDataSet::DBDataSet()
25 : m_fields(nullptr), m_rowCount(0), m_colCount(0),
26 m_row(nullptr), m_lengths(nullptr) {
29 DBDataSet::~DBDataSet() {
33 void DBDataSet::addResult(MYSQL
*conn
, MYSQL_RES
*result
) {
34 if (result
== nullptr) return;
36 int rowCount
= mysql_num_rows(result
);
38 int fieldCount
= (int)mysql_field_count(conn
);
39 if (m_colCount
== 0) {
40 m_colCount
= fieldCount
;
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
);
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
;
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());
70 void DBDataSet::close() {
71 for (m_iter
= m_results
.begin(); m_iter
!= m_results
.end(); ++m_iter
) {
72 mysql_free_result(*m_iter
);
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) {
102 MYSQL_FIELD
*DBDataSet::getFields() const {
103 if (m_fields
== nullptr && !m_results
.empty()) {
104 m_fields
= mysql_fetch_fields(m_results
.front());
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
);
126 void DBDataSet::moveNext() {
127 if (m_iter
!= m_results
.end()) {
129 m_row
= mysql_fetch_row(*m_iter
);
130 m_lengths
= mysql_fetch_lengths(*m_iter
);
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
);
148 const char *DBDataSet::getField(int field
) const {
149 assert(field
>= 0 && field
< m_colCount
);
151 if (m_row
&& field
>= 0 && field
< m_colCount
) {
157 int DBDataSet::getFieldLength(int field
) const {
158 assert(field
>= 0 && field
< m_colCount
);
160 if (m_lengths
&& field
>= 0 && field
< m_colCount
) {
161 return m_lengths
[field
];
166 ///////////////////////////////////////////////////////////////////////////////