2 +----------------------------------------------------------------------+
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"
20 ///////////////////////////////////////////////////////////////////////////////
22 DBDataSet::DBDataSet()
23 : m_fields(nullptr), m_rowCount(0), m_colCount(0),
24 m_row(nullptr), m_lengths(nullptr) {
27 DBDataSet::~DBDataSet() {
31 void DBDataSet::addResult(MYSQL
*conn
, MYSQL_RES
*result
) {
32 if (result
== nullptr) return;
34 int rowCount
= mysql_num_rows(result
);
36 int fieldCount
= (int)mysql_field_count(conn
);
37 if (m_colCount
== 0) {
38 m_colCount
= fieldCount
;
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
);
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
;
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());
68 void DBDataSet::close() {
69 for (m_iter
= m_results
.begin(); m_iter
!= m_results
.end(); ++m_iter
) {
70 mysql_free_result(*m_iter
);
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) {
100 MYSQL_FIELD
*DBDataSet::getFields() const {
101 if (m_fields
== nullptr && !m_results
.empty()) {
102 m_fields
= mysql_fetch_fields(m_results
.front());
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
);
124 void DBDataSet::moveNext() {
125 if (m_iter
!= m_results
.end()) {
127 m_row
= mysql_fetch_row(*m_iter
);
128 m_lengths
= mysql_fetch_lengths(*m_iter
);
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
);
146 const char *DBDataSet::getField(int field
) const {
147 assert(field
>= 0 && field
< m_colCount
);
149 if (m_row
&& field
>= 0 && field
< m_colCount
) {
155 int DBDataSet::getFieldLength(int field
) const {
156 assert(field
>= 0 && field
< m_colCount
);
158 if (m_lengths
&& field
>= 0 && field
< m_colCount
) {
159 return m_lengths
[field
];
164 ///////////////////////////////////////////////////////////////////////////////