This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Vadim Yanitskiy gerrit-no-reply at lists.osmocom.orgVadim Yanitskiy has uploaded this change for review. ( https://gerrit.osmocom.org/13632
Change subject: WIP: store SM-TP-UDL in the database
......................................................................
WIP: store SM-TP-UDL in the database
Change-Id: I747a795ca486f3fcfa7583c5ab8aa2aee07a8ec2
---
M src/libmsc/db.c
1 file changed, 133 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/32/13632/1
diff --git a/src/libmsc/db.c b/src/libmsc/db.c
index d9717d9..a9d6f0b 100644
--- a/src/libmsc/db.c
+++ b/src/libmsc/db.c
@@ -48,7 +48,7 @@
static dbi_conn conn;
static dbi_inst inst;
-#define SCHEMA_REVISION "5"
+#define SCHEMA_REVISION "6"
enum {
SCHEMA_META,
@@ -133,6 +133,7 @@
"dest_addr TEXT NOT NULL, "
"dest_ton INTEGER NOT NULL, "
"dest_npi INTEGER NOT NULL, "
+ "user_data_len INTEGER NOT NULL, " /* TP-UDL */
"user_data BLOB, " /* TP-UD */
/* additional data, interpreted from SMS */
"header BLOB, " /* UD Header */
@@ -227,20 +228,32 @@
static void parse_tp_ud_from_result(struct gsm_sms *sms, dbi_result result)
{
+ unsigned int user_data_len, tp_udl;
const unsigned char *user_data;
- unsigned int user_data_len;
unsigned int text_len;
const char *text;
/* Retrieve TP-UDL (User-Data-Length) in octets (regardless of DCS) */
user_data_len = dbi_result_get_field_length(result, "user_data");
+
+ /* Retrieve the original TP-UDL (User-Data-Length) value.
+ * Depending on DCS, may indicate the amount of octets or septets.
+ * Backwards compatibility: this field is available since v6.
+ * For older versions this call will return 0 (zero). */
+ tp_udl = dbi_result_get_ulonglong(result, "user_data_len");
+ if (tp_udl == 0) {
+ if (user_data_len > 0)
+ } else {
+ sms->user_data_len = tp_udl;
+ }
+
+ /* Prevent TP-UD buffer overflow */
if (user_data_len > sizeof(sms->user_data)) {
LOGP(DDB, LOGL_ERROR,
"SMS TP-UD length %u is too big, truncating to %zu\n",
user_data_len, sizeof(sms->user_data));
user_data_len = (uint8_t) sizeof(sms->user_data);
}
- sms->user_data_len = user_data_len;
/* Retrieve the TP-UD (User-Data) itself */
user_data = dbi_result_get_binary(result, "user_data");
@@ -555,6 +568,119 @@
return -EINVAL;
}
+/* Just like v4, but there is a new TP-UDL (User-Data-Length) field */
+static struct gsm_sms *sms_from_result_v5(dbi_result result)
+{
+ struct gsm_sms *sms;
+
+
+ sms = sms_from_result_v4(result);
+}
+
+static int update_db_revision_5(void)
+{
+ struct gsm_sms *sms;
+ dbi_result result;
+
+ LOGP(DDB, LOGL_NOTICE, "Going to migrate from revision 5\n");
+
+ result = dbi_conn_query(conn, "BEGIN EXCLUSIVE TRANSACTION");
+ if (!result) {
+ LOGP(DDB, LOGL_ERROR,
+ "Failed to begin transaction (upgrade from rev 5)\n");
+ return -EINVAL;
+ }
+ dbi_result_free(result);
+
+ /* Rename old SMS table to be able create a new one */
+ result = dbi_conn_query(conn, "ALTER TABLE SMS RENAME TO SMS_5");
+ if (!result) {
+ LOGP(DDB, LOGL_ERROR,
+ "Failed to rename the old SMS table (upgrade from rev 5)\n");
+ goto rollback;
+ }
+ dbi_result_free(result);
+
+ /* Create new SMS table with all the bells and whistles! */
+ result = dbi_conn_query(conn, create_stmts[SCHEMA_SMS]);
+ if (!result) {
+ LOGP(DDB, LOGL_ERROR,
+ "Failed to create a new SMS table (upgrade from rev 5)\n");
+ goto rollback;
+ }
+ dbi_result_free(result);
+
+ /* Cycle through old messages and convert them to the new format */
+ result = dbi_conn_query(conn, "SELECT * FROM SMS_5");
+ if (!result) {
+ LOGP(DDB, LOGL_ERROR,
+ "Failed fetch messages from the old SMS table "
+ "(upgrade from rev 5)\n");
+ goto rollback;
+ }
+ while (next_row(result)) {
+ sms = sms_from_result_v5(result);
+ if (db_sms_store(sms) != 0) {
+ LOGP(DDB, LOGL_ERROR,
+ "Failed to store message to the new SMS table "
+ "(upgrade from rev 5)\n");
+ dbi_result_free(result);
+ sms_free(sms);
+ goto rollback;
+ }
+ sms_free(sms);
+ }
+ dbi_result_free(result);
+
+ /* Remove the temporary table */
+ result = dbi_conn_query(conn, "DROP TABLE SMS_5");
+ if (!result) {
+ LOGP(DDB, LOGL_ERROR,
+ "Failed to drop the old SMS table (upgrade from rev 5)\n");
+ goto rollback;
+ }
+ dbi_result_free(result);
+
+ /* We're done, bump DB Meta revision */
+ result = dbi_conn_query(conn,
+ "UPDATE Meta "
+ "SET value = '6' "
+ "WHERE key = 'revision'");
+ if (!result) {
+ LOGP(DDB, LOGL_ERROR,
+ "Failed to update DB schema revision (upgrade from rev 5)\n");
+ goto rollback;
+ }
+ dbi_result_free(result);
+
+ result = dbi_conn_query(conn, "COMMIT TRANSACTION");
+ if (!result) {
+ LOGP(DDB, LOGL_ERROR,
+ "Failed to commit the transaction (upgrade from rev 5)\n");
+ return -EINVAL;
+ } else {
+ dbi_result_free(result);
+ }
+
+ /* Shrink DB file size by actually wiping out SMS_4 table data */
+ result = dbi_conn_query(conn, "VACUUM");
+ if (!result)
+ LOGP(DDB, LOGL_ERROR,
+ "VACUUM failed. Ignoring it (upgrade from rev 5)\n");
+ else
+ dbi_result_free(result);
+
+ return 0;
+
+rollback:
+ result = dbi_conn_query(conn, "ROLLBACK TRANSACTION");
+ if (!result)
+ LOGP(DDB, LOGL_ERROR, "Rollback failed (upgrade from rev 5)\n");
+ else
+ dbi_result_free(result);
+ return -EINVAL;
+}
+
static int check_db_revision(void)
{
dbi_result result;
@@ -603,6 +729,10 @@
case 4:
if (update_db_revision_4())
goto error;
+ /* fall through */
+ case 5:
+ if (update_db_revision_5())
+ goto error;
/* The end of waterfall */
break;
--
To view, visit https://gerrit.osmocom.org/13632
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I747a795ca486f3fcfa7583c5ab8aa2aee07a8ec2
Gerrit-Change-Number: 13632
Gerrit-PatchSet: 1
Gerrit-Owner: Vadim Yanitskiy <axilirator at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190414/6ec734a4/attachment.htm>