Esempio n. 1
0
// ========================================================================
// METHOD ::decode
// ========================================================================
void dbfile::decode (const string &outof, value &v)
{
	value tmp;
	string l, r;
	v.clear ();
	
	switch (encoding)
	{
		case shox:
			v.fromshox (outof);
			break;
		
		case attriblist: // fallthrough to valuelist
		case valuelist:
			v = strutil::splitquoted (outof, sep);
			break;
		
		case courierdb:
			tmp = strutil::split (outof, '|');
			foreach (word, tmp)
			{
				r = word;
				l = r.cutat ('=');
				v[l] = r;
			}
			break;
		
		default:
			v = outof;
			break;
	}
Esempio n. 2
0
bool sqlitehandle::query (const string &sql, value &into,
						  const statstring &indexby)
{
	sqlite3_stmt *qhandle;
	int qres;
	int rowcount=0;
	int colcount;
	int i;
	statstring curidx;
	bool done = false;
	
	into.clear ();
	
	if (sqlite3_prepare (hdl, sql.str(), sql.strlen(), &qhandle, 0) != SQLITE_OK)
	{
		errcode = 1;
		errstr = "Could not prepare: %s" %format (sqlite3_errmsg(hdl));
		return false;
	}
	
	if (! (qres = sqlite3_step (qhandle)))
	{
		errcode = 1;
		errstr = "Error making first step: %s" %format (sqlite3_errmsg(hdl));
		sqlite3_finalize (qhandle);
		return false;
	}
	
	colcount = sqlite3_column_count (qhandle);
	if (colcount == 0)
	{
		into("rowschanged") = sqlite3_changes (hdl);
		sqlite3_finalize (qhandle);
		return true;
	}
	
	statstring colnames[colcount];
	value colidx;
	
	for (i=0; i<colcount; ++i)
	{
		colnames[i] = sqlite3_column_name (qhandle, i);
		colidx[colnames[i]] = i;
	}
	
	int indexfield = -1;
	if (colidx.exists (indexby)) indexfield = colidx[indexby];
	
	if (! done) do
	{
		switch (qres)
		{
			case SQLITE_BUSY:
				sleep (1);
				sqlite3_reset(qhandle);
				continue;
			
			case SQLITE_MISUSE: // achtung, fallthrough
			case SQLITE_ERROR:
				errcode = 1;
				errstr = "Error in sqlite3_step: %s" %format (sqlite3_errmsg(hdl));
				done = true;
				break;

			case SQLITE_DONE:
				done = true;
				break;
				
			case SQLITE_ROW:
				{
					if (indexfield>=0)
					{
						curidx = sqlite3_column_text (qhandle, indexfield);
					}
					
					value &myrow = (indexfield<0) ? into.newval() : into[curidx];
					
					for (int i=0; i<colcount; i++)
					{
						int ctype = sqlite3_column_type (qhandle, i);
						statstring &curcol = colnames[i];
						
						switch (ctype)
						{
							case SQLITE_INTEGER:
								myrow[curcol] = sqlite3_column_int (qhandle, i);
								break;
							
							case SQLITE_FLOAT:
								myrow[curcol] = sqlite3_column_double (qhandle, i);
								break;
							
							case SQLITE_BLOB:
								// FIXME: use sqlite3_column_blob
							case SQLITE_TEXT:
								myrow[curcol] = sqlite3_column_text (qhandle, i);
								break;
							
							default:
								break;
						}
					}
				}
				break;
				
		}
		rowcount++;
	} while ((qres = sqlite3_step (qhandle)) && !done);
	
	int finalize_result = sqlite3_finalize (qhandle);
	if (finalize_result != SQLITE_OK && finalize_result != SQLITE_SCHEMA)
	{
		errcode = 1;
		errstr = "Error finalizing: %s" %format (sqlite3_errmsg(hdl));
		return false;
	}
	
	into ("insertid") = sqlite3_last_insert_rowid (hdl);
	into.type (t_dict);
	string tmp = into.tojson();
	return true;
}