Enable Javascript


Last Arduino/ESP8266 project (click to open)

User Rating: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active
 


Information from header file:

// SimpleDB by Ewald Kendziorra sr, www.kendziorra.nl
// I use it with my Arduino NodeMCU v2 Shield
//
// SimpleDB is not writen as a real library, you can use it as a regular INO file.
//   Add the files 'db.ino' and 'db.h' to your own Arduino/ESP8266 project.
//   If desired, it is easy-to-edit.
//
//                 SIMPLE - FLEXIBLE - SMALL - QUICKLY? 
// Simple:   Create or Open a DB with only four parameters.
//           You do not create tables and fields.
// Flexible: One table with fixed record length and "flexible fields width".
//           We use the '|' char as field separator.
//           Records can be mixed with:
//            - "JSON"  style 'name|value|' fields
//            - "Table" style      'value|' fields
//           After reading a record we use tokenization to breaking 
//           the record data in fields.
//           (there is a simple JSON/Table style Parser in the demo.ino)
// Small:    ~2% of program storage space (NodeMCU v2/ESP8266-12E)
//           ~2% of dynamic memory
//           <250 lines off code
// Quickly?: sequential search, seek time to find the key on rec# 1000: ~280ms
// =================================================================================
//   initDb   | Create or Open the database with four values
//              (pin, dbFile, copyFile, max data width)
//   nrRec    | set 'int16_t dbR', the nummer of records
//              tombstone records are excluded
//   findRec  | key found? 'dbF.seek()' is set to the first byte of te record
//              sequential key search
//   addRec   | append a new record
//              auto update 'dbR'
//              if the key not exist then 'dbErr' is set, doubles are not allowed
//   writeRec | overwrite an existing record
//              if the key not exist then 'addRec()'
//   readRec  | find key in DB
//              if found then the record is in buffer 'char* dbB'
//   delRec   | mark a record as tombstone
//              auto update 'dbR'
//              delete tombstones with 'comprDb()'
//   listRec  | list DB to Serial
//              boolean data = false: list with keys
//              boolean data = true: list with keys and data
//   cmprDb   | copy the DB, then remove tombstone records (compress DB)
//   dbOpen   | test: SD and DB are open? if not: open SD and or DB
//   dbErr    | 'enum errCode{}'
//               _OK,         | no problems
//               SD_ERR,      | sd error
//               DB_EMPTY,    | no record(s) in db
//               MAX_REC,     | max records in db
//               MAX_CHARS,   | key or data: too many characters
//               REC_EXIST,   | record already exists
//               NOT_FOUND,   | record not found
//               REMOVE_ERR,  | delete file error
//               CORRUPT,     | db corrupt
//               DIF_NR,      | difference in number of records
//               NEW_ERR      | file not erased
// =================================================================================
// ################################################################################# 
// If the SD card is removed you'll have to restart the program (SD library problem)
// ################################################################################# 
// Max 32,767 records posible, but that is a lot for sequential search.
// Fields data: only chars, convert numbers to char* (use sprintf()).
// Keys fixed width: 3 chars, any combination of three characters is valid
//     (the fixed width can be changed in this header file)
//   For example:  000/999
//     or create a group code: a00/a99...z00/z99...A00\A99...Z00/Z99
//     I use 000/999 to save "program vars" and i use "group codes" for:
//       A(larm), G(arden), F(acade), M(ilieu) and R(ooms)
//   Keys must be UNIQUE, doubles are not allowed.
// Examples:
//   Use a '|' char as delimters between the fields and at the end of the string (use sprintf()).
//   After 'readRec()' parse string back in tokens with 'strtok_r()' (see Parser in the demo.ino).
//     char key[kyW + 1];      // (global var)  key string holder
//     char dataR[dataW + 1];  // (global var)  data string holder
//     enum {OFF, ON};         // (global enum) Room lamps: OFF or ON
//     strcpy(key, "R00");     // key: R(oom) #00
//     sprintf(dataR, "%s|%s|%s|%d|%s|%d|%s|%d|",  // format data string
//         "room", "Living",  // room name
//         "lamp1", OFF,      // is enum "0"
//         "lamp2", ON,       // is enum "1"
//         "dim2",  5);       // string in dataR = "room|Living|lamp1|0|lamp2|1|dim2|5|"
//     addRec(key, dataR);        // add record to DB
//   KEY: 3 chars (in next three examples: 'T00' - 'R00' - 't00')
//                     ** in JSON style: name|value, then you can use different field names **
//                     -----------------------------------------------------------------------
//                     max data width by example 50, trailing white spaces added in 'addRec()'
//   key               "T00"
//   data:             "tempIn|28.4|tempOut|11.1|time|1412345675|"
//   in db file: "T00|0|tempIn|28.4|tempOut|11.1|time|1412345675|   "< recEnd
//   key               "R00"
//   data:             "room|Living|lamp1|0|lamp2|1|dim2|5|"
//   in db file: "R00|0|room|Living|lamp1|0|lamp2|1|dim2|5|         "< recEnd
//                     ---------------------------------------------
//   can mixed with    ** Table style, fixed field names **
//   field names       (0):tempIn, (1):tempOut, (3):time
//                     ---------------------------------------------
//   key               "t00"
//   data:             "28.4|11.1|1412345675|"
//   in db file: "t00|0|28.4|11.1|1412345675|                       "< recEnd
//                    ^ = tombstone '|0|' marker (added by program)
// =================================================================================