<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <base href="https://hibernate.atlassian.net" />
<title>Message Title</title>
</head>
<body class="jira" style="color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.429">
<table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f5f5f5; border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<!-- header here -->
<tr>
<td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px">
<table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 8px"> <img id="header-avatar-image" class="image_fix" src="https://secure.gravatar.com/avatar/12df4da7e3351be801bc16b66caf8038?d=mm&s=48" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top" />
</td>
<td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> <a class="user-hover" rel="hardy.ferentschik" id="email_hardy.ferentschik" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=hardy.ferentschik" style="color:#6c797f;; color: #3b73af; text-decoration: none">Hardy Ferentschik</a> <strong>created</strong> an issue
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px">
<table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-spacing: 0; border-collapse: separate">
<tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 15px; background-color: #fff; border-left: 1px solid #ccc; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px; height: 10px; line-height: 10px; padding: 0 15px 0 16px; mso-line-height-rule: exactly">
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table class="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="page-title-pattern-first-line " style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; padding-top: 10px"> <a href="https://hibernate.atlassian.net/browse/OGM" style="color: #3b73af; text-decoration: none">Hibernate OGM</a> / <a href="https://hibernate.atlassian.net/browse/OGM-848" style="color: #3b73af; text-decoration: none"><img src="cid:jira-generated-image-static-bug-3ca8fac3-4f96-4006-9b73-b879bd1853d1" height="16" width="16" border="0" align="absmiddle" alt="Bug" style="vertical-align: text-bottom" /></a> <a href="https://hibernate.atlassian.net/browse/OGM-848" style="color: #3b73af; text-decoration: none">OGM-848</a>
</td>
</tr>
<tr>
<td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" class="page-title-pattern-header-container"> <span class="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/OGM-848" style="color: #3b73af; text-decoration: none">Refactor how Mongo provider handles database creation- MongoDBDatastoreProvider#extractDatabase</a> </span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand wrapper-special-margin" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 10px; padding-bottom: 5px">
<table class="keyvalue-table" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Issue Type:
</th>
<td class="has-icon" style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <img src="cid:jira-generated-image-static-bug-3ca8fac3-4f96-4006-9b73-b879bd1853d1" height="16" width="16" border="0" align="absmiddle" alt="Bug" style="vertical-align: text-bottom" /> Bug
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Assignee:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
Unassigned
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Components:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
mongodb
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Created:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
29/May/2015 12:45 PM
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Priority:
</th>
<td class="has-icon" style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <img src="cid:jira-generated-image-static-major-acb2f198-c7b5-437c-8005-6e872b52721e" height="16" width="16" border="0" align="absmiddle" alt="Major" style="vertical-align: text-bottom" /> Major
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Reporter:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <a class="user-hover" rel="hardy.ferentschik" id="email_hardy.ferentschik" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=hardy.ferentschik" style="color:#6c797f;; color: #3b73af; text-decoration: none">Hardy Ferentschik</a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand issue-description-container" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 5px; padding-bottom: 10px">
<table class="text-paragraph-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 2px">
<tr>
<td class="text-paragraph-pattern-container mobile-resize-text " style="padding: 0px; border-collapse: collapse; padding: 0 0 10px 0">
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The current code is misleading and in some respect plain wrong. Here is the existing code:</p>
<div class="code panel" style="border-width: 1px;; border: 1px solid #ccc; background: #f5f5f5; font-size: 12px; line-height: 1.333; font-family: monospace; border: 1px solid #ccc; -moz-border-radius: 3px 3px 3px 3px; border-radius: 3px 3px 3px 3px; margin: 9px 0">
<div class="codeContent panelContent" style="padding: 9px 12px">
<pre class="code-java" style="margin: 10px 0 0 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
<span class="code-keyword" style="color: #000091">try</span> {
        <span class="code-object" style="color: #910091">String</span> databaseName = config.getDatabaseName();
        log.connectingToMongoDatabase( databaseName );
        <span class="code-object" style="color: #910091">Boolean</span> containsDatabase;
        <span class="code-keyword" style="color: #000091">try</span> {
                containsDatabase = mongo.getDatabaseNames().contains( databaseName );
        }
        <span class="code-keyword" style="color: #000091">catch</span> (MongoException me) {
                <span class="code-comment" style="color: #808080">// we don't have enough privileges, ignore the database creation
</span>                containsDatabase = <span class="code-keyword" style="color: #000091">null</span>;
        }
        <span class="code-keyword" style="color: #000091">if</span> ( containsDatabase != <span class="code-keyword" style="color: #000091">null</span> && containsDatabase == <span class="code-object" style="color: #910091">Boolean</span>.FALSE ) {
                <span class="code-keyword" style="color: #000091">if</span> ( config.isCreateDatabase() ) {
                        log.creatingDatabase( databaseName );
                }
                <span class="code-keyword" style="color: #000091">else</span> {
                        <span class="code-keyword" style="color: #000091">throw</span> log.databaseDoesNotExistException( config.getDatabaseName() );
                }
        }
        DB db = mongo.getDB( databaseName );
        <span class="code-keyword" style="color: #000091">if</span> ( containsDatabase == <span class="code-keyword" style="color: #000091">null</span> ) {
                <span class="code-comment" style="color: #808080">// force a connection to make sure we <span class="code-keyword" style="color: #000091; color: #808080">do</span> have read access
</span>                <span class="code-comment" style="color: #808080">// otherwise the connection failure happens during the first flush
</span>                <span class="code-object" style="color: #910091">int</span> retries = 0;
                <span class="code-keyword" style="color: #000091">while</span> (<span class="code-keyword" style="color: #000091">true</span>) {
                        <span class="code-keyword" style="color: #000091">try</span> {
                                db.collectionExists( <span class="code-quote" style="color: #009100">"WeDoNotCareWhatItIsWeNeedToConnect"</span> );
                                <span class="code-keyword" style="color: #000091">break</span>;
                        }
                        <span class="code-keyword" style="color: #000091">catch</span> (MongoTimeoutException me) {
                                <span class="code-comment" style="color: #808080">// unless we retry twice, the second access will be aTimeoutExceptionerror instead of an auth error
</span>                                <span class="code-comment" style="color: #808080">// This is a workaround <span class="code-keyword" style="color: #000091; color: #808080">for</span> https://jira.mongodb.org/browse/JAVA-1803
</span>                                retries++;
                                <span class="code-keyword" style="color: #000091">if</span> ( retries > 2 ) {
                                        <span class="code-keyword" style="color: #000091">throw</span> me;
                                }
                        }
                }
        }
        <span class="code-keyword" style="color: #000091">return</span> mongo.getDB( databaseName );
}
<span class="code-keyword" style="color: #000091">catch</span> (MongoException me) {
        <span class="code-keyword" style="color: #000091">switch</span> ( me.getCode() ) {
                <span class="code-keyword" style="color: #000091">case</span> AUTHENTICATION_FAILED_CODE:
                        <span class="code-keyword" style="color: #000091">throw</span> log.authenticationFailed( config.getUsername() );
                <span class="code-keyword" style="color: #000091">default</span>:
                        <span class="code-keyword" style="color: #000091">throw</span> log.unableToConnectToDatastore( config.getHosts().toString(), me );
        }
}
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The idea is to check whether the specified database exists (using <tt>getDatabaseNames</tt>) and then depending on <tt>config.isCreateDatabase()</tt> create it (implicitly, since just calling getDB will create it). This makes really only sense if the database runs in no-auth mode. If the database runs with authentication, the user and database need to exist in the first place, otherwise an authentication error occurs. There is really no point to call <tt>getDatabaseNames</tt> anymore.<br /> Also the current code does just check the authorization error code (18) and in all other cases assumes that there is a privilege problem. That is not the case and should be explicitly tests (see <a href="https://github.com/mongodb/mongo/blob/master/src/mongo/base/error_codes.err" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">https://github.com/mongodb/mongo/blob/master/src/mongo/base/error_codes.err</a>). The error code of interest is "Unauthorized", 13. <br /> Last but not least, <tt>collectionExists</tt> to indirectly check whether the user has read access (which btw I think is a given and if anything we should check for readWrite access). This should be really replaced with something like:</p>
<div class="code panel" style="border-width: 1px;; border: 1px solid #ccc; background: #f5f5f5; font-size: 12px; line-height: 1.333; font-family: monospace; border: 1px solid #ccc; -moz-border-radius: 3px 3px 3px 3px; border-radius: 3px 3px 3px 3px; margin: 9px 0">
<div class="codeContent panelContent" style="padding: 9px 12px">
<pre class="code-java" style="margin: 10px 0 0 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
BasicDBObject commandArguments = <span class="code-keyword" style="color: #000091">new</span> BasicDBObject();
commandArguments.put(<span class="code-quote" style="color: #009100">"user"</span>, <user>);
commandArguments.put( <span class="code-quote" style="color: #009100">"db"</span>, "<dbname> );
BasicDBObject command = <span class="code-keyword" style="color: #000091">new</span> BasicDBObject(<span class="code-quote" style="color: #009100">"usersInfo"</span>, commandArguments);
CommandResult result = db.command( command );
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The result contains the permissions of the given user for the specified database.</p>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px">
<tr>
<td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 10px 0 10px 24px; vertical-align: middle; padding-left: 0">
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/OGM-848#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="cid:jira-generated-image-static-comment-icon-73879363-f3b2-479f-9373-74da0f73066e" alt="Add Comment" title="Add Comment" height="16" width="16" border="0" style="vertical-align: middle" /> </a>
</td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px"> <a href="https://hibernate.atlassian.net/browse/OGM-848#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none">Add Comment</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<tr>
<td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 5px; line-height: 5px; background-color: #fff; border-top: 0; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; mso-line-height-rule: exactly">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px">
<table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px">
This message was sent by Atlassian JIRA <span id="footer-build-information">(v6.5-OD-04-052#65000-<span title="8b5a8f99550d9b128f1b0f2880ca60c820e3e04b" data-commit-id="8b5a8f99550d9b128f1b0f2880ca60c820e3e04b}">sha1:8b5a8f9</span>)</span>
</td>
<td id="footer-pattern-logo-desktop-container" valign="top" style="padding: 0px; border-collapse: collapse; padding-left: 20px; vertical-align: top">
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-logo-desktop-padding" style="padding: 0px; border-collapse: collapse; padding-top: 3px"> <img id="footer-pattern-logo-desktop" src="cid:jira-generated-image-static-footer-desktop-logo-e781d2da-469f-4d8a-ac96-1eadfd3a14f1" alt="Atlassian logo" title="Atlassian logo" width="169" height="36" class="image_fix" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>