<!-- This comment will put IE 6, 7 and 8 in quirks mode -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Kudu C++ client API: include/kudu/util/status.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javaScript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Generated by Doxygen 1.6.1 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <img id="MSearchSelect" src="search/search.png"
             onmouseover="return searchBox.OnSearchSelectShow()"
             onmouseout="return searchBox.OnSearchSelectHide()"
             alt=""/>
        <input type="text" id="MSearchField" value="Search" accesskey="S"
             onfocus="searchBox.OnSearchFieldFocus(true)" 
             onblur="searchBox.OnSearchFieldFocus(false)" 
             onkeyup="searchBox.OnSearchFieldChange(event)"/>
        <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
        </div>
      </li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
</div>
<div class="contents">
<h1>include/kudu/util/status.h File Reference</h1><code>#include &lt;stdint.h&gt;</code><br/>
<code>#include &lt;string&gt;</code><br/>
<code>#include &quot;kudu/client/stubs.h&quot;</code><br/>
<code>#include &quot;kudu/util/kudu_export.h&quot;</code><br/>
<code>#include &quot;kudu/util/slice.h&quot;</code><br/>

<p><a href="status_8h_source.html">Go to the source code of this file.</a></p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td colspan="2"><h2>Classes</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1Status.html">kudu::Status</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A representation of an operation's outcome.  <a href="classkudu_1_1Status.html#_details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2>Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="status_8h.html#a0de56a3f0e9d83b8ffdd63eac83c54ab">KUDU_RETURN_NOT_OK</a>(s)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return the given status if it is not <code>OK</code>.  <a href="#a0de56a3f0e9d83b8ffdd63eac83c54ab"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="status_8h.html#af66b8458f1d3f1264c1da86744e29e46">KUDU_RETURN_NOT_OK_PREPEND</a>(s, msg)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return the given status if it is not OK, but first clone it and prepend the given message.  <a href="#af66b8458f1d3f1264c1da86744e29e46"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="status_8h.html#a58d31c81bf1101a3ead737e9a4a4f223">KUDU_RETURN_NOT_OK_RET</a>(to_call, to_return)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return <code>to_return</code> if <code>to_call</code> returns a bad status. The substitution for 'to_return' may reference the variable <code>s</code> for the bad status.  <a href="#a58d31c81bf1101a3ead737e9a4a4f223"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="status_8h.html#a1e64fec5ef85c0c738f6ac3f398f607e">KUDU_WARN_NOT_OK</a>(to_call, warning_prefix)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Emit a warning if <code>to_call</code> returns a bad status.  <a href="#a1e64fec5ef85c0c738f6ac3f398f607e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="status_8h.html#abbd85cc2c5535627091bb06a21918150">KUDU_LOG_AND_RETURN</a>(level, status)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Log the given status and return immediately.  <a href="#abbd85cc2c5535627091bb06a21918150"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="status_8h.html#a706c9f6ef1715b8f7a9185fb3c247d3f">KUDU_CHECK_OK_PREPEND</a>(to_call, msg)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">If <code>to_call</code> returns a bad status, CHECK immediately with a logged message of <code>msg</code> followed by the status.  <a href="#a706c9f6ef1715b8f7a9185fb3c247d3f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac503ba85e942147294cdc82087da60f6"></a><!-- doxytag: member="status.h::KUDU_CHECK_OK" ref="ac503ba85e942147294cdc82087da60f6" args="(s)" -->
#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="status_8h.html#ac503ba85e942147294cdc82087da60f6">KUDU_CHECK_OK</a>(s)&nbsp;&nbsp;&nbsp;KUDU_CHECK_OK_PREPEND(s, &quot;Bad status&quot;)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">If the status is bad, CHECK immediately, appending the status to the logged message. <br/></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>This header is used in both the Kudu build as well as in builds of applications that use the Kudu C++ client. In the latter we need to be careful to "namespace" our macros, to avoid colliding or overriding with similarly named macros belonging to the application.</p>
<p>KUDU_HEADERS_USE_SHORT_STATUS_MACROS handles this behavioral change. When defined, we're building Kudu and: </p>
<ul>
<li>Non-namespaced macros are allowed and mapped to the namespaced versions defined above. </li>
<li>Namespaced versions of glog macros are mapped to the real glog macros (otherwise the macros are defined in the C++ client stubs). </li>
</ul>
<hr/><h2>Define Documentation</h2>
<a class="anchor" id="a706c9f6ef1715b8f7a9185fb3c247d3f"></a><!-- doxytag: member="status.h::KUDU_CHECK_OK_PREPEND" ref="a706c9f6ef1715b8f7a9185fb3c247d3f" args="(to_call, msg)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define KUDU_CHECK_OK_PREPEND</td>
          <td>(</td>
          <td class="paramtype">to_call, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">msg&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> { \
    const ::kudu::Status&amp; _s = (to_call);                   \
    KUDU_CHECK(_s.ok()) &lt;&lt; (msg) &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; _s.ToString();  \
  } <span class="keywordflow">while</span> (0);
</pre></div>
<p>If <code>to_call</code> returns a bad status, CHECK immediately with a logged message of <code>msg</code> followed by the status. </p>

</div>
</div>
<a class="anchor" id="abbd85cc2c5535627091bb06a21918150"></a><!-- doxytag: member="status.h::KUDU_LOG_AND_RETURN" ref="abbd85cc2c5535627091bb06a21918150" args="(level, status)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define KUDU_LOG_AND_RETURN</td>
          <td>(</td>
          <td class="paramtype">level, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">status&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> { \
    const ::kudu::Status&amp; _s = (status);        \
    KUDU_LOG(level) &lt;&lt; _s.ToString(); \
    <span class="keywordflow">return</span> _s; \
  } <span class="keywordflow">while</span> (0);
</pre></div>
<p>Log the given status and return immediately. </p>

</div>
</div>
<a class="anchor" id="a0de56a3f0e9d83b8ffdd63eac83c54ab"></a><!-- doxytag: member="status.h::KUDU_RETURN_NOT_OK" ref="a0de56a3f0e9d83b8ffdd63eac83c54ab" args="(s)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define KUDU_RETURN_NOT_OK</td>
          <td>(</td>
          <td class="paramtype">s&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> { \
    const ::kudu::Status&amp; _s = (s);             \
    <span class="keywordflow">if</span> (PREDICT_FALSE(!_s.ok())) <span class="keywordflow">return</span> _s;     \
  } <span class="keywordflow">while</span> (0);
</pre></div>
<p>Return the given status if it is not <code>OK</code>. </p>

</div>
</div>
<a class="anchor" id="af66b8458f1d3f1264c1da86744e29e46"></a><!-- doxytag: member="status.h::KUDU_RETURN_NOT_OK_PREPEND" ref="af66b8458f1d3f1264c1da86744e29e46" args="(s, msg)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define KUDU_RETURN_NOT_OK_PREPEND</td>
          <td>(</td>
          <td class="paramtype">s, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">msg&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> { \
    const ::kudu::Status&amp; _s = (s);                              \
    <span class="keywordflow">if</span> (PREDICT_FALSE(!_s.ok())) <span class="keywordflow">return</span> _s.CloneAndPrepend(msg); \
  } <span class="keywordflow">while</span> (0);
</pre></div>
<p>Return the given status if it is not OK, but first clone it and prepend the given message. </p>

</div>
</div>
<a class="anchor" id="a58d31c81bf1101a3ead737e9a4a4f223"></a><!-- doxytag: member="status.h::KUDU_RETURN_NOT_OK_RET" ref="a58d31c81bf1101a3ead737e9a4a4f223" args="(to_call, to_return)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define KUDU_RETURN_NOT_OK_RET</td>
          <td>(</td>
          <td class="paramtype">to_call, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">to_return&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> { \
    const ::kudu::Status&amp; s = (to_call);                \
    <span class="keywordflow">if</span> (PREDICT_FALSE(!s.ok())) <span class="keywordflow">return</span> (to_return);  \
  } <span class="keywordflow">while</span> (0);
</pre></div>
<p>Return <code>to_return</code> if <code>to_call</code> returns a bad status. The substitution for 'to_return' may reference the variable <code>s</code> for the bad status. </p>

</div>
</div>
<a class="anchor" id="a1e64fec5ef85c0c738f6ac3f398f607e"></a><!-- doxytag: member="status.h::KUDU_WARN_NOT_OK" ref="a1e64fec5ef85c0c738f6ac3f398f607e" args="(to_call, warning_prefix)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define KUDU_WARN_NOT_OK</td>
          <td>(</td>
          <td class="paramtype">to_call, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">warning_prefix&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">do</span> { \
    const ::kudu::Status&amp; _s = (to_call);              \
    <span class="keywordflow">if</span> (PREDICT_FALSE(!_s.ok())) { \
      KUDU_LOG(WARNING) &lt;&lt; (warning_prefix) &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; _s.ToString();  \
    } \
  } <span class="keywordflow">while</span> (0);
</pre></div>
<p>Emit a warning if <code>to_call</code> returns a bad status. </p>

</div>
</div>
</div>
<!--- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&nbsp;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&nbsp;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&nbsp;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&nbsp;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&nbsp;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&nbsp;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&nbsp;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&nbsp;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&nbsp;</span>Defines</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<!-- start footer part -->
<hr class="footer"/>
<address class="footer">
  <small>Generated for Kudu version 1.0.1 on Tue Oct 11 08:52:01 2016 by Doxygen 1.6.1</small>
  <br>
  <small>Copyright © 2016 The Apache Software Foundation.</small>
</address>
</body>
</html>
