<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13719">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved
  Vadim Yanitskiy: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">db_hlr.c: add db_subscr_exists_by_msisdn()<br><br>Check if a subscriber exists without generating an error log entry if<br>it does not. This is cheaper than db_subscr_get_by_msisdn(), as it<br>does not fetch the subscriber entry.<br><br>subscriber-create-on-demand will use this function to generate<br>a random unique MSISDN for new subscribers.<br><br>Related: OS#2542<br>Change-Id: Ibfbc408c966197682ba2b12d166ade4bfeb7abc2<br>---<br>M src/db.c<br>M src/db.h<br>M src/db_hlr.c<br>M tests/db/db_test.c<br>M tests/db/db_test.err<br>5 files changed, 42 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/db.c b/src/db.c</span><br><span>index 9cad263..7de61a2 100644</span><br><span>--- a/src/db.c</span><br><span>+++ b/src/db.c</span><br><span>@@ -80,6 +80,7 @@</span><br><span>       [DB_STMT_AUC_3G_DELETE] = "DELETE FROM auc_3g WHERE subscriber_id = $subscriber_id",</span><br><span>       [DB_STMT_SET_LAST_LU_SEEN] = "UPDATE subscriber SET last_lu_seen = datetime($val, 'unixepoch') WHERE id = $subscriber_id",</span><br><span>         [DB_STMT_EXISTS_BY_IMSI] = "SELECT 1 FROM subscriber WHERE imsi = $imsi",</span><br><span style="color: hsl(120, 100%, 40%);">+   [DB_STMT_EXISTS_BY_MSISDN] = "SELECT 1 FROM subscriber WHERE msisdn = $msisdn",</span><br><span> };</span><br><span> </span><br><span> static void sql3_error_log_cb(void *arg, int err_code, const char *msg)</span><br><span>diff --git a/src/db.h b/src/db.h</span><br><span>index 8543085..12e74f8 100644</span><br><span>--- a/src/db.h</span><br><span>+++ b/src/db.h</span><br><span>@@ -29,6 +29,7 @@</span><br><span>      DB_STMT_AUC_3G_DELETE,</span><br><span>       DB_STMT_SET_LAST_LU_SEEN,</span><br><span>    DB_STMT_EXISTS_BY_IMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+       DB_STMT_EXISTS_BY_MSISDN,</span><br><span>    _NUM_DB_STMT</span><br><span> };</span><br><span> </span><br><span>@@ -132,6 +133,7 @@</span><br><span> int db_subscr_update_imei_by_imsi(struct db_context *dbc, const char* imsi, const char *imei);</span><br><span> </span><br><span> int db_subscr_exists_by_imsi(struct db_context *dbc, const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+int db_subscr_exists_by_msisdn(struct db_context *dbc, const char *msisdn);</span><br><span> </span><br><span> int db_subscr_get_by_imsi(struct db_context *dbc, const char *imsi,</span><br><span>                          struct hlr_subscriber *subscr);</span><br><span>diff --git a/src/db_hlr.c b/src/db_hlr.c</span><br><span>index c59daf7..362dcf2 100644</span><br><span>--- a/src/db_hlr.c</span><br><span>+++ b/src/db_hlr.c</span><br><span>@@ -560,6 +560,33 @@</span><br><span>        return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Check if a subscriber exists in the HLR database.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in, out] dbc  database context.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] msisdn  ASCII string of MSISDN digits.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns 0 if it exists, -ENOENT if it does not exist, -EIO on database error.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int db_subscr_exists_by_msisdn(struct db_context *dbc, const char *msisdn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    sqlite3_stmt *stmt = dbc->stmt[DB_STMT_EXISTS_BY_MSISDN];</span><br><span style="color: hsl(120, 100%, 40%);">+  const char *err;</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!db_bind_text(stmt, NULL, msisdn))</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = sqlite3_step(stmt);</span><br><span style="color: hsl(120, 100%, 40%);">+      db_remove_reset(stmt);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc == SQLITE_ROW)</span><br><span style="color: hsl(120, 100%, 40%);">+         return 0; /* exists */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc == SQLITE_DONE)</span><br><span style="color: hsl(120, 100%, 40%);">+                return -ENOENT; /* does not exist */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        err = sqlite3_errmsg(dbc->db);</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DAUC, LOGL_ERROR, "Failed to check if subscriber exists "</span><br><span style="color: hsl(120, 100%, 40%);">+              "by MSISDN='%s': %s\n", msisdn, err);</span><br><span style="color: hsl(120, 100%, 40%);">+       return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Retrieve subscriber data from the HLR database.</span><br><span>  * \param[in,out] dbc  database context.</span><br><span>  * \param[in] msisdn  ASCII string of MSISDN digits.</span><br><span>diff --git a/tests/db/db_test.c b/tests/db/db_test.c</span><br><span>index 217a8c5..fdd62c5 100644</span><br><span>--- a/tests/db/db_test.c</span><br><span>+++ b/tests/db/db_test.c</span><br><span>@@ -294,6 +294,11 @@</span><br><span>       ASSERT_SEL(imsi, imsi0, 0);</span><br><span>  ASSERT_SEL(msisdn, "5432101234567891", -ENOENT);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        comment("Check if subscriber exists (by MSISDN)");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ASSERT_RC(db_subscr_exists_by_msisdn(dbc, "543210123456789"), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   ASSERT_RC(db_subscr_exists_by_msisdn(dbc, "5432101234567891"), -ENOENT);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         comment("Set MSISDN on non-existent / invalid IMSI");</span><br><span> </span><br><span>  ASSERT_RC(db_subscr_update_msisdn_by_imsi(dbc, unknown_imsi, "99"), -ENOENT);</span><br><span>diff --git a/tests/db/db_test.err b/tests/db/db_test.err</span><br><span>index 0701089..4dc77e8 100644</span><br><span>--- a/tests/db/db_test.err</span><br><span>+++ b/tests/db/db_test.err</span><br><span>@@ -219,6 +219,13 @@</span><br><span> DAUC Cannot read subscriber from db: MSISDN='5432101234567891': No such subscriber</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+--- Check if subscriber exists (by MSISDN)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_subscr_exists_by_msisdn(dbc, "543210123456789") --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_subscr_exists_by_msisdn(dbc, "5432101234567891") --> -ENOENT</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> --- Set MSISDN on non-existent / invalid IMSI</span><br><span> </span><br><span> db_subscr_update_msisdn_by_imsi(dbc, unknown_imsi, "99") --> -ENOENT</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13719">change 13719</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13719"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hlr </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ibfbc408c966197682ba2b12d166ade4bfeb7abc2 </div>
<div style="display:none"> Gerrit-Change-Number: 13719 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>