aboutsummaryrefslogtreecommitdiff
path: root/assets/interlocking.html.LyXconv/interlocking.css
blob: 461af3cea79cdbbc0962b8acf1f31e632fe674dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
 
/* start css.sty */
.ecsx-1728{font-size:170%; font-weight: bold;}
.ecsx-1728{ font-weight: bold;}
.ecsx-1728{ font-weight: bold;}
.ecsx-1728{ font-weight: bold;}
.ecsx-1728{ font-weight: bold;}
.ecsx-1728{ font-weight: bold;}
.ecsx-1728{ font-weight: bold;}
.ecsx-1728{ font-weight: bold;}
.ecst-1440{font-size:140%;}
.ecsx-1200{font-size:120%; font-weight: bold;}
.ecsx-1200{ font-weight: bold;}
.ecsx-1200{ font-weight: bold;}
.ecsx-1200{ font-weight: bold;}
.ecsx-1200{ font-weight: bold;}
.ecsx-1200{ font-weight: bold;}
.ecsx-1200{ font-weight: bold;}
.ecsx-1200{ font-weight: bold;}
.ecsx-1000{ font-weight: bold;}
.ecsx-1000{ font-weight: bold;}
.ecsx-1000{ font-weight: bold;}
.ecsx-1000{ font-weight: bold;}
.ecsx-1000{ font-weight: bold;}
.ecsx-1000{ font-weight: bold;}
.ecsx-1000{ font-weight: bold;}
.ecsx-1000{ font-weight: bold;}
.ecbx-1000{ font-weight: bold;}
.ecbx-1000{ font-weight: bold;}
.ecbx-1000{ font-weight: bold;}
.ecbx-1000{ font-weight: bold;}
.ecbx-1000{ font-weight: bold;}
.ecbx-1000{ font-weight: bold;}
.ecbx-1000{ font-weight: bold;}
.ecbx-1000{ font-weight: bold;}
.ecti-1000{ font-style: italic;}
.ecti-1000{ font-style: italic;}
.ecti-1000{ font-style: italic;}
.ecti-1000{ font-style: italic;}
.ecti-1000{ font-style: italic;}
.ecti-1000{ font-style: italic;}
.ecti-1000{ font-style: italic;}
.ecti-1000{ font-style: italic;}
.ectt-1000{ font-family: monospace;}
.ectt-1000{ font-family: monospace;}
.ectt-1000{ font-family: monospace;}
.ectt-1000{ font-family: monospace;}
.ectt-1000{ font-family: monospace;}
.ectt-1000{ font-family: monospace;}
.ectt-1000{ font-family: monospace;}
.ectt-1000{ font-family: monospace;}
p.noindent { text-indent: 0em }
td p.noindent { text-indent: 0em; margin-top:0em; }
p.nopar { text-indent: 0em; }
p.indent{ text-indent: 1.5em }
@media print {div.crosslinks {visibility:hidden;}}
a img { border-top: 0; border-left: 0; border-right: 0; }
center { margin-top:1em; margin-bottom:1em; }
td center { margin-top:0em; margin-bottom:0em; }
.Canvas { position:relative; }
img.math{vertical-align:middle;}
li p.indent { text-indent: 0em }
li p:first-child{ margin-top:0em; }
li p:last-child, li div:last-child { margin-bottom:0.5em; }
li p~ul:last-child, li p~ol:last-child{ margin-bottom:0.5em; }
.enumerate1 {list-style-type:decimal;}
.enumerate2 {list-style-type:lower-alpha;}
.enumerate3 {list-style-type:lower-roman;}
.enumerate4 {list-style-type:upper-alpha;}
div.newtheorem { margin-bottom: 2em; margin-top: 2em;}
.obeylines-h,.obeylines-v {white-space: nowrap; }
div.obeylines-v p { margin-top:0; margin-bottom:0; }
.overline{ text-decoration:overline; }
.overline img{ border-top: 1px solid black; }
td.displaylines {text-align:center; white-space:nowrap;}
.centerline {text-align:center;}
.rightline {text-align:right;}
div.verbatim {font-family: monospace; white-space: nowrap; text-align:left; clear:both; }
.fbox {padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
div.fbox {display:table}
div.center div.fbox {text-align:center; clear:both; padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
div.minipage{width:100%;}
div.center, div.center div.center {text-align: center; margin-left:1em; margin-right:1em;}
div.center div {text-align: left;}
div.flushright, div.flushright div.flushright {text-align: right;}
div.flushright div {text-align: left;}
div.flushleft {text-align: left;}
.underline{ text-decoration:underline; }
.underline img{ border-bottom: 1px solid black; margin-bottom:1pt; }
.framebox-c, .framebox-l, .framebox-r { padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
.framebox-c {text-align:center;}
.framebox-l {text-align:left;}
.framebox-r {text-align:right;}
span.thank-mark{ vertical-align: super }
span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; }
div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; }
table.tabular td p{margin-top:0em;}
table.tabular {margin-left: auto; margin-right: auto;}
td p:first-child{ margin-top:0em; }
td p:last-child{ margin-bottom:0em; }
div.td00{ margin-left:0pt; margin-right:0pt; }
div.td01{ margin-left:0pt; margin-right:5pt; }
div.td10{ margin-left:5pt; margin-right:0pt; }
div.td11{ margin-left:5pt; margin-right:5pt; }
table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; }
td.td00{ padding-left:0pt; padding-right:0pt; }
td.td01{ padding-left:0pt; padding-right:5pt; }
td.td10{ padding-left:5pt; padding-right:0pt; }
td.td11{ padding-left:5pt; padding-right:5pt; }
table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; }
.hline hr, .cline hr{ height : 1px; margin:0px; }
.tabbing-right {text-align:right;}
span.TEX {letter-spacing: -0.125em; }
span.TEX span.E{ position:relative;top:0.5ex;left:-0.0417em;}
a span.TEX span.E {text-decoration: none; }
span.LATEX span.A{ position:relative; top:-0.5ex; left:-0.4em; font-size:85%;}
span.LATEX span.TEX{ position:relative; left: -0.4em; }
div.float, div.figure {margin-left: auto; margin-right: auto;}
div.float img {text-align:center;}
div.figure img {text-align:center;}
.marginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;}
.marginpar p{margin-top:0.4em; margin-bottom:0.4em;}
table.equation {width:100%;}
.equation td{text-align:center; }
td.equation { margin-top:1em; margin-bottom:1em; } 
td.equation-label { width:5%; text-align:center; }
td.eqnarray4 { width:5%; white-space: normal; }
td.eqnarray2 { width:5%; }
table.eqnarray-star, table.eqnarray {width:100%;}
div.eqnarray{text-align:center;}
div.array {text-align:center;}
div.pmatrix {text-align:center;}
table.pmatrix {width:100%;}
span.pmatrix img{vertical-align:middle;}
div.pmatrix {text-align:center;}
table.pmatrix {width:100%;}
span.bar-css {text-decoration:overline;}
img.cdots{vertical-align:middle;}
.figure img.graphics {margin-left:10%;}
/* end css.sty */

