Scroll to navigation

GAMMU-SMSD-SQL(7) Gammu GAMMU-SMSD-SQL(7)

NAME

gammu-smsd-sql - gammu-smsd(1) backend using SQL abstraction layer to use any supported database as a message storage

DESCRIPTION

SQL service stores all its data in database. It can use one of these SQL backends (configuration option Driver <#option-Driver> in smsd section):

  • native_mysql for MySQL Backend <#gammu-smsd-mysql>
  • native_pgsql for PostgreSQL Backend <#gammu-smsd-pgsql>
  • odbc for ODBC Backend <#gammu-smsd-odbc>
  • sqlite3 - for SQLite 3
  • mysql - for MySQL
  • pgsql - for PostgeSQL
  • freetds - for MS SQL Server or Sybase



SQL CONNECTION PARAMETERS

Common for all backends:

  • User <#option-User> - user connecting to database
  • Password <#option-Password> - password for connecting to database
  • Host <#option-Host> - database host or data source name
  • Database <#option-Database> - database name
  • Driver <#option-Driver> - native_mysql, native_pgsql, odbc or DBI one
  • SQL <#option-SQL> - SQL dialect to use

Specific for DBI:

  • DriversPath <#option-DriversPath> - path to DBI drivers
  • DBDir <#option-DBDir> - sqlite/sqlite3 directory with database

See also:

The variables are fully described in Gammu Configuration File <#gammurc> documentation.


TABLES

Added in version 1.37.1.

You can customize name of all tables in the [tables] <#section-[tables]>. The SQL queries will reflect this, so it's enough to change table name in this section.

Name of the gammu <#gammu-table> table.

Name of the inbox <#inbox> table.

Name of the sentitems <#sentitems> table.

Name of the outbox <#outbox> table.

Name of the outbox_multipart <#outbox-multipart> table.

Name of the phones <#phones> table.

You can change any table name using these:

[tables]
inbox = special_inbox


SQL QUERIES

Almost all queries are configurable. You can edit them in [sql] <#section-[sql]> section. There are several variables used in SQL queries. We can separate them into three groups:

  • phone specific, which can be used in every query, see Phone Specific Parameters
  • SMS specific, which can be used in queries which works with SMS messages, see SMS Specific Parameters
  • query specific, which are numeric and are specific only for given query (or set of queries), see Configurable queries

Phone Specific Parameters

%I
IMEI of phone
%S
SIM IMSI
%P
PHONE ID (hostname)
%N
client name (eg. Gammu 1.12.3)
%O
network code
%M
network name

SMS Specific Parameters

%R
remote number [1]
%C
delivery datetime
%e
delivery status on receiving or status error on sending
%t
message reference
%d
receiving datetime for received sms
%E
encoded text of SMS
%c
SMS coding (ie 8bit or UnicodeNoCompression)
%F
sms centre number
%u
UDH header
%x
class
%T
decoded SMS text
%A
CreatorID of SMS (sending sms)
%V
relative validity

[1]
Sender number for received messages (insert to inbox or delivery notifications), destination otherwise.

CONFIGURABLE QUERIES

All configurable queries can be set in [sql] <#section-[sql]> section. Sequence of rows in selects are mandatory.

All default queries noted here are noted for MySQL. Actual time and time addition are selected for default queries during initialization.

Deletes phone from database.

Default value:

DELETE FROM phones WHERE IMEI = %I



Inserts phone to database.

Default value:

INSERT INTO phones (IMEI, IMSI, ID, NetCode, NetName, Send, Receive,

InsertIntoDB, TimeOut, Client, Battery, Signal) VALUES (%I, %S, %P, %O, %M, %1, %2, NOW(),
(NOW() + INTERVAL 70 SECOND) + 0, %N, -1, -1)


The shown 70-second expiry uses the default 60-second StatusFrequency <#option-StatusFrequency> plus a ten-second grace period. The generated default query follows the configured frequency. Custom queries should provide an equivalent expiry interval.

Query specific parameters:

%1
enable send (yes or no) - configuration option Send
%2
enable receive (yes or no) - configuration option Receive


Select message for update delivery status.

Default value:

SELECT ID, Status, SendingDateTime, DeliveryDateTime, SMSCNumber FROM sentitems
WHERE DeliveryDateTime IS NULL AND SenderID = %P AND TPMR = %t AND DestinationNumber = %R



Update message delivery status if message was delivered.

Default value:

UPDATE sentitems SET DeliveryDateTime = %C, Status = %1, StatusError = %e WHERE ID = %2 AND TPMR = %t


Query specific parameters:

%1
delivery status returned by GSM network
%2
ID of message


Update message if there is an delivery error.

Default value:

UPDATE sentitems SET Status = %1, StatusError = %e WHERE ID = %2 AND TPMR = %t


Query specific parameters:

%1
delivery status returned by GSM network
%2
ID of message


Insert received message.

Default value:

INSERT INTO inbox (ReceivingDateTime, InsertIntoDB, Text, SenderNumber, Coding,
SMSCNumber, UDH, Class, TextDecoded, RecipientID, Status, MessageID,
SequencePosition, PartCount, Processed)
VALUES (%d, NOW(), %E, %R, %c, %F, %u, %x, %T, %P, %e, %1, %2, %3, %4)


Query specific parameters:

%1
logical message identifier, or 0 until the first physical row ID is known
%2
sequence position of this physical part
%3
expected number of physical parts
%4
initial processed state; received rows are staged as processed until their logical message identifier is finalized

Custom queries must store the database server's current timestamp in InsertIntoDB so incomplete multipart groups can be restored without extending their original timeout.


Finalize the logical message identifier and multipart metadata, then publish the received physical message to inbox consumers.

Default value:

UPDATE inbox SET MessageID = %1, SequencePosition = %2, PartCount = %3,
Processed = %5 WHERE ID = %4


Query specific parameters:

%1
ID of the first stored physical part of the logical message
%2
sequence position of this physical part
%3
expected number of physical parts
%4
ID of this physical part
%5
final processed state; false publishes the completed row


Restore incomplete multipart groups after SMSD restarts. The default query selects recently inserted multipart rows for the current phone, including earlier rows sharing their logical message identifier. SMSD discards complete and expired groups after reading the result.

The selected columns must remain in the documented order. The final column is the row age in seconds, calculated by the database so that restoration does not depend on the SMSD host and database server sharing a timezone.

Default value:

SELECT MessageID, SenderNumber, SMSCNumber, UDH, SequencePosition,
PartCount, TIMESTAMPDIFF(SECOND, InsertIntoDB, NOW()) FROM inbox WHERE
PartCount > 1 AND RecipientID = %P AND MessageID IN (SELECT MessageID
FROM inbox WHERE PartCount > 1 AND RecipientID = %P AND
InsertIntoDB >= NOW() - INTERVAL 600 SECOND)
ORDER BY InsertIntoDB ASC, ID ASC



Update statistics after receiving message.

Default value:

UPDATE phones SET Received = Received + 1 WHERE IMEI = %I



Update messages in outbox.

Default value:

UPDATE outbox SET SendingTimeOut = (NOW() + INTERVAL 60 SECOND) + 0
WHERE ID = %1 AND (SendingTimeOut < NOW() OR SendingTimeOut IS NULL)


The default query calculates sending timeout based on LoopSleep <#option-LoopSleep> value.

Query specific parameters:

%1
ID of message


Find sms messages for sending.

Default value:

SELECT ID, InsertIntoDB, SendingDateTime, SenderID FROM outbox
WHERE SendingDateTime < NOW() AND SendingTimeOut <  NOW() AND
SendBefore >= CURTIME() AND SendAfter <= CURTIME() AND
(SendDays & %2) <> 0 AND
( SenderID is NULL OR SenderID = '' OR SenderID = %P )
ORDER BY Priority DESC, InsertIntoDB ASC LIMIT %1


Query specific parameters:

%1
limit of sms messages sended in one walk in loop
%2
bit mask for the current weekday in the SMSD process local timezone, using Monday as 1 through Sunday as 64

Custom queries need to use %2 to enforce the outbox <#outbox> SendDays restriction. The default bitwise expression is adapted to the configured SQL dialect.


Select body of message.

Default value:

SELECT Text, Coding, UDH, Class, TextDecoded, ID, DestinationNumber, MultiPart,
RelativeValidity, DeliveryReport, CreatorID FROM outbox WHERE ID=%1


Query specific parameters:

%1
ID of message


Select remaining parts of sms message.

Default value:

SELECT Text, Coding, UDH, Class, TextDecoded, ID, SequencePosition
FROM outbox_multipart WHERE ID=%1 AND SequencePosition=%2


Query specific parameters:

%1
ID of message
%2
Number of multipart message


Find an existing sent message before transmission. SMSD uses this to reconcile messages which were written to sentitems but not removed from outbox, for example when the daemon stopped between these two operations.

The selected columns and their order are mandatory. SMSD compares the stored message identity and payload with the outbox message. A matching successfully sent message is skipped; a different message using the same ID is left in the outbox and reported as a conflict.

Default value:

SELECT Text, Coding, UDH, Class, TextDecoded, DestinationNumber,
InsertIntoDB, RelativeValidity, CreatorID, Status
FROM sentitems WHERE ID=%1 AND SequencePosition=%2


Query specific parameters:

%1
ID of message
%2
Number of multipart message


Remove messages from outbox after threir successful send.

Default value:

DELETE FROM outbox WHERE ID=%1


Query specific parameters:

%1
ID of message


Remove messages from outbox_multipart after threir successful send.

Default value:

DELETE FROM outbox_multipart WHERE ID=%1


Query specific parameters:

%1
ID of message


Create message (insert to outbox).

Default value:

INSERT INTO outbox (CreatorID, SenderID, DeliveryReport, MultiPart,
InsertIntoDB, Text, DestinationNumber, RelativeValidity, Coding, UDH, Class,
TextDecoded) VALUES (%1, %P, %2, %3, NOW(), %E, %R, %V, %c, %u, %x, %T)


Query specific parameters:

%1
creator of message
%2
delivery status report - yes/default
%3
multipart - FALSE/TRUE
%4
Part (part number)
%5
ID of message


Create message remaining parts.

Default value:

INSERT INTO outbox_multipart (SequencePosition, Text, Coding, UDH, Class,
TextDecoded, ID) VALUES (%4, %E, %c, %u, %x, %T, %5)


Query specific parameters:

%1
creator of message
%2
delivery status report - yes/default
%3
multipart - FALSE/TRUE
%4
Part (part number)
%5
ID of message


Insert to sentitems.

Default value:

INSERT INTO sentitems (CreatorID,ID,SequencePosition,Status,SendingDateTime,
SMSCNumber, TPMR, SenderID,Text,DestinationNumber,Coding,UDH,Class,TextDecoded,
InsertIntoDB,RelativeValidity)
VALUES (%A, %1, %2, %3, NOW(), %F, %4, %P, %E, %R, %c, %u, %x, %T, %5, %V)


Query specific parameters:

%1
ID of sms message
%2
part number (for multipart sms)
%3
message state (SendingError, Error, SendingOK, SendingOKNoReport)
%4
message reference (TPMR)
%5
time when inserted in db


Update sent statistics after sending message.

Default value:

UPDATE phones SET Sent= Sent + 1 WHERE IMEI = %I



Update phone status (battery, signal, and network).

Default value:

UPDATE phones SET TimeOut = (NOW() + INTERVAL 70 SECOND) + 0,
Battery = %1, Signal = %2, NetCode = %O, NetName = %M
WHERE IMEI = %I


The expiry interval is generated from StatusFrequency <#option-StatusFrequency> plus a ten-second grace period, as described for insert_phone. Custom queries should keep TimeOut valid through the next refresh.

Query specific parameters:

%1
battery percent
%2
signal percent


Update number of retries for outbox message. The interval can be configured by RetryTimeout <#option-RetryTimeout>.

UPDATE outbox SET SendngTimeOut = (NOW() + INTERVAL 600 SECOND) + 0,
Retries = %2 WHERE ID = %1


Query specific parameters:

%1
message ID
%2
number of retries


Author

Michal Čihař <michal@cihar.com>

Copyright

2009-2015, Michal Čihař <michal@cihar.com>

August 4, 2026 1.44.0