PB2Web: Mitstreiter gesucht

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
jamirokwai
Beiträge: 65
Registriert: 02.06.2008 16:10

Re: PB2Web: Mitstreiter gesucht

Beitrag von jamirokwai »

Hi Kiffi,

habe mir mal die Datenbank-Funktionen in HTML5 angeschaut - Es geht!
Es gibt eigentlich "nur" eine Einschränkung: Im HTML5-Standard muss man die maximale Datenbankgröße angeben. Das geschieht hier über die Konstante dbSize;

Edit: Diese Frage zu Arrays ist gelöst!!
Ich hänge gerade an der Funktion loaddbitems, die alle (Select abgefragten) Daten in ein Array laden soll, da ich mit JavaScript noch nicht viel gemacht habe... Frage: Wie bekomme ich Daten in ein 2-dimensionales Array. Wenn das jemand lösen könnte/würde, käme die SQLite-Sache einen großen Schritt voran!

Grüße,
J.

Code: Alles auswählen

Achtung: Der Datenbank-Zugriff in HTML5 ist asynchron. Wird CloseDatabase(); zu früh aufgerufen, wird das Datenbank-Objekt vor der Abfrage entfernt. Oder das Ergebnis liegt noch nicht vor.

To-Do:
DatabaseID
GetDatabaseBlob
CheckDatabaseNull
DatabaseColumnSize
DatabaseColumnType
IsDatabase
SetDatabaseBlob

- Datenbank-ID zurückgeben, auch mit #PB_Any (für mehrere Datenbank-Objekte)
- testen
- Rückgabe von Status und Ergebnis der einzelnen Funktionen
- testen
- eventuelle Speicherlecks finden und ausmerzen
- testen

Nicht möglich/nötig
- OpenDatabaseRequester

Bisher eingebaut
+ AffectedDatabaseRows
+ CloseDatabase
+ DatabaseColumnIndex
+ DatabaseColumnName
+ DatabaseColumns
+ DatabaseDriverDescription
+ DatabaseDriverName
+ DatabaseError
+ DatabaseQuery
+ DatabaseUpdate
+ ExamineDatabaseDrivers
+ FinishDatabaseQuery
+ FirstDatabaseRow
+ GetDatabaseDouble
+ GetDatabaseFloat
+ GetDatabaseLong
+ GetDatabaseQuad
+ GetDatabaseString
+ NextDatabaseDriver
+ NextDatabaseRow
+ OpenDatabase
+ PreviousDatabaseRow
+ UseSQLiteDatabase

Code: Alles auswählen

// UseSQLiteDatabase()

const dbSize = 5 * 1024 * 1024; // 5MB
  
function UseSQLiteDataBase() {
   SQLiteDataBase = {};
   SQLiteDataBase.webdb = {};
   SQLiteDataBase.webdb.db = null;
   SQLiteDataBase.lastError = "";
   SQLiteDataBase.currentRow = 0;
}

// Result = OpenDatabase(#Database, DatabaseName$, User$, Password$ [, Plugin])
function OpenDatabase(Database,DatabaseName,user,Password) {
  SQLiteDataBase.webdb.db = openDatabase(DatabaseName, "1.0", DatabaseName, dbSize);
  db = SQLiteDataBase.webdb.db;
  // this one is needed, to initialize the onSucces, onError-functions
  db.transaction(function(tx) { tx.executeSql("SELECT 1", [], SQLiteDataBase.webdb.onSuccess, SQLiteDataBase.webdb.onError); });
}

// Result = DatabaseUpdate(#Database, Request$)
function DatabaseUpdate(Database, Request) {
  db.transaction(function(tx) { tx.executeSql(Request, [], SQLiteDataBase.webdb.onSuccess, SQLiteDataBase.webdb.onError); });
}

// CloseDatabase(#Database)
function CloseDatabase(Database) {
   SQLiteDataBase.webdb.db = null;   
   SQLiteDataBase.webdb = null;
   SQLiteDataBase.result = null;
   SQLiteDataBase.lastError = null;
   SQLiteDataBase = null;
   db = null;
}

// Result = DatabaseQuery(#Database, Request$)
function DatabaseQuery(Database, Request) {
   SQLiteDataBase.webdb.getItems = function(renderFunc) {
        db.transaction(function(tx) { tx.executeSql(Request, [], renderFunc, SQLiteDataBase.webdb.onError); });
   }
}

// Text$ = DatabaseColumnName(#Database, Column)
function DatabaseColumnName(Database, Column) {
	var keys = Object.keys(SQLiteDataBase.result[0]);
	return keys[Column];
}

// Result = DatabaseColumnIndex(#Database, ColumnName$)
function DatabaseColumnIndex(Database, ColumnName) {
	var keys = Object.keys(SQLiteDataBase.result[0]);
	keys = keys.toString();
	keys = keys.split(",");
   for (var i=0; i < keys.length; i++) {
	   if (ColumnName == keys[i]) { return i; }
   }
}

