// Import data. void Database_Versifications::input (const string& contents, const string& name) { // Delete old system if it is there, and create new one. erase (name); int id = createSystem (name); sqlite3 * db = connect (); database_sqlite_exec (db, "PRAGMA temp_store = MEMORY;"); database_sqlite_exec (db, "PRAGMA synchronous = OFF;"); database_sqlite_exec (db, "PRAGMA journal_mode = OFF;"); database_sqlite_exec (db, "BEGIN;"); vector <string> lines = filter_string_explode (contents, '\n'); for (auto line : lines) { line = filter_string_trim (line); if (line.empty ()) continue; Passage passage = filter_passage_explode_passage (line); if ((passage.book == 0) || (passage.chapter == 0) || (passage.verse.empty ())) { Database_Logs::log ("Malformed versification entry: " + line); continue; } SqliteSQL sql = SqliteSQL (); sql.add ("INSERT INTO data (system, book, chapter, verse) VALUES ("); sql.add (id); sql.add (","); sql.add (passage.book); sql.add (","); sql.add (passage.chapter); sql.add (","); sql.add (convert_to_int (passage.verse)); sql.add (");"); database_sqlite_exec (db, sql.sql); } database_sqlite_exec (db, "COMMIT;"); database_sqlite_disconnect (db); }
// Takes the passage in $rawPassage, and tries to interpret it. // The following situations can occur: // - Only book given, e.g. "Genesis". // - One number given, e.g. "10". // - Two numbers given, e.g. "1 2". // - Book and one number given, e.g. "Exodus 10". // - Book and two numbers given, e.g. "Song of Solomon 2 3". // It deals with these situations. // If needed, it bases the interpreted passage on $currentPassage. Passage filter_passage_interpret_passage (Passage currentPassage, string rawPassage) { rawPassage = filter_passage_clean_passage (rawPassage); // Create an array with the bits of the raw input. vector <string> input = filter_string_explode (rawPassage, ' '); // Go through the array from verse to chapter to book. // Check how many numerals it has after the book part. vector <int> numerals; string book = ""; vector <string> invertedInput (input.begin(), input.end ()); reverse (invertedInput.begin (), invertedInput.end()); for (string & bit : invertedInput) { int integer = convert_to_int (bit); if (bit == convert_to_string (integer)) { numerals.push_back (integer); input.pop_back (); } else { book = filter_string_implode (input, " "); break; } } // Deal with: Only book given, e.g. "Genesis". if ((book != "") && (numerals.size () == 0)) { return filter_passage_explode_passage (book + " 1 1"); } // Deal with: One number given, e.g. "10". else if ((book == "") && (numerals.size () == 1)) { int bk = currentPassage.book; int chapter = currentPassage.chapter; string verse = convert_to_string (numerals [0]); Passage passage = filter_passage_explode_passage ("Unknown " + convert_to_string (chapter) + " " + verse); passage.book = bk; return passage; } // Deal with: Two numbers given, e.g. "1 2". else if ((book == "") && (numerals.size () == 2)) { int bk = currentPassage.book; int chapter = numerals [1]; string verse = convert_to_string (numerals [0]); Passage passage = filter_passage_explode_passage ("Unknown " + convert_to_string (chapter) + " " + verse); passage.book = bk; return passage; } // Deal with: Book and one number given, e.g. "Exodus 10". else if ((book != "") && (numerals.size () == 1)) { int chapter = numerals [0]; return filter_passage_explode_passage (book + " " + convert_to_string (chapter) + " 1"); } // Deal with: Book and two numbers given, e.g. "Song of Solomon 2 3". else if ((book != "") && (numerals.size () == 2)) { return filter_passage_explode_passage (rawPassage); } // Give up. return currentPassage; }