package com.robert.maps.applib.tileprovider; import java.io.File; import org.andnav.osm.views.util.constants.OpenStreetMapViewConstants; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import com.robert.maps.applib.utils.RSQLiteOpenHelper; import com.robert.maps.applib.utils.Ut; public class TileProviderFileBase extends TileProviderBase { protected final SQLiteDatabase mIndexDatabase; private static final String DELETE_FROM_ListCashTables = "DELETE FROM 'ListCashTables' WHERE name LIKE ('%sqlitedb')"; private static final String INDEX_DB = "/index.db"; public TileProviderFileBase(Context ctx) { super(ctx); this.mIndexDatabase = getIndexDatabase(ctx); } @Override public void Free() { if(mIndexDatabase != null) mIndexDatabase.close(); super.Free(); } public boolean needIndex(final String aCashTableName, final long aSizeFile, final long aLastModifiedFile, final boolean aBlockIndexing) { if(this.mIndexDatabase == null) return false; this.mIndexDatabase.execSQL("CREATE TABLE IF NOT EXISTS ListCashTables (name VARCHAR(100), lastmodified LONG NOT NULL, size LONG NOT NULL, minzoom INTEGER NOT NULL, maxzoom INTEGER NOT NULL, PRIMARY KEY(name) );"); Cursor cur = null; cur = this.mIndexDatabase.rawQuery("SELECT COUNT(*) FROM ListCashTables", null); if (cur != null) { if (cur.getCount() > 0) { Ut.d("In table ListCashTables " + cur.getCount() + " records"); cur.close(); if(OpenStreetMapViewConstants.DEBUGMODE) { Ut.d("ListCashTables:"); cur = this.mIndexDatabase.rawQuery("SELECT name, minzoom, maxzoom, size, lastmodified FROM ListCashTables", null); if(cur != null) { if(cur.moveToFirst()) { do { Ut.d(""+cur.getString(0)+" " +cur.getInt(1)+" " +cur.getInt(2)+" " +cur.getLong(3)+" " +cur.getLong(4)+" " ); } while (cur.moveToNext()); } cur.close(); } } Ut.d("Check for aCashTableName = " + aCashTableName); cur = this.mIndexDatabase.rawQuery("SELECT size, lastmodified FROM ListCashTables WHERE lower(name) = lower('" + aCashTableName + "') OR lower(name) = lower('" + aCashTableName.replace("usermap_", "cahs_") + "')", null); if (cur.getCount() > 0) { cur.moveToFirst(); Ut.d("Record " + aCashTableName + " size = " + cur.getLong(cur.getColumnIndexOrThrow("size")) + " AND lastmodified = " + cur.getLong(cur.getColumnIndexOrThrow("lastmodified"))); Ut.d("File " + aCashTableName + " size = " + aSizeFile + " AND lastmodified = " + aLastModifiedFile); } else Ut.d("In table ListCashTables NO records for " + aCashTableName); cur.close(); } else { Ut.d("In table ListCashTables NO records"); cur.close(); } } else Ut.d("NO table ListCashTables in database"); Cursor c = null; c = this.mIndexDatabase.rawQuery("SELECT * FROM ListCashTables WHERE lower(name) = lower('" + aCashTableName + "') OR lower(name) = lower('" + aCashTableName.replace("usermap_", "cahs_") + "')", null); boolean res = false; if(c == null) return true; else if(c.moveToFirst() == false) res = true; else if(aBlockIndexing) res = false; else if (c.getLong(c.getColumnIndex("size")) != aSizeFile /*|| c.getLong(c.getColumnIndex("lastmodified")) != aLastModifiedFile*/) res = true; c.close(); return res; } public void CommitIndex(final String aCashTableName, long aSizeFile, long aLastModifiedFile, int zoomMinInCashFile, int zoomMaxInCashFile) { this.mIndexDatabase.execSQL("CREATE TABLE IF NOT EXISTS ListCashTables (name VARCHAR(100), lastmodified LONG NOT NULL, size LONG NOT NULL, minzoom INTEGER NOT NULL, maxzoom INTEGER NOT NULL, PRIMARY KEY(name) );"); this.mIndexDatabase.delete("ListCashTables", "lower(name) = lower('" + aCashTableName + "') OR lower(name) = lower('" + aCashTableName.replace("usermap_", "cahs_") + "')", null); final ContentValues cv = new ContentValues(); cv.put("name", aCashTableName); cv.put("lastmodified", aLastModifiedFile); cv.put("size", aSizeFile); cv.put("minzoom", zoomMinInCashFile); cv.put("maxzoom", zoomMaxInCashFile); this.mIndexDatabase.insert("ListCashTables", null, cv); } public int ZoomMaxInCashFile(final String mapid) { int ret = 24; try { final Cursor c = this.mIndexDatabase.rawQuery("SELECT maxzoom FROM ListCashTables WHERE lower(name) = lower('" + mapid + "') OR lower(name) = lower('" + mapid.replace("usermap_", "cahs_") + "')", null); if (c != null) { if (c.moveToFirst()) { ret = c.getInt(c.getColumnIndexOrThrow("maxzoom")); } c.close(); } } catch (Exception e) { } return ret; } public int ZoomMinInCashFile(final String mapid) { int ret = 0; try { final Cursor c = this.mIndexDatabase.rawQuery("SELECT minzoom FROM ListCashTables WHERE lower(name) = lower('" + mapid + "') OR lower(name) = lower('" + mapid.replace("usermap_", "cahs_") + "')", null); if (c != null) { if (c.moveToFirst()) { ret = c.getInt(c.getColumnIndexOrThrow("minzoom")); } c.close(); } } catch (Exception e) { } return ret; } private SQLiteDatabase getIndexDatabase(Context ctx) { File folder = Ut.getRMapsMainDir(ctx, "data"); if(!folder.exists()) // no sdcard // TODO ��������� ��� ��� �������� ��� �����? ���� �������� ����� �� ����� ������ ���������? return null; Ut.d("OpenStreetMapTileFilesystemProvider: Open INDEX database"); return new IndexDatabaseHelper(ctx, folder.getAbsolutePath() + INDEX_DB).getWritableDatabase(); } protected class IndexDatabaseHelper extends RSQLiteOpenHelper { public IndexDatabaseHelper(final Context context, final String name) { super(context, name, null, 3); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion < 2){ try { Ut.dd("Upgrade IndexDatabase ver."+oldVersion+" to ver."+newVersion); db.execSQL(DELETE_FROM_ListCashTables); } catch (SQLException e) { e.printStackTrace(); } } } } }