// Result = ExamineDatabaseDrivers()
function ExamineDatabaseDrivers() {
	return 1;
}

// Result = NextDatabaseDriver()
function NextDatabaseDriver() {
	return 0;
}

// Text$ = DatabaseDriverName()
function DatabaseDriverName() {
	return "Web-SQLite.";
}

// Text$ = DatabaseDriverDescription()
function DatabaseDriverDescription() {
	return "HTML5-Database, SQLite-based.";
}

// Error$ = DatabaseError()
function DatabaseError() {
	return SQLiteDataBase.lastError;
}

// Text$ = GetDatabaseString(#Database, Column)
function GetDatabaseString(Database, Column) {
	var values = Object.keys(SQLiteDataBase.result[SQLiteDataBase.currentRow]).map(function (key) { return SQLiteDataBase.result[SQLiteDataBase.currentRow][key]; });
	return values[Column];
}

// Result.d = GetDatabaseDouble(#Database, Column)
function GetDatabaseDouble(Database, Column) {
	return parseFloat(GetDatabaseString(Database,Column));
}

// Result.f = GetDatabaseFloat(#Database, Column)
function GetDatabaseFloat(Database, Column) {
	return parseFloat(GetDatabaseString(Database,Column));
}

// Result = GetDatabaseLong(#Database, Column)
function GetDatabaseLong(Database, Column) {
	return parseInt(GetDatabaseString(Database,Column));
}

// Result = GetDatabaseQuad(#Database, Column)
function GetDatabaseQuad(Database, Column) {
	return parseInt(GetDatabaseString(Database,Column));
}

// Result = FirstDatabaseRow(#Database)
function FirstDatabaseRow(Database) {
	var count = DatabaseColumns(Database);
	if (count != 0) { SQLiteDataBase.currentRow = 0; }
	return count;
}

// Text$ = CheckDatabaseNull(#Database, Column) !!!
function CheckDatabaseNull(Database, Column) {
}

// Result = AffectedDatabaseRows(#Database)
function AffectedDatabaseRows(Database) {
	return SQLiteDataBase.result.length;
}

// Result = NextDatabaseRow(#Database)
function NextDatabaseRow(Database) {
	if (SQLiteDataBase.result.length == SQLiteDataBase.currentRow ) { return 0; }
	SQLiteDataBase.currentRow++;
}

// Result = PreviousDatabaseRow(#Database)
function PreviousDatabaseRow(Database) {
	if (SQLiteDataBase.currentRow < 1 ) { return 0; }
	SQLiteDataBase.currentRow--;
}

// FinishDatabaseQuery(#Database)
function FinishDatabaseQuery(Database) {
   SQLiteDataBase.result = null;
   SQLiteDataBase.lastError = null;
	SQLiteDataBase.currentRow = null;
}

// Result = DatabaseColumns(#Database)
function DatabaseColumns(Database) {
	var keys = Object.keys(SQLiteDataBase.result[0]);
	return keys.length;
}

// hier alle Einträge pushen
function loaddbitems(tx, rs) {
   SQLiteDataBase.result = null;
   SQLiteDataBase.result = new Array();
   for (var i=0; i < rs.rows.length; i++) { SQLiteDataBase.result.push(rs.rows.item(i)); }
}


UseSQLiteDataBase();
OpenDatabase(null,"test");
//DatabaseUpdate(null,"CREATE TABLE IF NOT EXISTS todo (ID INTEGER PRIMARY KEY ASC, todo TEXT, added_on DATETIME)");
//DatabaseUpdate(null,"INSERT INTO todo (todo, added_on) VALUES ('Hallo',1234567)");
DatabaseQuery(null,"SELECT * FROM todo");
//CloseDatabase();
setTimeout(function() {alert(typeof(GetDatabaseString(null,1)));},1000);

SQLiteDataBase.webdb.onError = function(tx, e) {
  SQLiteDataBase.lastError = e.message;
}

SQLiteDataBase.webdb.onSuccess = function(tx, r) {
  SQLiteDataBase.webdb.getItems(loaddbitems);
}
Zuletzt geändert von jamirokwai am 26.05.2013 12:43, insgesamt 2-mal geändert.
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: PB2Web: Mitstreiter gesucht

Beitrag von Derren »

jamirokwai, cool Danke für's posten. Genau sowas brauche ich gerade für ein Projekt von mir. :allright:
Signatur und so
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB2Web: Mitstreiter gesucht

Beitrag von Kiffi »

@jamirokwai: Vielen Dank für den Tipp und den Code! :allright:

