mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-08-24 14:22:40 -06:00
changed svn layout
git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
commit
263ff5f895
2665 changed files with 642923 additions and 0 deletions
231
uppsrc/SqlCtrl/SqlArray.cpp
Normal file
231
uppsrc/SqlCtrl/SqlArray.cpp
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
#include "SqlCtrl.h"
|
||||
|
||||
NAMESPACE_UPP
|
||||
|
||||
void SqlArray::Join(SqlId id, ArrayCtrl& master) {
|
||||
master.AddCtrlAt(0, *this);
|
||||
fk = id;
|
||||
}
|
||||
|
||||
void SqlArray::Join(ArrayCtrl& master) {
|
||||
Join(master.GetKeyId(), master);
|
||||
}
|
||||
|
||||
void SqlArray::Clear() {
|
||||
fkv = Null;
|
||||
lateinsert = false;
|
||||
ArrayCtrl::Clear();
|
||||
}
|
||||
|
||||
void SqlArray::Reset() {
|
||||
ArrayCtrl::Reset();
|
||||
fk = SqlId();
|
||||
}
|
||||
|
||||
bool SqlArray::CanInsert() const {
|
||||
return fk.IsNull() || !IsNull(fkv);
|
||||
}
|
||||
|
||||
bool SqlArray::PerformInsert() {
|
||||
ASSERT(IsCursor());
|
||||
SqlInsert insert(table);
|
||||
for(int i = 0; i < GetIndexCount(); i++)
|
||||
if(!GetId(i).IsNull())
|
||||
insert(GetId(i), Get(i));
|
||||
if(!fk.IsNull())
|
||||
insert(fk, fkv);
|
||||
Session().ClearError();
|
||||
Session().Begin();
|
||||
Sql cursor(Session());
|
||||
cursor * insert;
|
||||
if(OkCommit(Session(), t_("Can't insert record."))) {
|
||||
if(IsNull(Get(0)))
|
||||
Set(0, cursor.GetInsertedId());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SqlArray::PerformDelete() {
|
||||
ASSERT(IsCursor());
|
||||
Session().ClearError();
|
||||
if(IsInsert() && lateinsert) {
|
||||
lateinsert = false;
|
||||
return true;
|
||||
}
|
||||
Session().Begin();
|
||||
Sql cursor(Session());
|
||||
cursor * Delete(table)
|
||||
.Where(fk.IsNull() ? SqlId(GetKeyId()) == GetKey()
|
||||
: SqlId(GetKeyId()) == GetKey() && fk == fkv);
|
||||
|
||||
return OkCommit(Session(), t_("Can't delete record."));
|
||||
}
|
||||
|
||||
bool SqlArray::UpdateRow() {
|
||||
if(IsInsert() && lateinsert) {
|
||||
if(!PerformInsert()) return false;
|
||||
}
|
||||
else {
|
||||
SqlUpdate update(table);
|
||||
for(int i = 0; i < GetIndexCount(); i++)
|
||||
if(!GetId(i).IsNull() && IsModified(i))
|
||||
update(GetId(i), Get(i));
|
||||
if(update) {
|
||||
Session().ClearError();
|
||||
Session().Begin();
|
||||
Sql cursor(Session());
|
||||
cursor * update
|
||||
.Where(fk.IsNull() ? SqlId(GetKeyId()) == GetOriginalKey()
|
||||
: SqlId(GetKeyId()) == GetOriginalKey() && fk == fkv);
|
||||
if(!OkCommit(Session(), t_("Can't update record.")))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
lateinsert = false;
|
||||
return ArrayCtrl::UpdateRow();
|
||||
}
|
||||
|
||||
void SqlArray::RejectRow() {
|
||||
if(IsInsert())
|
||||
PerformDelete();
|
||||
ArrayCtrl::RejectRow();
|
||||
}
|
||||
|
||||
void SqlArray::StartInsert() {
|
||||
if(!CanInsert()) return;
|
||||
DoAppend();
|
||||
if(IsNull(GetKey()) && !autoinsertid)
|
||||
lateinsert = true;
|
||||
else
|
||||
PerformInsert();
|
||||
}
|
||||
|
||||
void SqlArray::StartDuplicate() {
|
||||
if(!IsCursor() || !CanInsert()) return;
|
||||
Vector<Value> v;
|
||||
int i;
|
||||
for(i = 0; i < GetIndexCount(); i++)
|
||||
v.Add(Get(i));
|
||||
if(!KillCursor()) return;
|
||||
StartInsert();
|
||||
for(i = 0; i < GetIndexCount(); i++)
|
||||
if(IsNull(Get(i)) && i < v.GetCount())
|
||||
Set(i, v[i]);
|
||||
}
|
||||
|
||||
void SqlArray::SetData(const Value& v) {
|
||||
fkv = v;
|
||||
if(fk.IsNull()) {
|
||||
CHECK(KillCursor());
|
||||
Clear();
|
||||
}
|
||||
else
|
||||
Query();
|
||||
}
|
||||
|
||||
Value SqlArray::GetData() const {
|
||||
return fkv;
|
||||
}
|
||||
|
||||
bool SqlArray::Accept() {
|
||||
bool b = ArrayCtrl::Accept();
|
||||
if(b) Ctrl::ClearModify();
|
||||
return b;
|
||||
}
|
||||
|
||||
void SqlArray::DoRemove() {
|
||||
if(!IsCursor() || IsAskRemove() && !PromptOKCancel(RowFormat(t_("Do you really want to delete the selected %s ?")))) return;
|
||||
if(PerformDelete()) {
|
||||
Remove(GetCursor());
|
||||
WhenArrayAction();
|
||||
}
|
||||
}
|
||||
|
||||
void SqlArray::StdBar(Bar& menu) {
|
||||
bool c = !IsEdit();
|
||||
bool d = c && IsCursor();
|
||||
if(IsAppending() || IsInserting())
|
||||
menu.Add(c && CanInsert(), RowFormat(t_("Insert %s")), THISBACK(StartInsert))
|
||||
.Help(RowFormat(t_("Insert a new %s into the table.")))
|
||||
.Key(K_INSERT);
|
||||
if(IsDuplicating())
|
||||
menu.Add(d && CanInsert(), RowFormat(t_("Copy %s")), THISBACK(StartDuplicate))
|
||||
.Help(RowFormat(t_("Duplicate current table %s.")))
|
||||
.Key(K_CTRL_INSERT);
|
||||
if(IsEditing())
|
||||
menu.Add(d, RowFormat(t_("Edit %s")), THISBACK(DoEdit))
|
||||
.Help(RowFormat(t_("Edit active %s.")))
|
||||
.Key(K_CTRL_ENTER);
|
||||
if(IsRemoving())
|
||||
menu.Add(d, RowFormat(t_("Delete %s\tDelete")), THISBACK(DoRemove))
|
||||
.Help(RowFormat(t_("Delete active %s.")))
|
||||
.Key(K_DELETE);
|
||||
}
|
||||
|
||||
void SqlArray::AppendQuery(SqlBool where)
|
||||
{
|
||||
lateinsert = false;
|
||||
if(fk.IsNull() || !IsNull(fkv)) {
|
||||
SqlSet cols;
|
||||
for(int i = 0; i < GetIndexCount(); i++)
|
||||
if(!GetId(i).IsNull())
|
||||
cols.Cat(SqlId(GetId(i)));
|
||||
SqlBool wh = where;
|
||||
if(!fk.IsNull())
|
||||
wh = wh && fk == fkv;
|
||||
Sql sql(Session());
|
||||
Session().ClearError();
|
||||
// AutoWaitCursor awc(querytime); // todo: Fidler -> WaitCursor
|
||||
if(IsNull(count))
|
||||
sql * UPP::Select(cols).From(table).Where(wh).OrderBy(orderby);
|
||||
else
|
||||
sql * UPP::Select(cols).From(table).Where(wh).OrderBy(orderby).Limit(count).Offset(offset);
|
||||
if(ShowError(sql)) {
|
||||
// awc.Cancel(); // todo: Fidler -> WaitCursor
|
||||
return;
|
||||
}
|
||||
for(;;) {
|
||||
Vector<Value> row;
|
||||
if(!sql.Fetch(row)) break;
|
||||
Add(row);
|
||||
}
|
||||
if(GetCount())
|
||||
if(goendpostquery)
|
||||
GoEnd();
|
||||
else
|
||||
GoBegin();
|
||||
DoColumnSort();
|
||||
WhenPostQuery();
|
||||
}
|
||||
}
|
||||
|
||||
void SqlArray::Query() {
|
||||
CHECK(KillCursor());
|
||||
ArrayCtrl::Clear();
|
||||
lateinsert = false;
|
||||
AppendQuery(where);
|
||||
}
|
||||
|
||||
void SqlArray::ReQuery()
|
||||
{
|
||||
int sc = GetScroll();
|
||||
Value key = GetKey();
|
||||
Query();
|
||||
ScrollTo(sc);
|
||||
FindSetCursor(key);
|
||||
}
|
||||
|
||||
SqlArray::SqlArray() {
|
||||
querytime = 0;
|
||||
ssn = NULL;
|
||||
WhenBar = THISBACK(StdBar);
|
||||
goendpostquery = false;
|
||||
lateinsert = false;
|
||||
autoinsertid = false;
|
||||
RowName(t_("record"));
|
||||
offset = 0;
|
||||
count = Null;
|
||||
}
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
Loading…
Add table
Add a link
Reference in a new issue