lass="hl opt">::endl; std::string txt_filename = world_path + DIR_DELIM "rollback.txt"; std::string migrating_flag = txt_filename + ".migrating"; database_path = world_path + DIR_DELIM "rollback.sqlite"; initDatabase(); if (fs::PathExists(txt_filename) && (fs::PathExists(migrating_flag) || !fs::PathExists(database_path))) { std::ofstream of(migrating_flag.c_str()); of.close(); migrate(txt_filename); fs::DeleteSingleFileOrEmptyDirectory(migrating_flag); } } RollbackManager::~RollbackManager() { SQLOK(sqlite3_finalize(stmt_insert)); SQLOK(sqlite3_finalize(stmt_replace)); SQLOK(sqlite3_finalize(stmt_select)); SQLOK(sqlite3_finalize(stmt_select_range)); SQLOK(sqlite3_finalize(stmt_select_withActor)); SQLOK(sqlite3_finalize(stmt_knownActor_select)); SQLOK(sqlite3_finalize(stmt_knownActor_insert)); SQLOK(sqlite3_finalize(stmt_knownNode_select)); SQLOK(sqlite3_finalize(stmt_knownNode_insert)); SQLOK(sqlite3_close(db)); } void RollbackManager::registerNewActor(const int id, const std::string &name) { Entity actor = {id, name}; knownActors.push_back(actor); } void RollbackManager::registerNewNode(const int id, const std::string &name) { Entity node = {id, name}; knownNodes.push_back(node); } int RollbackManager::getActorId(const std::string &name) { for (std::vector<Entity>::const_iterator iter = knownActors.begin(); iter != knownActors.end(); ++iter) { if (iter->name == name) { return iter->id; } } SQLOK(sqlite3_bind_text(stmt_knownActor_insert, 1, name.c_str(), name.size(), NULL)); SQLRES(sqlite3_step(stmt_knownActor_insert), SQLITE_DONE); SQLOK(sqlite3_reset(stmt_knownActor_insert)); int id = sqlite3_last_insert_rowid(db); registerNewActor(id, name); return id; } int RollbackManager::getNodeId(const std::string &name) { for (std::vector<Entity>::const_iterator iter = knownNodes.begin(); iter != knownNodes.end(); ++iter) { if (iter->name == name) { return iter->id; } } SQLOK(sqlite3_bind_text(stmt_knownNode_insert, 1, name.c_str(), name.size(), NULL)); SQLRES(sqlite3_step(stmt_knownNode_insert), SQLITE_DONE); SQLOK(sqlite3_reset(stmt_knownNode_insert)); int id = sqlite3_last_insert_rowid(db); registerNewNode(id, name); return id; } const char * RollbackManager::getActorName(const int id) { for (std::vector<Entity>::const_iterator iter = knownActors.begin(); iter != knownActors.end(); ++iter) { if (iter->id == id) { return iter->name.c_str(); } } return ""; } const char * RollbackManager::getNodeName(const int id) { for (std::vector<Entity>::const_iterator iter = knownNodes.begin(); iter != knownNodes.end(); ++iter) { if (iter->id == id) { return iter->name.c_str(); } } return ""; } bool RollbackManager::createTables() { SQLOK(sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS `actor` (\n" " `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" " `name` TEXT NOT NULL\n" ");\n" "CREATE TABLE IF NOT EXISTS `node` (\n" " `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" " `name` TEXT NOT NULL\n" ");\n" "CREATE TABLE IF NOT EXISTS `action` (\n" " `id` INTEGER PRIMARY KEY AUTOINCREMENT,\n" " `actor` INTEGER NOT NULL,\n" " `timestamp` TIMESTAMP NOT NULL,\n" " `type` INTEGER NOT NULL,\n" " `list` TEXT,\n" " `index` INTEGER,\n" " `add` INTEGER,\n" " `stackNode` INTEGER,\n" " `stackQuantity` INTEGER,\n" " `nodeMeta` INTEGER,\n" " `x` INT,\n" " `y` INT,\n" " `z` INT,\n" " `oldNode` INTEGER,\n" " `oldParam1` INTEGER,\n" " `oldParam2` INTEGER,\n" " `oldMeta` TEXT,\n" " `newNode` INTEGER,\n" " `newParam1` INTEGER,\n" " `newParam2` INTEGER,\n" " `newMeta` TEXT,\n" " `guessedActor` INTEGER,\n" " FOREIGN KEY (`actor`) REFERENCES `actor`(`id`),\n" " FOREIGN KEY (`stackNode`) REFERENCES `node`(`id`),\n" " FOREIGN KEY (`oldNode`) REFERENCES `node`(`id`),\n" " FOREIGN KEY (`newNode`) REFERENCES `node`(`id`)\n" ");\n" "CREATE INDEX IF NOT EXISTS `actionActor` ON `action`(`actor`);\n" "CREATE INDEX IF NOT EXISTS `actionTimestamp` ON `action`(`timestamp`);\n", NULL, NULL, NULL)); verbosestream << "SQL Rollback: SQLite3 database structure was created" << std::endl; return true; } void RollbackManager::initDatabase() { verbosestream << "RollbackManager: Database connection setup" << std::endl; bool needsCreate = !fs::PathExists(database_path); SQLOK(sqlite3_open_v2(database_path.c_str(), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)); if (needsCreate) { createTables(); } SQLOK(sqlite3_prepare_v2(db, "INSERT INTO `action` (\n" " `actor`, `timestamp`, `type`,\n" " `list`, `index`, `add`, `stackNode`, `stackQuantity`, `nodeMeta`,\n" " `x`, `y`, `z`,\n" " `oldNode`, `oldParam1`, `oldParam2`, `oldMeta`,\n" " `newNode`, `newParam1`, `newParam2`, `newMeta`,\n" " `guessedActor`\n" ") VALUES (\n" " ?, ?, ?,\n" " ?, ?, ?, ?, ?, ?,\n" " ?, ?, ?,\n" " ?, ?, ?, ?,\n" " ?, ?, ?, ?,\n" " ?" ");", -1, &stmt_insert, NULL)); SQLOK(sqlite3_prepare_v2(db, "REPLACE INTO `action` (\n" " `actor`, `timestamp`, `type`,\n" " `list`, `index`, `add`, `stackNode`, `stackQuantity`, `nodeMeta`,\n" " `x`, `y`, `z`,\n" " `oldNode`, `oldParam1`, `oldParam2`, `oldMeta`,\n" " `newNode`, `newParam1`, `newParam2`, `newMeta`,\n" " `guessedActor`, `id`\n" ") VALUES (\n" " ?, ?, ?,\n" " ?, ?, ?, ?, ?, ?,\n" " ?, ?, ?,\n" " ?, ?, ?, ?,\n" " ?, ?, ?, ?,\n" " ?, ?\n" ");", -1, &stmt_replace, NULL)); SQLOK(sqlite3_prepare_v2(db, "SELECT\n" " `actor`, `timestamp`, `type`,\n" " `list`, `index`, `add`, `stackNode`, `stackQuantity`, `nodemeta`,\n" " `x`, `y`, `z`,\n" " `oldNode`, `oldParam1`, `oldParam2`, `oldMeta`,\n" " `newNode`, `newParam1`, `newParam2`, `newMeta`,\n" " `guessedActor`\n" " FROM `action`\n" " WHERE `timestamp` >= ?\n" " ORDER BY `timestamp` DESC, `id` DESC", -1, &stmt_select, NULL)); SQLOK(sqlite3_prepare_v2(db, "SELECT\n" " `actor`, `timestamp`, `type`,\n" " `list`, `index`, `add`, `stackNode`, `stackQuantity`, `nodemeta`,\n" " `x`, `y`, `z`,\n" " `oldNode`, `oldParam1`, `oldParam2`, `oldMeta`,\n" " `newNode`, `newParam1`, `newParam2`, `newMeta`,\n" " `guessedActor`\n" "FROM `action`\n" "WHERE `timestamp` >= ?\n" " AND `x` IS NOT NULL\n" " AND `y` IS NOT NULL\n" " AND `z` IS NOT NULL\n" " AND `x` BETWEEN ? AND ?\n" " AND `y` BETWEEN ? AND ?\n" " AND `z` BETWEEN ? AND ?\n" "ORDER BY `timestamp` DESC, `id` DESC\n" "LIMIT 0,?", -1, &stmt_select_range, NULL)); SQLOK(sqlite3_prepare_v2(db, "SELECT\n" " `actor`, `timestamp`, `type`,\n" " `list`, `index`, `add`, `stackNode`, `stackQuantity`, `nodemeta`,\n" " `x`, `y`, `z`,\n" " `oldNode`, `oldParam1`, `oldParam2`, `oldMeta`,\n" " `newNode`, `newParam1`, `newParam2`, `newMeta`,\n" " `guessedActor`\n" "FROM `action`\n" "WHERE `timestamp` >= ?\n" " AND `actor` = ?\n" "ORDER BY `timestamp` DESC, `id` DESC\n", -1, &stmt_select_withActor, NULL)); SQLOK(sqlite3_prepare_v2(db, "SELECT `id`, `name` FROM `actor`", -1, &stmt_knownActor_select, NULL)); SQLOK(sqlite3_prepare_v2(db, "INSERT INTO `actor` (`name`) VALUES (?)", -1, &stmt_knownActor_insert, NULL)); SQLOK(sqlite3_prepare_v2(db, "SELECT `id`, `name` FROM `node`", -1, &stmt_knownNode_select, NULL)); SQLOK(sqlite3_prepare_v2(db, "INSERT INTO `node` (`name`) VALUES (?)", -1, &stmt_knownNode_insert, NULL)); verbosestream << "SQL prepared statements setup correctly" << std::endl; while (sqlite3_step(stmt_knownActor_select) == SQLITE_ROW) { registerNewActor( sqlite3_column_int(stmt_knownActor_select, 0), reinterpret_cast<const char *>(sqlite3_column_text(stmt_knownActor_select, 1)) ); } SQLOK(sqlite3_reset(stmt_knownActor_select)); while (sqlite3_step(stmt_knownNode_select) == SQLITE_ROW) { registerNewNode( sqlite3_column_int(stmt_knownNode_select, 0), reinterpret_cast<const char *>(sqlite3_column_text(stmt_knownNode_select, 1)) ); } SQLOK(sqlite3_reset(stmt_knownNode_select)); } bool RollbackManager::registerRow(const ActionRow & row) { sqlite3_stmt * stmt_do = (row.id) ? stmt_replace : stmt_insert; bool nodeMeta = false; SQLOK(sqlite3_bind_int (stmt_do, 1, row.actor)); SQLOK(sqlite3_bind_int64(stmt_do, 2, row.timestamp)); SQLOK(sqlite3_bind_int (stmt_do, 3, row.type)); if (row.type == RollbackAction::TYPE_MODIFY_INVENTORY_STACK) { const std::string & loc = row.location; nodeMeta = (loc.substr(0, 9) == "nodemeta:"); SQLOK(sqlite3_bind_text(stmt_do, 4, row.list.c_str(), row.list.size(), NULL)); SQLOK(sqlite3_bind_int (stmt_do, 5, row.index)); SQLOK(sqlite3_bind_int (stmt_do, 6, row.add)); SQLOK(sqlite3_bind_int (stmt_do, 7, row.stack.id)); SQLOK(sqlite3_bind_int (stmt_do, 8, row.stack.count)); SQLOK(sqlite3_bind_int (stmt_do, 9, (int) nodeMeta)); if (nodeMeta) { std::string::size_type p1, p2; p1 = loc.find(':') + 1; p2 = loc.find(','); std::string x = loc.substr(p1, p2 - p1); p1 = p2 + 1; p2 = loc.find(',', p1); std::string y = loc.substr(p1, p2 - p1); std::string z = loc.substr(p2 + 1); SQLOK(sqlite3_bind_int(stmt_do, 10, atoi(x.c_str()))); SQLOK(sqlite3_bind_int(stmt_do, 11, atoi(y.c_str()))); SQLOK(sqlite3_bind_int(stmt_do, 12, atoi(z.c_str()))); } } else { SQLOK(sqlite3_bind_null(stmt_do, 4)); SQLOK(sqlite3_bind_null(stmt_do, 5)); SQLOK(sqlite3_bind_null(stmt_do, 6)); SQLOK(sqlite3_bind_null(stmt_do, 7)); SQLOK(sqlite3_bind_null(stmt_do, 8)); SQLOK(sqlite3_bind_null(stmt_do, 9)); } if (row.type == RollbackAction::TYPE_SET_NODE) { SQLOK(sqlite3_bind_int (stmt_do, 10, row.x)); SQLOK(sqlite3_bind_int (stmt_do, 11, row.y)); SQLOK(sqlite3_bind_int (stmt_do, 12, row.z)); SQLOK(sqlite3_bind_int (stmt_do, 13, row.oldNode)); SQLOK(sqlite3_bind_int (stmt_do, 14, row.oldParam1)); SQLOK(sqlite3_bind_int (stmt_do, 15, row.oldParam2)); SQLOK(sqlite3_bind_text(stmt_do, 16, row.oldMeta.c_str(), row.oldMeta.size(), NULL)); SQLOK(sqlite3_bind_int (stmt_do, 17, row.newNode)); SQLOK(sqlite3_bind_int (stmt_do, 18, row.newParam1)); SQLOK(sqlite3_bind_int (stmt_do, 19, row.newParam2)); SQLOK(sqlite3_bind_text(stmt_do, 20, row.newMeta.c_str(), row.newMeta.size(), NULL)); SQLOK(sqlite3_bind_int (stmt_do, 21, row.guessed ? 1 : 0)); } else { if (!nodeMeta) { SQLOK(sqlite3_bind_null(stmt_do, 10)); SQLOK(sqlite3_bind_null(stmt_do, 11)); SQLOK(sqlite3_bind_null(stmt_do, 12)); } SQLOK(sqlite3_bind_null(stmt_do, 13)); SQLOK(sqlite3_bind_null(stmt_do, 14)); SQLOK(sqlite3_bind_null(stmt_do, 15)); SQLOK(sqlite3_bind_null(stmt_do, 16)); SQLOK(sqlite3_bind_null(stmt_do, 17)); SQLOK(sqlite3_bind_null(stmt_do, 18)); SQLOK(sqlite3_bind_null(stmt_do, 19)); SQLOK(sqlite3_bind_null(stmt_do, 20)); SQLOK(sqlite3_bind_null(stmt_do, 21)); } if (row.id) { SQLOK(sqlite3_bind_int(stmt_do, 22, row.id)); } int written = sqlite3_step(stmt_do); SQLOK(sqlite3_reset(stmt_do)); return written == SQLITE_DONE; } const std::list<ActionRow> RollbackManager::actionRowsFromSelect(sqlite3_stmt* stmt) { std::list<ActionRow> rows; const unsigned char * text; size_t size; while (sqlite3_step(stmt) == SQLITE_ROW) { ActionRow row; row.actor = sqlite3_column_int (stmt, 0); row.timestamp = sqlite3_column_int64(stmt, 1); row.type = sqlite3_column_int (stmt, 2); if (row.type == RollbackAction::TYPE_MODIFY_INVENTORY_STACK) { text = sqlite3_column_text (stmt, 3); size = sqlite3_column_bytes(stmt, 3); row.list = std::string(reinterpret_cast<const char*>(text), size); row.index = sqlite3_column_int(stmt, 4); row.add = sqlite3_column_int(stmt, 5); row.stack.id = sqlite3_column_int(stmt, 6); row.stack.count = sqlite3_column_int(stmt, 7); row.nodeMeta = sqlite3_column_int(stmt, 8); } if (row.type == RollbackAction::TYPE_SET_NODE || row.nodeMeta) { row.x = sqlite3_column_int(stmt, 9); row.y = sqlite3_column_int(stmt, 10); row.z = sqlite3_column_int(stmt, 11); } if (row.type == RollbackAction::TYPE_SET_NODE) { row.oldNode = sqlite3_column_int(stmt, 12); row.oldParam1 = sqlite3_column_int(stmt, 13); row.oldParam2 = sqlite3_column_int(stmt, 14); text = sqlite3_column_text (stmt, 15); size = sqlite3_column_bytes(stmt, 15); row.oldMeta = std::string(reinterpret_cast<const char*>(text), size); row.newNode = sqlite3_column_int(stmt, 16); row.newParam1 = sqlite3_column_int(stmt, 17); row.newParam2 = sqlite3_column_int(stmt, 18); text = sqlite3_column_text(stmt, 19); size = sqlite3_column_bytes(stmt, 19); row.newMeta = std::string(reinterpret_cast<const char*>(text), size); row.guessed = sqlite3_column_int(stmt, 20); } if (row.nodeMeta) { row.location = "nodemeta:"; row.location += itos(row.x); row.location += ',';