Web Storage (also die SQLite-Nutzung) ist ne feine Sache. Allerdings wohl nicht für alle Browser:
http://www.mediaevent.de/javascript/web-storage.html hat geschrieben:Web SQL Storage wird von Safari 4, Chrome 4, Opera 10.5, iOS 3 und Android 2 unterstützt, aber nicht von IE und Firefox. [...]
Zurzeit stehen also nur Local Storage und Session Storage relativ zuverlässig zur Verfügung.
Grüße ... Kiffi
a²+b²=mc²
jamirokwai
Beiträge: 65
Registriert: 02.06.2008 16:10

Re: PB2Web: Mitstreiter gesucht

Beitrag von jamirokwai »

Kiffi hat geschrieben:@jamirokwai: Vielen Dank für den Tipp und den Code! :allright:

Web Storage (also die SQLite-Nutzung) ist ne feine Sache. Allerdings wohl nicht für alle Browser:
http://www.mediaevent.de/javascript/web-storage.html hat geschrieben:Web SQL Storage wird von Safari 4, Chrome 4, Opera 10.5, iOS 3 und Android 2 unterstützt, aber nicht von IE und Firefox. [...]
Zurzeit stehen also nur Local Storage und Session Storage relativ zuverlässig zur Verfügung.
Grüße ... Kiffi
Hi Kiffi,

habe natürlich gesehen, dass Du "alte" IEs unterstützen möchtest, dann ist die Web SQL-Sache nur für neuere Browser implementierbar.
Ich wollte es mal ausprobieren, da ich ja auch fürs Web entwickle. Wenn dabei weitere Funktionen für das "pb2web" rumkommen, bin ich zufrieden 8)
Und wenn sie im pb2web-Projekt genutzt werden, super!

Grüßle,
Jamirokwai
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB2Web: Mitstreiter gesucht

Beitrag von Kiffi »

jamirokwai hat geschrieben:habe natürlich gesehen, dass Du "alte" IEs unterstützen möchtest, dann ist die Web SQL-Sache nur für neuere Browser implementierbar.
nicht nur der IE. Anscheinend kann es auch der Ff nicht. Somit stehen
(zumindest in der Windows-Welt) zwei weit verbreitete Browser nicht zur Verfügung.

Deinen Code kann ich momentan nicht richtig testen und erweitern, weil ich mit
Visual Web Developer entwickle und dort der IE als Debugger-Browser eingestellt ist.
Der motzt dann immer. Aber aufgeschoben ist nicht aufgehoben :-)

@All: Eine Frage an als JS-Kundigen: Wie sähe eine Umsetzung einer
strukturierten LinkedList in JS aus?

Code: Alles auswählen

Structure sPerson
	Vorname.s
	Nachname.s
EndStructure

NewList	Person.sPerson()

AddElement(Person())
Person()\Vorname = "Peter"
Person()\Nachname = "Parker"

AddElement(Person())
Person()\Vorname = "Bruce"
Person()\Nachname = "Wayne"

ForEach Person()
	Debug Person()\Vorname
	Debug Person()\Nachname
Next
Danke im voraus & Grüße ... Kiffi
a²+b²=mc²
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: PB2Web: Mitstreiter gesucht

Beitrag von c4s »

Idee: Eventuell bietet es sich an eine entsprechende Library für JavaScript zu verwenden.

Bevor das Rad neu erfunden wird und Linkedlists (aber auch Gadgets, Bildbearbeitung usw.) selbst programmiert werden, könnte man doch einfach auf die bewährte Arbeit Anderer zurückgreifen und sich somit noch besser der eigentlichen Umsetzung dieses Projekts widmen...
Auf die Schnelle habe ich z.B. folgende Diskussion dazu gefunden: javascript data structures library
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: PB2Web: Mitstreiter gesucht

Beitrag von NicTheQuick »

Wichtig muss dabei nur bleiben, dass die Lizenzen vereinbar sein müssen. Aber ich nehme an Kiffi würde dann eh auf der GPL-Schiene arbeiten, oder?
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB2Web: Mitstreiter gesucht

Beitrag von Kiffi »

@Derren, c4s: Danke für die Links! Ich werde mich mal da durchwühlen...

@NicTheQuick: durch das ganze Lizenzen-Dickicht muss ich mich noch durcharbeiten. Ich
trage erstmal alles zusammen, was kostenlos und auch gleichzeitig kommerziell nutzbar ist.

Die Sourcen sind eh alle einsehbar. Somit besteht die Hoffnung, dass irrtümlich widerrechtlich
genutzte Libraries schnell entdeckt werden können (und dann auch zeitnah entfernt / ersetzt
werden).

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB2Web: Mitstreiter gesucht

Beitrag von Kiffi »

eine kleine Albernheit zwischendurch:

[Link entfernt]

;-)

Grüße ... Kiffi

Edit: Link entfernt. Beta-Ankündigung folgt...
Zuletzt geändert von Kiffi am 29.12.2013 20:41, insgesamt 1-mal geändert.
a²+b²=mc²
Antworten